Added plane mesh and new water node

* Changed the water actor to irrlichts built-in water surface node
* Added CreatePlaneMesh() function
This commit is contained in:
n00b
2024-10-06 21:15:58 -04:00
parent 5542629c92
commit 78cc1a983c
7 changed files with 825 additions and 1106 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -541,9 +541,6 @@ case FN_SetWindowAlwaysOnTop: //Sub Procedure
case FN_SetMouseRelative: //Sub Procedure
rc_setMouseRelative( SETMOUSERELATIVE_FLAG );
break;
case FN_SetWindowVSync: //Sub Procedure
rc_setWindowVSync( SETWINDOWVSYNC_FLAG );
break;
case FN_FlashWindow: //Number Function
rc_push_num(rc_flashWindow( FLASHWINDOW_FLAG ));
break;
@@ -557,7 +554,7 @@ case FN_CloseCanvas: //Sub Procedure
rc_canvasClose( CLOSECANVAS_C_NUM );
break;
case FN_OpenCanvas3D: //Number Function
rc_push_num(rc_canvasOpen3D( OPENCANVAS3D_W, OPENCANVAS3D_H, OPENCANVAS3D_VIEWPORT_X, OPENCANVAS3D_VIEWPORT_Y, OPENCANVAS3D_VIEWPORT_W, OPENCANVAS3D_VIEWPORT_H, OPENCANVAS3D_MODE ));
rc_push_num(rc_canvasOpen3D( OPENCANVAS3D_VIEWPORT_X, OPENCANVAS3D_VIEWPORT_Y, OPENCANVAS3D_VIEWPORT_W, OPENCANVAS3D_VIEWPORT_H, OPENCANVAS3D_MODE ));
break;
case FN_SetCanvasVisible: //Sub Procedure
rc_setCanvasVisible( SETCANVASVISIBLE_C_NUM, SETCANVASVISIBLE_FLAG );
@@ -616,8 +613,8 @@ case FN_ActiveCanvas: //Number Function
case FN_SetCanvasPhysics2D: //Sub Procedure
rc_setCanvasPhysics2D( SETCANVASPHYSICS2D_C_NUM, SETCANVASPHYSICS2D_STATE );
break;
case FN_OpenSpriteCanvas: //Number Function
rc_push_num(rc_canvasOpenSpriteLayer( OPENSPRITECANVAS_W, OPENSPRITECANVAS_H, OPENSPRITECANVAS_VIEWPORT_X, OPENSPRITECANVAS_VIEWPORT_Y, OPENSPRITECANVAS_VIEWPORT_W, OPENSPRITECANVAS_VIEWPORT_H ));
case FN_OpenCanvasSpriteLayer: //Number Function
rc_push_num(rc_canvasOpenSpriteLayer( OPENCANVASSPRITELAYER_W, OPENCANVASSPRITELAYER_H, OPENCANVASSPRITELAYER_VIEWPORT_X, OPENCANVASSPRITELAYER_VIEWPORT_Y, OPENCANVASSPRITELAYER_VIEWPORT_W, OPENCANVASSPRITELAYER_VIEWPORT_H ));
break;
case FN_Circle: //Sub Procedure
rc_drawCircle( CIRCLE_X, CIRCLE_Y, CIRCLE_RADIUS );
@@ -1397,6 +1394,9 @@ case FN_AddMeshBuffer: //Sub Procedure
case FN_LoadMeshFromArchive: //Number Function
rc_push_num(rc_loadMeshFromArchive( LOADMESHFROMARCHIVE_ARCHIVE$, LOADMESHFROMARCHIVE_MESH_FILE$ ));
break;
case FN_CreatePlaneMesh: //Number Function
rc_push_num(rc_createPlaneMesh( CREATEPLANEMESH_W, CREATEPLANEMESH_H, CREATEPLANEMESH_TILECOUNT_W, CREATEPLANEMESH_TILECOUNT_H ));
break;
case FN_CreateMeshActor: //Number Function
rc_push_num(rc_createMeshActor( CREATEMESHACTOR_MESH ));
break;
@@ -1409,8 +1409,8 @@ case FN_CreateCubeActor: //Number Function
case FN_CreateSphereActor: //Number Function
rc_push_num(rc_createSphereActor( CREATESPHEREACTOR_RADIUS ));
break;
case FN_CreateWaterPlaneActor: //Number Function
rc_push_num(rc_createWaterPlaneActor( CREATEWATERPLANEACTOR_W, CREATEWATERPLANEACTOR_H ));
case FN_CreateWaterActor: //Number Function
rc_push_num(rc_createWaterActor( CREATEWATERACTOR_MESH, CREATEWATERACTOR_WAVEHEIGHT, CREATEWATERACTOR_WAVESPEED, CREATEWATERACTOR_WAVELENGTH ));
break;
case FN_CreateLightActor: //Number Function
rc_push_num(rc_createLightActor( ));
@@ -2261,36 +2261,6 @@ case FN_SetTerrainCameraRotationDelta: //Sub Procedure
case FN_SetTerrainPatchLOD: //Sub Procedure
rc_setTerrainPatchLOD( SETTERRAINPATCHLOD_ACTOR, SETTERRAINPATCHLOD_PATCHX, SETTERRAINPATCHLOD_PATCHZ, SETTERRAINPATCHLOD_LOD );
break;
case FN_setWaterWindForce: //Sub Procedure
rc_setWaterWindForce( SETWATERWINDFORCE_ACTOR, SETWATERWINDFORCE_F );
break;
case FN_getWaterWindForce: //Number Function
rc_push_num(rc_getWaterWindForce( GETWATERWINDFORCE_ACTOR ));
break;
case FN_setWaterWaveHeight: //Sub Procedure
rc_setWaterWaveHeight( SETWATERWAVEHEIGHT_ACTOR, SETWATERWAVEHEIGHT_H );
break;
case FN_getWaterWaveHeight: //Number Function
rc_push_num(rc_getWaterWaveHeight( GETWATERWAVEHEIGHT_ACTOR ));
break;
case FN_setWaterWindDirection: //Sub Procedure
rc_setWaterWindDirection( SETWATERWINDDIRECTION_ACTOR, SETWATERWINDDIRECTION_X, SETWATERWINDDIRECTION_Z );
break;
case FN_getWaterWindDirection: //Sub Procedure
rc_getWaterWindDirection( GETWATERWINDDIRECTION_ACTOR, &GETWATERWINDDIRECTION_X, &GETWATERWINDDIRECTION_Z );
break;
case FN_setWaterColor: //Sub Procedure
rc_setWaterColor( SETWATERCOLOR_ACTOR, SETWATERCOLOR_C );
break;
case FN_getWaterColor: //Number Function
rc_push_num(rc_getWaterColor( GETWATERCOLOR_ACTOR ));
break;
case FN_setWaterColorBlendFactor: //Sub Procedure
rc_setWaterColorBlendFactor( SETWATERCOLORBLENDFACTOR_ACTOR, SETWATERCOLORBLENDFACTOR_CBFACTOR );
break;
case FN_getWaterColorBlendFactor: //Number Function
rc_push_num(rc_getWaterColorBlendFactor( GETWATERCOLORBLENDFACTOR_ACTOR ));
break;
case FN_SetActorAnimation: //Sub Procedure
rc_setActorAnimation( SETACTORANIMATION_ACTOR, SETACTORANIMATION_START_FRAME, SETACTORANIMATION_END_FRAME );
break;

