Fixed Shadow Rendering

* Fixed Shadow rendering
* Added MakePlanarTextureMap, ReCalculateMeshNormals, GetMeshPolygonCount, and FlipMeshSurfaces
This commit is contained in:
n00b87
2025-09-29 01:20:51 -05:00
parent d63195de3b
commit 715098d200
39 changed files with 1256 additions and 407 deletions

View File

@@ -4398,7 +4398,7 @@ int main(int argc, char * argv[])
if(rc_filename.compare("--version")==0)
{
cout << "RCBASIC Runtime v4.5" << endl;
cout << "RCBASIC Runtime v4.6" << endl;
return 0;
}
@@ -4452,7 +4452,7 @@ int main(int argc, char * argv[])
//ogles2 test
#ifdef RC_TESTING
rc_intern_dirChange("/home/n00b/Projects/SerenityEngine/Untitled_Project/test");
rc_intern_dirChange("/home/n00b/GameDev/Irrlicht Demo");
//rc_intern_dirChange("");
rc_filename = "main.cbc";

View File

@@ -83,6 +83,11 @@ void rc_setActorCollisionShape(int actor_id, int shape_type, double mass)
irr::scene::IAnimatedMeshSceneNode* node = (irr::scene::IAnimatedMeshSceneNode*)rc_actor[actor_id].mesh_node;
shape = new ICapsuleShape(node, mass, false);
}
else if(rc_actor[actor_id].node_type == RC_NODE_TYPE_STMESH)
{
irr::scene::IMeshSceneNode* node = (irr::scene::IMeshSceneNode*)rc_actor[actor_id].mesh_node;
shape = new ICapsuleShape(node, mass, false);
}
else if(rc_actor[actor_id].node_type == RC_NODE_TYPE_OTMESH)
{
irr::scene::IOctreeSceneNode* node = (irr::scene::IOctreeSceneNode*)rc_actor[actor_id].mesh_node;
@@ -93,6 +98,10 @@ void rc_setActorCollisionShape(int actor_id, int shape_type, double mass)
irr::scene::ITerrainSceneNode* node = (irr::scene::ITerrainSceneNode*)rc_actor[actor_id].mesh_node;
shape = new ICapsuleShape(node, mass, false);
}
else
{
shape = new ICapsuleShape(rc_actor[actor_id].mesh_node, mass, false);
}
rc_actor[actor_id].physics.rigid_body = rc_physics3D.world->addRigidBody(shape);
@@ -121,6 +130,11 @@ void rc_setActorCollisionShape(int actor_id, int shape_type, double mass)
irr::scene::IAnimatedMeshSceneNode* node = (irr::scene::IAnimatedMeshSceneNode*)rc_actor[actor_id].mesh_node;
shape = new IBvhTriangleMeshShape(rc_actor[actor_id].mesh_node, node->getMesh(), mass);
}
else if(rc_actor[actor_id].node_type == RC_NODE_TYPE_STMESH)
{
irr::scene::IMeshSceneNode* node = (irr::scene::IMeshSceneNode*)rc_actor[actor_id].mesh_node;
shape = new IBvhTriangleMeshShape(rc_actor[actor_id].mesh_node, node->getMesh(), mass);
}
else if(rc_actor[actor_id].node_type == RC_NODE_TYPE_OTMESH)
{
irr::scene::IOctreeSceneNode* node = (irr::scene::IOctreeSceneNode*)rc_actor[actor_id].mesh_node;
@@ -150,6 +164,11 @@ void rc_setActorCollisionShape(int actor_id, int shape_type, double mass)
irr::scene::IAnimatedMeshSceneNode* node = (irr::scene::IAnimatedMeshSceneNode*)rc_actor[actor_id].mesh_node;
shape = new IConvexHullShape(rc_actor[actor_id].mesh_node, node->getMesh(), mass);
}
else if(rc_actor[actor_id].node_type == RC_NODE_TYPE_STMESH)
{
irr::scene::IMeshSceneNode* node = (irr::scene::IMeshSceneNode*)rc_actor[actor_id].mesh_node;
shape = new IConvexHullShape(rc_actor[actor_id].mesh_node, node->getMesh(), mass);
}
else if(rc_actor[actor_id].node_type == RC_NODE_TYPE_OTMESH)
{
irr::scene::IOctreeSceneNode* node = (irr::scene::IOctreeSceneNode*)rc_actor[actor_id].mesh_node;
@@ -524,7 +543,7 @@ int rc_createCubeActor(double cube_size)
int actor_id = -1;
irr::scene::IMeshSceneNode* node = SceneManager->addCubeSceneNode(cube_size);
rc_scene_node actor;
actor.node_type = RC_NODE_TYPE_MESH;
actor.node_type = RC_NODE_TYPE_STMESH;
actor.mesh_node = node;
#if defined(__ANDROID__)
@@ -574,7 +593,7 @@ int rc_createSphereActor(double radius)
int actor_id = -1;
irr::scene::IMeshSceneNode* node = SceneManager->addSphereSceneNode(radius);
rc_scene_node actor;
actor.node_type = RC_NODE_TYPE_MESH;
actor.node_type = RC_NODE_TYPE_STMESH;
actor.mesh_node = node;
#if defined(__ANDROID__)
@@ -1106,14 +1125,35 @@ void rc_addActorShadow(int actor)
switch(rc_actor[actor].node_type)
{
case RC_NODE_TYPE_TERRAIN:
case RC_NODE_TYPE_OTMESH:
{
irr::scene::IOctreeSceneNode* node = (irr::scene::IOctreeSceneNode*)rc_actor[actor].mesh_node;
if(!rc_actor[actor].shadow)
{
rc_actor[actor].shadow = node->addShadowVolumeSceneNode();
}
}
break;
case RC_NODE_TYPE_STMESH:
case RC_NODE_TYPE_MESH:
{
irr::scene::IMeshSceneNode* node = (irr::scene::IMeshSceneNode*)rc_actor[actor].mesh_node;
if(!rc_actor[actor].shadow)
rc_actor[actor].shadow = node->addShadowVolumeSceneNode();
break;
{
rc_actor[actor].shadow = node->addShadowVolumeSceneNode();
}
}
break;
case RC_NODE_TYPE_MESH:
{
irr::scene::IAnimatedMeshSceneNode* node = (irr::scene::IAnimatedMeshSceneNode*)rc_actor[actor].mesh_node;
if(!rc_actor[actor].shadow)
{
rc_actor[actor].shadow = node->addShadowVolumeSceneNode();
}
}
break;
}
}
@@ -1127,7 +1167,6 @@ void rc_removeActorShadow(int actor)
switch(rc_actor[actor].node_type)
{
case RC_NODE_TYPE_TERRAIN:
case RC_NODE_TYPE_OTMESH:
case RC_NODE_TYPE_STMESH:
case RC_NODE_TYPE_MESH:

File diff suppressed because it is too large Load Diff

View File

@@ -2093,6 +2093,18 @@ case FN_GetMeshBoundingBox: //Sub Procedure
case FN_ReCalculateMeshBoundingBox: //Sub Procedure
rc_reCalculateMeshBoundingBox( RECALCULATEMESHBOUNDINGBOX_MESH );
break;
case FN_MakePlanarTextureMap: //Sub Procedure
rc_makePlanarTextureMap( MAKEPLANARTEXTUREMAP_MESH, MAKEPLANARTEXTUREMAP_RESOLUTION );
break;
case FN_ReCalculateMeshNormals: //Sub Procedure
rc_reCalculateMeshNormals( RECALCULATEMESHNORMALS_MESH );
break;
case FN_GetMeshPolygonCount: //Number Function
rc_push_num(rc_getMeshPolygonCount( GETMESHPOLYGONCOUNT_MESH ));
break;
case FN_FlipMeshSurfaces: //Sub Procedure
rc_flipMeshSurfaces( FLIPMESHSURFACES_MESH );
break;
case FN_CreateAnimatedActor: //Number Function
rc_push_num(rc_createAnimatedActor( CREATEANIMATEDACTOR_MESH ));
break;

View File

@@ -267,6 +267,93 @@ void setMouseScaling()
}
}
SDL_Window* createWindow(irr::SIrrlichtCreationParameters CreationParams, std::string title, int x, int y, int Width, int Height, uint32_t SDL_Flags, irr::u8 AntiAlias, bool stencil_buffer, bool vsync)
{
SDL_Window* window = NULL;
if (CreationParams.DriverType == irr::video::EDT_OPENGL || CreationParams.DriverType == irr::video::EDT_OGLES2 || CreationParams.DriverType == irr::video::EDT_WEBGL1)
{
if(stencil_buffer)
{
//std::cout << "Set Stencil Size" << std::endl;
SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE, 8);
}
if(CreationParams.DriverType == irr::video::EDT_OPENGL)
{
SDL_GL_SetAttribute( SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE );
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 1);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 2);
}
if(CreationParams.DriverType == irr::video::EDT_OGLES2 || CreationParams.DriverType == irr::video::EDT_WEBGL1)
{
SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_ES);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 2);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 0);
}
if (CreationParams.Bits==16)
{
SDL_GL_SetAttribute( SDL_GL_RED_SIZE, 4 );
SDL_GL_SetAttribute( SDL_GL_GREEN_SIZE, 4 );
SDL_GL_SetAttribute( SDL_GL_BLUE_SIZE, 4 );
SDL_GL_SetAttribute( SDL_GL_ALPHA_SIZE, CreationParams.WithAlphaChannel?1:0 );
}
else
{
SDL_GL_SetAttribute( SDL_GL_RED_SIZE, 8 );
SDL_GL_SetAttribute( SDL_GL_GREEN_SIZE, 8 );
SDL_GL_SetAttribute( SDL_GL_BLUE_SIZE, 8 );
SDL_GL_SetAttribute( SDL_GL_ALPHA_SIZE, CreationParams.WithAlphaChannel ? 8 : 0 );
}
SDL_GL_SetAttribute( SDL_GL_DEPTH_SIZE, CreationParams.ZBufferBits);
if (CreationParams.Doublebuffer)
SDL_GL_SetAttribute( SDL_GL_DOUBLEBUFFER, 1 );
if (CreationParams.Stereobuffer)
SDL_GL_SetAttribute( SDL_GL_STEREO, 1 );
if (CreationParams.AntiAlias>1)
{
SDL_GL_SetAttribute( SDL_GL_MULTISAMPLEBUFFERS, 1 );
SDL_GL_SetAttribute( SDL_GL_MULTISAMPLESAMPLES, CreationParams.AntiAlias );
}
if ( !window )
window = SDL_CreateWindow(title.c_str(), x, y, Width, Height, SDL_Flags);
if ( !window && CreationParams.AntiAlias>1)
{
while (--CreationParams.AntiAlias>1)
{
SDL_GL_SetAttribute( SDL_GL_MULTISAMPLESAMPLES, CreationParams.AntiAlias );
window = SDL_CreateWindow(title.c_str(), x, y, Width, Height, SDL_Flags);
if (window)
break;
}
if ( !window )
{
SDL_GL_SetAttribute( SDL_GL_MULTISAMPLEBUFFERS, 0 );
SDL_GL_SetAttribute( SDL_GL_MULTISAMPLESAMPLES, 0 );
window = SDL_CreateWindow(title.c_str(), x, y, Width, Height, SDL_Flags);
if (window)
std::cout << "AntiAliasing disabled due to lack of support!" << std::endl;
}
}
}
else if ( !window )
window = SDL_CreateWindow("", x, y, Width, Height, SDL_Flags);
if ( !window && CreationParams.Doublebuffer)
{
// Try single buffer
if (CreationParams.DriverType == irr::video::EDT_OPENGL || CreationParams.DriverType == irr::video::EDT_OGLES2)
SDL_GL_SetAttribute( SDL_GL_DOUBLEBUFFER, 1 );
//SDL_Flags &= ~SDL_DOUBLEBUF;
window = SDL_CreateWindow(title.c_str(), x, y, Width, Height, SDL_Flags);
}
return window;
}
bool rc_windowOpenEx(std::string title, int x, int y, int w, int h, uint32_t window_flags, irr::u8 AntiAlias, bool stencil_buffer, bool vsync)
{
if(rc_window)
@@ -291,12 +378,6 @@ bool rc_windowOpenEx(std::string title, int x, int y, int w, int h, uint32_t win
rc_window_size.Width = w;
rc_window_size.Height = h;
rc_window = SDL_CreateWindow(title.c_str(), x, y, w, h, flags);
//Get the actual size of the window to set the dimensions of the device
if(rc_window)
SDL_GetWindowSize(rc_window, &w, &h);
SIrrlichtCreationParameters irr_creation_params;
irr_creation_params.DeviceType = EIDT_SDL;
#if defined(RC_DRIVER_GLES2)
@@ -304,8 +385,6 @@ bool rc_windowOpenEx(std::string title, int x, int y, int w, int h, uint32_t win
#else
irr_creation_params.DriverType = video::EDT_OPENGL;
#endif // defined
irr_creation_params.WindowId = rc_window;
irr_creation_params.WindowSize = dimension2d<u32>((u32)w, (u32)h);
irr_creation_params.Bits = 16;
irr_creation_params.Fullscreen = fullscreen;
irr_creation_params.Stencilbuffer = stencil_buffer;
@@ -317,6 +396,17 @@ bool rc_windowOpenEx(std::string title, int x, int y, int w, int h, uint32_t win
rc_window_setfps = vsync;
rc_window = createWindow(irr_creation_params, title.c_str(), x, y, w, h, flags, AntiAlias, stencil_buffer, vsync);
//Get the actual size of the window to set the dimensions of the device
if(rc_window)
SDL_GetWindowSize(rc_window, &w, &h);
irr_creation_params.WindowId = rc_window;
irr_creation_params.WindowSize = dimension2d<u32>((u32)w, (u32)h);
device = createDeviceEx(irr_creation_params);
if(vsync)
{
SDL_DisplayMode dm;
@@ -325,8 +415,6 @@ bool rc_windowOpenEx(std::string title, int x, int y, int w, int h, uint32_t win
rc_setfps_timer = SDL_GetTicks();
}
device = createDeviceEx(irr_creation_params);
if (!device)
{

View File

@@ -118,6 +118,55 @@ void rc_reCalculateMeshBoundingBox(int mesh_id)
}
}
void rc_reCalculateMeshNormals(int mesh_id)
{
if(mesh_id < 0 || mesh_id >= rc_mesh.size())
return;
if(rc_mesh[mesh_id].mesh)
{
for(int i = 0; i < rc_mesh[mesh_id].mesh->getMeshBufferCount(); i++)
SceneManager->getMeshManipulator()->recalculateNormals(rc_mesh[mesh_id].mesh->getMeshBuffer(i));
}
}
void rc_makePlanarTextureMap(int mesh_id, double resolution)
{
if(mesh_id < 0 || mesh_id >= rc_mesh.size())
return;
if(rc_mesh[mesh_id].mesh)
{
for(int i = 0; i < rc_mesh[mesh_id].mesh->getMeshBufferCount(); i++)
SceneManager->getMeshManipulator()->makePlanarTextureMapping(rc_mesh[mesh_id].mesh->getMeshBuffer(i), resolution);
}
}
int rc_getMeshPolygonCount(int mesh_id)
{
if(mesh_id < 0 || mesh_id >= rc_mesh.size())
return 0;
if(rc_mesh[mesh_id].mesh)
{
if(rc_mesh[mesh_id].mesh_type == RC_MESH_TYPE_ANIMATED)
return SceneManager->getMeshManipulator()->getPolyCount((irr::scene::IAnimatedMesh*)rc_mesh[mesh_id].mesh);
else
return SceneManager->getMeshManipulator()->getPolyCount(rc_mesh[mesh_id].mesh);
}
}
void rc_flipMeshSurfaces(int mesh_id)
{
if(mesh_id < 0 || mesh_id >= rc_mesh.size())
return;
if(rc_mesh[mesh_id].mesh)
{
SceneManager->getMeshManipulator()->flipSurfaces(rc_mesh[mesh_id].mesh);
}
}
int rc_loadAN8(std::string an8_file)

View File

@@ -46,7 +46,7 @@
//FOR TESTING PURPOSES
#ifdef RC_TESTING
#define RC_DRIVER_GLES2
//#define RC_DRIVER_GLES2
#endif // RC_TESTING
#define RC_PI 3.14159265359