diff --git a/rcbasic_runtime/rc_base_actor.h b/rcbasic_runtime/rc_base_actor.h index 66f515d..9b533de 100755 --- a/rcbasic_runtime/rc_base_actor.h +++ b/rcbasic_runtime/rc_base_actor.h @@ -839,6 +839,8 @@ int rc_createProjectorActor() rc_setActorCollisionShape(actor_id, RC_NODE_SHAPE_TYPE_BOX, 1); + rc_projector_actors.push_back(actor_id); + return actor_id; } @@ -851,6 +853,18 @@ void rc_deleteActor(int actor_id) if(!rc_actor[actor_id].mesh_node) return; + if(rc_actor[actor_id].node_type == RC_NODE_TYPE_PROJECTOR) + { + for(int i = 0; i < rc_projector_actors.size(); i++) + { + if(rc_projector_actors[i] == actor_id) + { + rc_projector_actors.erase(i); + break; + } + } + } + if(rc_actor[actor_id].physics.rigid_body) rc_physics3D.world->removeCollisionObject(rc_actor[actor_id].physics.rigid_body, false); diff --git a/rcbasic_runtime/rc_gfx.h b/rcbasic_runtime/rc_gfx.h index 634e79f..eb82faa 100644 --- a/rcbasic_runtime/rc_gfx.h +++ b/rcbasic_runtime/rc_gfx.h @@ -1743,7 +1743,7 @@ struct CircleSettings f32 radius; // in pixels f32 radius2; video::SColor color; - u32 numVertices = 21; // including center + u32 numVertices = 121; // including center }; void makeCircle(irr::core::array& vertices, irr::core::array& indices, const CircleSettings& settings) diff --git a/rcbasic_runtime/rc_gfx_core.h b/rcbasic_runtime/rc_gfx_core.h index aab8d14..ad960ae 100755 --- a/rcbasic_runtime/rc_gfx_core.h +++ b/rcbasic_runtime/rc_gfx_core.h @@ -639,7 +639,7 @@ struct rc_scene_node }; irr::core::array rc_actor; - +irr::core::array rc_projector_actors; irr::core::array rc_transition_actor; diff --git a/rcbasic_runtime/rc_render_control.h b/rcbasic_runtime/rc_render_control.h index 8624421..29fb377 100644 --- a/rcbasic_runtime/rc_render_control.h +++ b/rcbasic_runtime/rc_render_control.h @@ -155,6 +155,23 @@ void rc_pipeline_Render() SceneManager->drawAll(); + for(int p_actor = 0; p_actor < rc_projector_actors.size(); p_actor++) + { + int actor_id = rc_projector_actors[p_actor]; + + if(actor_id < 0 || actor_id >= rc_actor.size()) + continue; + + if(!rc_actor[actor_id].mesh_node) + continue; + + if(rc_actor[actor_id].mesh_node->isVisible()) + { + CProjectiveTextures* pt_node = (CProjectiveTextures*)rc_actor[actor_id].mesh_node; + pt_node->render(); + } + } + //render post effects for(int effect_num = 0; effect_num < rc_canvas[rc_active_canvas].post_effect.size(); effect_num++) { diff --git a/rcbasic_runtime/rc_scene.h b/rcbasic_runtime/rc_scene.h index 67bdca0..40232e0 100755 --- a/rcbasic_runtime/rc_scene.h +++ b/rcbasic_runtime/rc_scene.h @@ -86,6 +86,8 @@ void rc_clearScene() } } + rc_projector_actors.clear(); + for(int i = 0; i < rc_actor.size(); i++) { if(rc_actor[i].mesh_node) diff --git a/rcbasic_runtime/rc_windowclose.h b/rcbasic_runtime/rc_windowclose.h index ff877e5..d16f3b9 100755 --- a/rcbasic_runtime/rc_windowclose.h +++ b/rcbasic_runtime/rc_windowclose.h @@ -585,6 +585,23 @@ bool rc_update() SceneManager->drawAll(); + for(int p_actor = 0; p_actor < rc_projector_actors.size(); p_actor++) + { + int actor_id = rc_projector_actors[p_actor]; + + if(actor_id < 0 || actor_id >= rc_actor.size()) + continue; + + if(!rc_actor[actor_id].mesh_node) + continue; + + if(rc_actor[actor_id].mesh_node->isVisible()) + { + CProjectiveTextures* pt_node = (CProjectiveTextures*)rc_actor[actor_id].mesh_node; + pt_node->render(); + } + } + //render post effects for(int effect_num = 0; effect_num < rc_canvas[rc_active_canvas].post_effect.size(); effect_num++) {