View File

@@ -125,6 +125,25 @@ int rc_createMesh()
return mesh_id;
}
int rc_createPlaneMesh(double w, double h, double tileCount_w, double tileCount_h)
{
irr::scene::IAnimatedMesh* mesh = SceneManager->addHillPlaneMesh( "plane",
irr::core::dimension2d<irr::f32>(w/tileCount_w, h/tileCount_h),
irr::core::dimension2d<irr::u32>(tileCount_w, tileCount_h));
if(!mesh)
return -1;
int mesh_id = rc_mesh.size();
rc_mesh_obj mesh_obj;
mesh_obj.mesh = mesh;
mesh_obj.mesh_type = RC_MESH_TYPE_ANIMATED;
rc_mesh.push_back(mesh_obj);
return mesh_id;
}
//create mesh from geometry data [TODO]
bool rc_addMeshBuffer(int mesh_id, int vertex_count, double* vertex_data, double* normal_data, double* uv_data, int index_count, double* index_data)
@@ -734,10 +753,18 @@ int rc_createSphereActor(double radius)
}
//add mesh actor to scene
int rc_createWaterPlaneActor(double w, double h)
int rc_createWaterActor(int mesh_id, double waveHeight, double waveSpeed, double waveLength)
{
int actor_id = -1;
RealisticWaterSceneNode* node = new RealisticWaterSceneNode(SceneManager, w, h);
if(mesh_id < 0 || mesh_id >= rc_mesh.size())
return -1;
if(!rc_mesh[mesh_id].mesh)
return -1;
irr::scene::ISceneNode* node = SceneManager->addWaterSurfaceSceneNode(rc_mesh[mesh_id].mesh, waveHeight, waveSpeed, waveLength);
rc_scene_node actor;
actor.node_type = RC_NODE_TYPE_WATER;
actor.mesh_node = node;
@@ -887,154 +914,6 @@ void rc_deleteActor(int actor_id)
rc_actor[actor_id].material_ref_index = -1;
}
void rc_setWaterWindForce(int actor, double f)
{
if(actor < 0 || actor >= rc_actor.size())
return;
switch(rc_actor[actor].node_type)
{
case RC_NODE_TYPE_WATER:
RealisticWaterSceneNode* water = (RealisticWaterSceneNode*)rc_actor[actor].mesh_node;
water->setWindForce(f);
}
}
double rc_getWaterWindForce(int actor)
{
if(actor < 0 || actor >= rc_actor.size())
return 0;
switch(rc_actor[actor].node_type)
{
case RC_NODE_TYPE_WATER:
RealisticWaterSceneNode* water = (RealisticWaterSceneNode*)rc_actor[actor].mesh_node;
return water->getWindForce();
}
return 0;
}
void rc_setWaterWaveHeight(int actor, double h)
{
if(actor < 0 || actor >= rc_actor.size())
return;
switch(rc_actor[actor].node_type)
{
case RC_NODE_TYPE_WATER:
RealisticWaterSceneNode* water = (RealisticWaterSceneNode*)rc_actor[actor].mesh_node;
water->setWaveHeight(h);
}
}
double rc_getWaterWaveHeight(int actor)
{
if(actor < 0 || actor >= rc_actor.size())
return 0;
switch(rc_actor[actor].node_type)
{
case RC_NODE_TYPE_WATER:
RealisticWaterSceneNode* water = (RealisticWaterSceneNode*)rc_actor[actor].mesh_node;
return water->getWaveHeight();
}
return 0;
}
void rc_setWaterWindDirection(int actor, double x, double z)
{
if(actor < 0 || actor >= rc_actor.size())
return;
switch(rc_actor[actor].node_type)
{
case RC_NODE_TYPE_WATER:
RealisticWaterSceneNode* water = (RealisticWaterSceneNode*)rc_actor[actor].mesh_node;
water->setWindDirection( irr::core::vector2df(x, z));
}
}
void rc_getWaterWindDirection(int actor, double* x, double* z)
{
if(actor < 0 || actor >= rc_actor.size())
return;
*x = 0;
*z = 0;
switch(rc_actor[actor].node_type)
{
case RC_NODE_TYPE_WATER:
RealisticWaterSceneNode* water = (RealisticWaterSceneNode*)rc_actor[actor].mesh_node;
irr::core::vector2df v = water->getWindDirection();
*x = v.X;
*z = v.Y;
}
}
void rc_setWaterColor(int actor, Uint32 c)
{
if(actor < 0 || actor >= rc_actor.size())
return;
switch(rc_actor[actor].node_type)
{
case RC_NODE_TYPE_WATER:
RealisticWaterSceneNode* water = (RealisticWaterSceneNode*)rc_actor[actor].mesh_node;
irr::video::SColor color;
color.set(c);
SColorf cf(color);
water->setWaterColor( cf );
}
}
irr::u32 rc_getWaterColor(int actor)
{
if(actor < 0 || actor >= rc_actor.size())
return 0;
switch(rc_actor[actor].node_type)
{
case RC_NODE_TYPE_WATER:
RealisticWaterSceneNode* water = (RealisticWaterSceneNode*)rc_actor[actor].mesh_node;
irr::video::SColorf color = water->getWaterColor();
return color.toSColor().color;
}
return 0;
}
void rc_setWaterColorBlendFactor(int actor, double cbfactor)
{
if(actor < 0 || actor >= rc_actor.size())
return;
switch(rc_actor[actor].node_type)
{
case RC_NODE_TYPE_WATER:
RealisticWaterSceneNode* water = (RealisticWaterSceneNode*)rc_actor[actor].mesh_node;
water->setColorBlendFactor(cbfactor);
}
}
double rc_getWaterColorBlendFactor(int actor)
{
if(actor < 0 || actor >= rc_actor.size())
return 0;
switch(rc_actor[actor].node_type)
{
case RC_NODE_TYPE_WATER:
RealisticWaterSceneNode* water = (RealisticWaterSceneNode*)rc_actor[actor].mesh_node;
return water->getColorBlendFactor();
}
return 0;
}
//set actor texture
void rc_setActorTexture(int actor, int layer, int image_id)