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

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)