#ifndef RC_BASE_ACTOR_H_INCLUDED #define RC_BASE_ACTOR_H_INCLUDED #include "ProjectiveTextures.h" void setSolidProperties(int actor) { if(!rc_actor[actor].physics.isSolid) { rc_actor[actor].physics.gravity = rc_actor[actor].physics.rigid_body->getGravity(); rc_actor[actor].physics.rigid_body->setGravity(irr::core::vector3df(0,0,0)); rc_actor[actor].physics.rigid_body->setCollisionFlags( ECollisionFlag::ECF_NO_CONTACT_RESPONSE ); } else { //rc_actor[actor].physics.rigid_body->setGravity(rc_actor[actor].physics.gravity); } } void rc_setActorCollisionShape(int actor_id, int shape_type, double mass) { //std::cout << "Start ColShape" << std::endl; if(rc_actor[actor_id].physics.rigid_body) { rc_physics3D.world->removeCollisionObject(rc_actor[actor_id].physics.rigid_body, false); delete rc_actor[actor_id].physics.rigid_body; } rc_actor[actor_id].physics.rigid_body = NULL; rc_actor[actor_id].physics.mass = mass; if(!rc_actor[actor_id].physics.isSolid) mass = 1; //std::cout << "NEXT" << std::endl; switch(shape_type) { case RC_NODE_SHAPE_TYPE_NONE: break; case RC_NODE_SHAPE_TYPE_BOX: { rc_actor[actor_id].physics.shape_type = RC_NODE_SHAPE_TYPE_BOX; IBoxShape* shape = new IBoxShape(rc_actor[actor_id].mesh_node, mass, false); rc_actor[actor_id].physics.rigid_body = rc_physics3D.world->addRigidBody(shape); setSolidProperties(actor_id); } break; case RC_NODE_SHAPE_TYPE_SPHERE: { rc_actor[actor_id].physics.shape_type = RC_NODE_SHAPE_TYPE_SPHERE; ISphereShape* shape = new ISphereShape(rc_actor[actor_id].mesh_node, mass, false); rc_actor[actor_id].physics.rigid_body = rc_physics3D.world->addRigidBody(shape); setSolidProperties(actor_id); } break; case RC_NODE_SHAPE_TYPE_CYLINDER: { rc_actor[actor_id].physics.shape_type = RC_NODE_SHAPE_TYPE_CYLINDER; ICylinderShape* shape = new ICylinderShape(rc_actor[actor_id].mesh_node, mass, false); rc_actor[actor_id].physics.rigid_body = rc_physics3D.world->addRigidBody(shape); setSolidProperties(actor_id); } break; case RC_NODE_SHAPE_TYPE_CAPSULE: { //std::cout << "CAPSULE" << std::endl; rc_actor[actor_id].physics.shape_type = RC_NODE_SHAPE_TYPE_CAPSULE; ICapsuleShape* shape; if(rc_actor[actor_id].node_type == RC_NODE_TYPE_MESH) { 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_OTMESH) { irr::scene::IOctreeSceneNode* node = (irr::scene::IOctreeSceneNode*)rc_actor[actor_id].mesh_node; shape = new ICapsuleShape(node, mass, false); } else if(rc_actor[actor_id].node_type == RC_NODE_TYPE_TERRAIN) { irr::scene::ITerrainSceneNode* node = (irr::scene::ITerrainSceneNode*)rc_actor[actor_id].mesh_node; shape = new ICapsuleShape(node, mass, false); } rc_actor[actor_id].physics.rigid_body = rc_physics3D.world->addRigidBody(shape); setSolidProperties(actor_id); } break; case RC_NODE_SHAPE_TYPE_CONE: { rc_actor[actor_id].physics.shape_type = RC_NODE_SHAPE_TYPE_CONE; IConeShape* shape = new IConeShape(rc_actor[actor_id].mesh_node, mass, false); rc_actor[actor_id].physics.rigid_body = rc_physics3D.world->addRigidBody(shape); setSolidProperties(actor_id); } break; case RC_NODE_SHAPE_TYPE_TRIMESH: { rc_actor[actor_id].physics.shape_type = RC_NODE_SHAPE_TYPE_TRIMESH; IBvhTriangleMeshShape* shape; if(rc_actor[actor_id].node_type == RC_NODE_TYPE_MESH) { 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_OTMESH) { irr::scene::IOctreeSceneNode* node = (irr::scene::IOctreeSceneNode*)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_TERRAIN) { irr::scene::ITerrainSceneNode* node = (irr::scene::ITerrainSceneNode*)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_WATER) //shape = new IBvhTriangleMeshShape(rc_actor[actor_id].mesh_node, (irr::scene::IAnimatedMeshSceneNode*)rc_actor[actor_id].mesh_node->getMesh(), mass); rc_actor[actor_id].physics.rigid_body = rc_physics3D.world->addRigidBody(shape); setSolidProperties(actor_id); } break; case RC_NODE_SHAPE_TYPE_CONVEXHULL: { rc_actor[actor_id].physics.shape_type = RC_NODE_SHAPE_TYPE_CONVEXHULL; IConvexHullShape* shape; if(rc_actor[actor_id].node_type == RC_NODE_TYPE_MESH) { 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_OTMESH) { irr::scene::IOctreeSceneNode* node = (irr::scene::IOctreeSceneNode*)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_TERRAIN) { irr::scene::ITerrainSceneNode* node = (irr::scene::ITerrainSceneNode*)rc_actor[actor_id].mesh_node; shape = new IConvexHullShape(rc_actor[actor_id].mesh_node, node->getMesh(), mass); } rc_actor[actor_id].physics.rigid_body = rc_physics3D.world->addRigidBody(shape); setSolidProperties(actor_id); } break; default: std::cout << "SetActorShape Error: Invalid shape_type parameter" << std::endl; } if(rc_actor[actor_id].physics.rigid_body) { rc_actor[actor_id].physics.rigid_body->getIdentification()->setId(actor_id); rc_actor[actor_id].physics.rigid_body->getPointer()->setActivationState(ACTIVE_TAG); rc_actor[actor_id].physics.rigid_body->getPointer()->setActivationState(DISABLE_DEACTIVATION); rc_actor[actor_id].physics.rigid_body->getPointer()->updateInertiaTensor(); } } void rc_setActorSleepState(int actor, int state) { if(actor < 0 || actor >= rc_actor.size()) return; if(rc_actor[actor].physics.rigid_body) { rc_actor[actor].physics.rigid_body->getPointer()->forceActivationState(state); } } int rc_getActorCollisionShape(int actor) { if(actor < 0 || actor >= rc_actor.size()) return 0; if(!rc_actor[actor].mesh_node) return 0; return rc_actor[actor].physics.shape_type; } void rc_setActorSolid(int actor_id, bool flag) { if(actor_id < 0 || actor_id >= rc_actor.size()) return; if(!rc_actor[actor_id].mesh_node) return; if(flag != rc_actor[actor_id].physics.isSolid) { rc_actor[actor_id].physics.isSolid = flag; rc_setActorCollisionShape(actor_id, rc_actor[actor_id].physics.shape_type, rc_actor[actor_id].physics.mass); } } bool rc_actorIsSolid(int actor_id) { if(actor_id < 0 || actor_id >= rc_actor.size()) return false; if(!rc_actor[actor_id].mesh_node) return false; return rc_actor[actor_id].physics.isSolid; } bool rc_actorExists(int actor_id) { if(actor_id < 0 || actor_id >= rc_actor.size()) return false; return (rc_actor[actor_id].node_type > 0); } bool rc_getActorCollision(int actor1, int actor2) { for(int i = 0; i < rc_actor[actor1].physics.collisions.size(); i++) { int c_index = rc_actor[actor1].physics.collisions[i]; int actorA = rc_collisions[c_index].actorA; int actorB = rc_collisions[c_index].actorB; if(actor2 == actorA || actor2 == actorB) { //std::cout << "Actor in Collide = " << (actor1 == actorA ? "A" : "B") << std::endl; return true; } } return false; } //add mesh actor to scene int rc_createAnimatedActor(int mesh_id) { if(mesh_id < 0 || mesh_id >= rc_mesh.size()) return -1; irr::scene::IMesh* mesh = rc_mesh[mesh_id].mesh; if(!mesh) return -1; int actor_id = -1; irr::scene::ISceneNode* node; rc_scene_node actor; if(rc_mesh[mesh_id].mesh_type == RC_MESH_TYPE_ANIMATED) { actor.node_type = RC_NODE_TYPE_MESH; node = SceneManager->addAnimatedMeshSceneNode((irr::scene::IAnimatedMesh*)mesh); } else { actor.node_type = RC_NODE_TYPE_STMESH; //STATIC MESH NODE node = SceneManager->addMeshSceneNode(mesh); } actor.mesh_node = node; actor.shadow = NULL; actor.transition = false; actor.transition_time = 0; actor.material_ref_index = -1; if(!node) return -1; for(int i = 0; i < rc_actor.size(); i++) { if(!rc_actor[i].mesh_node) { actor_id = i; break; } } if(actor_id < 0) { actor_id = rc_actor.size(); rc_actor.push_back(actor); } else { rc_actor[actor_id] = actor; } //animation rc_actor_animation_obj animation; animation.start_frame = 0; animation.end_frame = 0; animation.fps = 60.0; animation.frame_start_time = SDL_GetTicks(); animation.frame_swap_time = 1000/60; rc_actor[actor_id].animation.push_back(animation); if(rc_mesh[mesh_id].mesh_type == RC_MESH_TYPE_ANIMATED) { rc_actor[actor_id].current_animation = 0; rc_actor[actor_id].current_animation_loop = 0; rc_actor[actor_id].num_animation_loops = 0; rc_animEndCallBack* anim_callback = new rc_animEndCallBack(); anim_callback->ref_id = actor_id; anim_callback->OnAnimationEnd((irr::scene::IAnimatedMeshSceneNode*)node); ((irr::scene::IAnimatedMeshSceneNode*)node)->setAnimationEndCallback(anim_callback); ((irr::scene::IAnimatedMeshSceneNode*)node)->setLoopMode(false); ((irr::scene::IAnimatedMeshSceneNode*)node)->setFrameLoop(0, 0); anim_callback->drop(); } //Actor RigidBody rc_actor[actor_id].physics.shape_type = RC_NODE_SHAPE_TYPE_BOX; rc_actor[actor_id].physics.rigid_body = NULL; rc_actor[actor_id].physics.isSolid = false; rc_setActorCollisionShape(actor_id, RC_NODE_SHAPE_TYPE_BOX, 1); return actor_id; } //add mesh actor to scene int rc_createOctreeActor(int mesh_id) { if(mesh_id < 0 || mesh_id >= rc_mesh.size()) return -1; irr::scene::IMesh* mesh = rc_mesh[mesh_id].mesh; if(!mesh) return -1; int actor_id = -1; //irr::scene::IAnimatedMeshSceneNode* node = SceneManager->addAnimatedMeshSceneNode(mesh); irr::scene::IOctreeSceneNode *node = SceneManager->addOctreeSceneNode(mesh); rc_scene_node actor; actor.node_type = RC_NODE_TYPE_OTMESH; actor.mesh_node = node; actor.shadow = NULL; actor.transition = false; actor.transition_time = 0; actor.material_ref_index = -1; if(!node) return -1; for(int i = 0; i < rc_actor.size(); i++) { if(!rc_actor[i].mesh_node) { actor_id = i; break; } } if(actor_id < 0) { actor_id = rc_actor.size(); rc_actor.push_back(actor); } else { rc_actor[actor_id] = actor; } //Actor RigidBody rc_actor[actor_id].physics.shape_type = RC_NODE_SHAPE_TYPE_BOX; rc_actor[actor_id].physics.rigid_body = NULL; rc_actor[actor_id].physics.isSolid = false; rc_setActorCollisionShape(actor_id, RC_NODE_SHAPE_TYPE_BOX, 1); return actor_id; } //add mesh actor to scene int rc_createTerrainActor( std::string height_map ) { int actor_id = -1; irr::scene::ITerrainSceneNode *node = SceneManager->addTerrainSceneNode(height_map.c_str()); rc_scene_node actor; actor.node_type = RC_NODE_TYPE_TERRAIN; actor.mesh_node = node; actor.shadow = NULL; actor.transition = false; actor.transition_time = 0; actor.material_ref_index = -1; if(!node) return -1; for(int i = 0; i < rc_actor.size(); i++) { if(!rc_actor[i].mesh_node) { actor_id = i; break; } } if(actor_id < 0) { actor_id = rc_actor.size(); rc_actor.push_back(actor); } else { rc_actor[actor_id] = actor; } //Actor RigidBody rc_actor[actor_id].physics.shape_type = RC_NODE_SHAPE_TYPE_BOX; rc_actor[actor_id].physics.rigid_body = NULL; rc_actor[actor_id].physics.isSolid = false; rc_setActorCollisionShape(actor_id, RC_NODE_SHAPE_TYPE_BOX, 0); return actor_id; } int rc_createParticleActor( int particle_type ) { int actor_id = -1; irr::scene::IParticleSystemSceneNode *node = SceneManager->addParticleSystemSceneNode( false ); rc_scene_node actor; actor.node_type = RC_NODE_TYPE_PARTICLE; actor.particle_properties.particle_type = particle_type; actor.particle_properties.mesh_id = -1; actor.mesh_node = node; actor.shadow = NULL; actor.transition = false; actor.transition_time = 0; actor.material_ref_index = -1; if(!node) return -1; for(int i = 0; i < rc_actor.size(); i++) { if(!rc_actor[i].mesh_node) { actor_id = i; break; } } if(actor_id < 0) { actor_id = rc_actor.size(); rc_actor.push_back(actor); } else { rc_actor[actor_id] = actor; } //Actor RigidBody rc_actor[actor_id].physics.shape_type = RC_NODE_SHAPE_TYPE_BOX; rc_actor[actor_id].physics.rigid_body = NULL; rc_actor[actor_id].physics.isSolid = false; rc_setActorCollisionShape(actor_id, RC_NODE_SHAPE_TYPE_BOX, 0); return actor_id; } //add mesh actor to scene 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.mesh_node = node; actor.shadow = NULL; actor.transition = false; actor.transition_time = 0; actor.material_ref_index = -1; if(!node) return -1; for(int i = 0; i < rc_actor.size(); i++) { if(!rc_actor[i].mesh_node) { actor_id = i; break; } } if(actor_id < 0) { actor_id = rc_actor.size(); rc_actor.push_back(actor); } else { rc_actor[actor_id] = actor; } //Actor RigidBody rc_actor[actor_id].physics.shape_type = RC_NODE_SHAPE_TYPE_BOX; rc_actor[actor_id].physics.rigid_body = NULL; rc_actor[actor_id].physics.isSolid = false; rc_setActorCollisionShape(actor_id, RC_NODE_SHAPE_TYPE_BOX, 1); return actor_id; } //add mesh actor to scene 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.mesh_node = node; actor.shadow = NULL; actor.transition = false; actor.transition_time = 0; actor.material_ref_index = -1; if(!node) return -1; for(int i = 0; i < rc_actor.size(); i++) { if(!rc_actor[i].mesh_node) { actor_id = i; break; } } if(actor_id < 0) { actor_id = rc_actor.size(); rc_actor.push_back(actor); } else { rc_actor[actor_id] = actor; } //Actor RigidBody rc_actor[actor_id].physics.shape_type = RC_NODE_SHAPE_TYPE_SPHERE; rc_actor[actor_id].physics.rigid_body = NULL; rc_actor[actor_id].physics.isSolid = false; rc_setActorCollisionShape(actor_id, RC_NODE_SHAPE_TYPE_SPHERE, 1); return actor_id; } //add mesh actor to scene int rc_createWaterActor(int mesh_id, double waveHeight, double waveSpeed, double waveLength) { int actor_id = -1; 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; actor.shadow = NULL; actor.transition = false; actor.transition_time = 0; actor.material_ref_index = -1; if(!node) return -1; for(int i = 0; i < rc_actor.size(); i++) { if(!rc_actor[i].mesh_node) { actor_id = i; break; } } if(actor_id < 0) { actor_id = rc_actor.size(); rc_actor.push_back(actor); } else { rc_actor[actor_id] = actor; } //Actor RigidBody rc_actor[actor_id].physics.shape_type = RC_NODE_SHAPE_TYPE_BOX; rc_actor[actor_id].physics.rigid_body = NULL; rc_actor[actor_id].physics.isSolid = false; rc_setActorCollisionShape(actor_id, RC_NODE_SHAPE_TYPE_BOX, 1); return actor_id; } int rc_createBillboardActor() { int actor_id = -1; irr::scene::IBillboardSceneNode* node = SceneManager->addBillboardSceneNode(); rc_scene_node actor; actor.node_type = RC_NODE_TYPE_BILLBOARD; actor.mesh_node = node; actor.shadow = NULL; actor.transition = false; actor.transition_time = 0; actor.material_ref_index = -1; if(!node) return -1; for(int i = 0; i < rc_actor.size(); i++) { if(!rc_actor[i].mesh_node) { actor_id = i; break; } } if(actor_id < 0) { actor_id = rc_actor.size(); rc_actor.push_back(actor); } else { rc_actor[actor_id] = actor; } //Actor RigidBody rc_actor[actor_id].physics.shape_type = RC_NODE_SHAPE_TYPE_BOX; rc_actor[actor_id].physics.rigid_body = NULL; rc_actor[actor_id].physics.isSolid = false; rc_setActorCollisionShape(actor_id, RC_NODE_SHAPE_TYPE_BOX, 1); return actor_id; } int rc_createLightActor() { int actor_id = -1; irr::scene::ILightSceneNode* node = SceneManager->addLightSceneNode(); rc_scene_node actor; actor.node_type = RC_NODE_TYPE_LIGHT; actor.mesh_node = node; actor.shadow = NULL; actor.transition = false; actor.transition_time = 0; actor.material_ref_index = -1; if(!node) return -1; for(int i = 0; i < rc_actor.size(); i++) { if(!rc_actor[i].mesh_node) { actor_id = i; break; } } if(actor_id < 0) { actor_id = rc_actor.size(); rc_actor.push_back(actor); } else { rc_actor[actor_id] = actor; } //Actor RigidBody rc_actor[actor_id].physics.shape_type = RC_NODE_SHAPE_TYPE_BOX; rc_actor[actor_id].physics.rigid_body = NULL; rc_actor[actor_id].physics.isSolid = false; rc_setActorCollisionShape(actor_id, RC_NODE_SHAPE_TYPE_BOX, 1); return actor_id; } int rc_createProjectorActor() { int actor_id = -1; CProjectiveTextures* node = new CProjectiveTextures(device, 0, SceneManager, -1); rc_scene_node actor; actor.node_type = RC_NODE_TYPE_PROJECTOR; actor.mesh_node = node; actor.shadow = NULL; actor.transition = false; actor.transition_time = 0; actor.material_ref_index = -1; if(!node) return -1; for(int i = 0; i < rc_actor.size(); i++) { if(!rc_actor[i].mesh_node) { actor_id = i; break; } } if(actor_id < 0) { actor_id = rc_actor.size(); rc_actor.push_back(actor); } else { rc_actor[actor_id] = actor; } //Actor RigidBody rc_actor[actor_id].physics.shape_type = RC_NODE_SHAPE_TYPE_BOX; rc_actor[actor_id].physics.rigid_body = NULL; rc_actor[actor_id].physics.isSolid = false; rc_setActorCollisionShape(actor_id, RC_NODE_SHAPE_TYPE_BOX, 1); return actor_id; } //delete actor void rc_deleteActor(int actor_id) { if(actor_id < 0 || actor_id >= rc_actor.size()) return; if(!rc_actor[actor_id].mesh_node) return; rc_physics3D.world->removeCollisionObject(rc_actor[actor_id].physics.rigid_body, false); rc_actor[actor_id].physics.collisions.clear(); rc_actor[actor_id].mesh_node->remove(); rc_actor[actor_id].mesh_node = NULL; rc_actor[actor_id].shadow = NULL; rc_actor[actor_id].node_type = 0; rc_actor[actor_id].transition = false; rc_actor[actor_id].transition_time = 0; rc_actor[actor_id].material_ref_index = -1; } //-------------------Actor Transforms------------------------------- bool rc_getActorTransform(int actor, int t_mat) { if(actor < 0 || actor >= rc_actor.size()) return false; if(t_mat < 0 || t_mat >= rc_matrix.size()) return false; if(!rc_matrix[t_mat].active) return false; irr::core::matrix4 m = rc_actor[actor].mesh_node->getAbsoluteTransformation(); rc_convertFromIrrMatrix(m, t_mat); return true; } //set actor position void rc_setActorPosition(int actor, double x, double y, double z) { if(actor < 0 || actor >= rc_actor.size()) return; if(rc_actor[actor].physics.rigid_body) { //std::cout << "Set POS" << std::endl; irr::core::matrix4 actor_transform = rc_actor[actor].physics.rigid_body->getWorldTransform(); //rc_physics3D.world->removeCollisionObject(rc_actor[actor].physics.rigid_body, false); actor_transform.setTranslation( irr::core::vector3df(x, y, z) ); rc_actor[actor].physics.rigid_body->clearForces(); //rc_actor[actor].physics.rigid_body-> rc_actor[actor].physics.rigid_body->setWorldTransform(actor_transform); //rc_actor[actor].physics.rigid_body->setMassProps(rc_actor[actor].physics.mass, irr::core::vector3df(0,0,0)); //rc_physics3D.world->addRigidBody(rc_actor[actor].physics.rigid_body); rc_actor[actor].mesh_node->setPosition(actor_transform.getTranslation()); rc_actor[actor].mesh_node->updateAbsolutePosition(); } } //translate actor from local orientation void rc_translateActorLocal(int actor, double x, double y, double z) { if(actor < 0 || actor >= rc_actor.size()) return; if(rc_actor[actor].physics.rigid_body) { //std::cout << "Set POS" << std::endl; irr::core::matrix4 actor_transform = rc_actor[actor].physics.rigid_body->getWorldTransform(); irr::core::matrix4 m; m.setRotationDegrees(actor_transform.getRotationDegrees()); irr::core::vector3df v(x, y, z); m.transformVect(v); actor_transform.setTranslation( actor_transform.getTranslation() + v ); rc_actor[actor].physics.rigid_body->clearForces(); rc_actor[actor].physics.rigid_body->setWorldTransform(actor_transform); rc_actor[actor].mesh_node->setPosition(actor_transform.getTranslation()); rc_actor[actor].mesh_node->updateAbsolutePosition(); } } //translate actor from world orientation void rc_translateActorWorld(int actor, double x, double y, double z) { if(actor < 0 || actor >= rc_actor.size()) return; if(rc_actor[actor].physics.rigid_body) { //std::cout << "Set POS" << std::endl; irr::core::matrix4 actor_transform = rc_actor[actor].physics.rigid_body->getWorldTransform(); actor_transform.setTranslation( actor_transform.getTranslation() + irr::core::vector3df(x, y, z) ); rc_actor[actor].physics.rigid_body->clearForces(); rc_actor[actor].physics.rigid_body->setWorldTransform(actor_transform); rc_actor[actor].mesh_node->setPosition(actor_transform.getTranslation()); rc_actor[actor].mesh_node->updateAbsolutePosition(); } } //get actor position void rc_getActorPosition(int actor, double* x, double* y, double* z) { if(actor < 0 || actor >= rc_actor.size()) return; *x = 0; *y = 0; *z = 0; if(rc_actor[actor].physics.rigid_body) { //std::cout << "Set POS" << std::endl; irr::core::matrix4 actor_transform = rc_actor[actor].physics.rigid_body->getWorldTransform(); *x = actor_transform.getTranslation().X; *y = actor_transform.getTranslation().Y; *z = actor_transform.getTranslation().Z; } } //set actor scale void rc_setActorScale(int actor, double x, double y, double z) { if(actor < 0 || actor >= rc_actor.size()) return; if(rc_actor[actor].physics.rigid_body) { //std::cout << "Set POS" << std::endl; irr::core::matrix4 actor_transform = rc_actor[actor].physics.rigid_body->getWorldTransform(); actor_transform.setScale( irr::core::vector3df(x, y, z) ); rc_actor[actor].physics.rigid_body->clearForces(); rc_actor[actor].physics.rigid_body->setWorldTransform(actor_transform); rc_actor[actor].mesh_node->setScale(actor_transform.getScale()); rc_actor[actor].mesh_node->updateAbsolutePosition(); } } //scale actor void rc_scaleActor(int actor, double x, double y, double z) { if(actor < 0 || actor >= rc_actor.size()) return; if(rc_actor[actor].physics.rigid_body) { //std::cout << "Set POS" << std::endl; irr::core::matrix4 actor_transform = rc_actor[actor].physics.rigid_body->getWorldTransform(); actor_transform.setScale( actor_transform.getScale() * irr::core::vector3df(x, y, z) ); rc_actor[actor].physics.rigid_body->clearForces(); rc_actor[actor].physics.rigid_body->setWorldTransform(actor_transform); rc_actor[actor].mesh_node->setScale(actor_transform.getScale()); rc_actor[actor].mesh_node->updateAbsolutePosition(); } } //get actor scale void rc_getActorScale(int actor, double* x, double* y, double* z) { if(actor < 0 || actor >= rc_actor.size()) return; *x = 0; *y = 0; *z = 0; if(rc_actor[actor].physics.rigid_body) { //std::cout << "Set POS" << std::endl; irr::core::matrix4 actor_transform = rc_actor[actor].physics.rigid_body->getWorldTransform(); *x = actor_transform.getScale().X; *y = actor_transform.getScale().Y; *z = actor_transform.getScale().Z; } } //set actor rotation void rc_setActorRotation(int actor, double x, double y, double z) { if(actor < 0 || actor >= rc_actor.size()) return; if(rc_actor[actor].physics.rigid_body) { //std::cout << "Set POS" << std::endl; irr::core::matrix4 actor_transform = rc_actor[actor].physics.rigid_body->getWorldTransform(); actor_transform.setRotationDegrees( irr::core::vector3df(x, y, z) ); rc_actor[actor].physics.rigid_body->clearForces(); rc_actor[actor].physics.rigid_body->setWorldTransform(actor_transform); rc_actor[actor].mesh_node->setRotation( actor_transform.getRotationDegrees() ); rc_actor[actor].mesh_node->updateAbsolutePosition(); } } //rotate actor void rc_rotateActor(int actor, double x, double y, double z) { if(actor < 0 || actor >= rc_actor.size()) return; if(rc_actor[actor].physics.rigid_body) { //std::cout << "Set POS" << std::endl; irr::core::matrix4 actor_transform = rc_actor[actor].physics.rigid_body->getWorldTransform(); irr::core::matrix4 n; irr::core::vector3df rot(x, y, z); n.setRotationDegrees(rot); actor_transform *= n; rc_actor[actor].physics.rigid_body->clearForces(); rc_actor[actor].physics.rigid_body->setWorldTransform(actor_transform); rc_actor[actor].mesh_node->setRotation( actor_transform.getRotationDegrees() ); rc_actor[actor].mesh_node->updateAbsolutePosition(); } } //get actor position void rc_getActorRotation(int actor, double* x, double* y, double* z) { if(actor < 0 || actor >= rc_actor.size()) return; *x = 0; *y = 0; *z = 0; if(rc_actor[actor].physics.rigid_body) { //std::cout << "Set POS" << std::endl; irr::core::matrix4 actor_transform = rc_actor[actor].physics.rigid_body->getWorldTransform(); *x = actor_transform.getRotationDegrees().X; *y = actor_transform.getRotationDegrees().Y; *z = actor_transform.getRotationDegrees().Z; } } //---------------PROPERTIES------------------------ void rc_setActorAutoCulling(int actor, int cull_type) { if(actor < 0 || actor >= rc_actor.size()) return; rc_actor[actor].mesh_node->setAutomaticCulling((irr::scene::E_CULLING_TYPE) cull_type); } int rc_getActorAutoCulling(int actor) { if(actor < 0 || actor >= rc_actor.size()) return 0; if(rc_actor[actor].mesh_node) return rc_actor[actor].mesh_node->getAutomaticCulling(); return 0; } void rc_addActorShadow(int actor) { if(actor < 0 || actor >= rc_actor.size()) return; if(rc_actor[actor].shadow) return; 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: irr::scene::IMeshSceneNode* node = (irr::scene::IMeshSceneNode*)rc_actor[actor].mesh_node; if(!rc_actor[actor].shadow) rc_actor[actor].shadow = node->addShadowVolumeSceneNode(); break; } } void rc_removeActorShadow(int actor) { if(actor < 0 || actor >= rc_actor.size()) return; if(!rc_actor[actor].shadow) return; 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: irr::scene::ISceneNode* node = rc_actor[actor].mesh_node; if(rc_actor[actor].shadow) node->removeChild(rc_actor[actor].shadow); rc_actor[actor].shadow = NULL; break; } } bool rc_lightIsCastingShadow(int actor) { if(actor < 0 || actor >= rc_actor.size()) return false; switch(rc_actor[actor].node_type) { case RC_NODE_TYPE_LIGHT: irr::scene::ILightSceneNode* node = (irr::scene::ILightSceneNode*)rc_actor[actor].mesh_node; return node->getCastShadow(); } return false; } int rc_getLightType(int actor) { if(actor < 0 || actor >= rc_actor.size()) return -1; switch(rc_actor[actor].node_type) { case RC_NODE_TYPE_LIGHT: irr::scene::ILightSceneNode* node = (irr::scene::ILightSceneNode*)rc_actor[actor].mesh_node; return (int)node->getLightType(); } return -1; } double rc_getLightRadius(int actor) { if(actor < 0 || actor >= rc_actor.size()) return 0; switch(rc_actor[actor].node_type) { case RC_NODE_TYPE_LIGHT: irr::scene::ILightSceneNode* node = (irr::scene::ILightSceneNode*)rc_actor[actor].mesh_node; return node->getRadius(); } return 0; } void rc_setLightType(int actor, int light_type) { if(actor < 0 || actor >= rc_actor.size()) return; switch(rc_actor[actor].node_type) { case RC_NODE_TYPE_LIGHT: irr::scene::ILightSceneNode* node = (irr::scene::ILightSceneNode*)rc_actor[actor].mesh_node; node->setLightType((irr::video::E_LIGHT_TYPE)light_type); } } void rc_setLightRadius(int actor, double radius) { if(actor < 0 || actor >= rc_actor.size()) return; switch(rc_actor[actor].node_type) { case RC_NODE_TYPE_LIGHT: irr::scene::ILightSceneNode* node = (irr::scene::ILightSceneNode*)rc_actor[actor].mesh_node; node->setRadius(radius); } } void rc_setLightShadowCast(int actor, bool flag) { if(actor < 0 || actor >= rc_actor.size()) return; switch(rc_actor[actor].node_type) { case RC_NODE_TYPE_LIGHT: irr::scene::ILightSceneNode* node = (irr::scene::ILightSceneNode*)rc_actor[actor].mesh_node; node->enableCastShadow(flag); } } void rc_setLightAmbientColor(int actor, Uint32 color) { if(actor < 0 || actor >= rc_actor.size()) return; switch(rc_actor[actor].node_type) { case RC_NODE_TYPE_LIGHT: irr::scene::ILightSceneNode* node = (irr::scene::ILightSceneNode*)rc_actor[actor].mesh_node; irr::video::SColor c(color); irr::video::SColorf cf(c); node->getLightData().AmbientColor = cf; break; } } Uint32 rc_getLightAmbientColor(int actor) { if(actor < 0 || actor >= rc_actor.size()) return 0; switch(rc_actor[actor].node_type) { case RC_NODE_TYPE_LIGHT: irr::scene::ILightSceneNode* node = (irr::scene::ILightSceneNode*)rc_actor[actor].mesh_node; irr::video::SLight light_data = node->getLightData(); return light_data.AmbientColor.toSColor().color; } return 0; } void rc_setLightAttenuation(int actor, double l_constant, double l_linear, double l_quadratic) { if(actor < 0 || actor >= rc_actor.size()) return; switch(rc_actor[actor].node_type) { case RC_NODE_TYPE_LIGHT: irr::scene::ILightSceneNode* node = (irr::scene::ILightSceneNode*)rc_actor[actor].mesh_node; node->getLightData().Attenuation.set(l_constant, l_linear, l_quadratic); break; } } void rc_getLightAttenuation(int actor, double* l_constant, double* l_linear, double* l_quadratic) { if(actor < 0 || actor >= rc_actor.size()) return; *l_constant = 0; *l_linear = 0; *l_quadratic = 0; switch(rc_actor[actor].node_type) { case RC_NODE_TYPE_LIGHT: irr::scene::ILightSceneNode* node = (irr::scene::ILightSceneNode*)rc_actor[actor].mesh_node; irr::video::SLight light_data = node->getLightData(); *l_constant = light_data.Attenuation.X; *l_linear = light_data.Attenuation.Y; *l_quadratic = light_data.Attenuation.Z; } } void rc_setLightDiffuseColor(int actor, Uint32 color) { if(actor < 0 || actor >= rc_actor.size()) return; switch(rc_actor[actor].node_type) { case RC_NODE_TYPE_LIGHT: irr::scene::ILightSceneNode* node = (irr::scene::ILightSceneNode*)rc_actor[actor].mesh_node; irr::video::SColor c(color); irr::video::SColorf cf(c); node->getLightData().DiffuseColor = cf; break; } } Uint32 rc_getLightDiffuseColor(int actor) { if(actor < 0 || actor >= rc_actor.size()) return 0; switch(rc_actor[actor].node_type) { case RC_NODE_TYPE_LIGHT: irr::scene::ILightSceneNode* node = (irr::scene::ILightSceneNode*)rc_actor[actor].mesh_node; irr::video::SLight light_data = node->getLightData(); return light_data.DiffuseColor.toSColor().color; } return 0; } void rc_setLightFalloff(int actor, double falloff) { if(actor < 0 || actor >= rc_actor.size()) return; switch(rc_actor[actor].node_type) { case RC_NODE_TYPE_LIGHT: irr::scene::ILightSceneNode* node = (irr::scene::ILightSceneNode*)rc_actor[actor].mesh_node; node->getLightData().Falloff = falloff; break; } } double rc_getLightFalloff(int actor) { if(actor < 0 || actor >= rc_actor.size()) return 0; switch(rc_actor[actor].node_type) { case RC_NODE_TYPE_LIGHT: irr::scene::ILightSceneNode* node = (irr::scene::ILightSceneNode*)rc_actor[actor].mesh_node; irr::video::SLight light_data = node->getLightData(); return light_data.Falloff; } return 0; } void rc_setLightInnerCone(int actor, double angle) { if(actor < 0 || actor >= rc_actor.size()) return; switch(rc_actor[actor].node_type) { case RC_NODE_TYPE_LIGHT: irr::scene::ILightSceneNode* node = (irr::scene::ILightSceneNode*)rc_actor[actor].mesh_node; node->getLightData().InnerCone = angle; break; } } double rc_getLightInnerCone(int actor) { if(actor < 0 || actor >= rc_actor.size()) return 0; switch(rc_actor[actor].node_type) { case RC_NODE_TYPE_LIGHT: irr::scene::ILightSceneNode* node = (irr::scene::ILightSceneNode*)rc_actor[actor].mesh_node; irr::video::SLight light_data = node->getLightData(); return light_data.InnerCone; } return 0; } void rc_setLightOuterCone(int actor, double angle) { if(actor < 0 || actor >= rc_actor.size()) return; switch(rc_actor[actor].node_type) { case RC_NODE_TYPE_LIGHT: irr::scene::ILightSceneNode* node = (irr::scene::ILightSceneNode*)rc_actor[actor].mesh_node; node->getLightData().OuterCone = angle; break; } } double rc_getLightOuterCone(int actor) { if(actor < 0 || actor >= rc_actor.size()) return 0; switch(rc_actor[actor].node_type) { case RC_NODE_TYPE_LIGHT: irr::scene::ILightSceneNode* node = (irr::scene::ILightSceneNode*)rc_actor[actor].mesh_node; irr::video::SLight light_data = node->getLightData(); return light_data.OuterCone; } return 0; } void rc_setLightSpecularColor(int actor, Uint32 color) { if(actor < 0 || actor >= rc_actor.size()) return; switch(rc_actor[actor].node_type) { case RC_NODE_TYPE_LIGHT: irr::scene::ILightSceneNode* node = (irr::scene::ILightSceneNode*)rc_actor[actor].mesh_node; irr::video::SColor c(color); irr::video::SColorf cf(c); node->getLightData().SpecularColor = cf; break; } } Uint32 rc_getLightSpecularColor(int actor) { if(actor < 0 || actor >= rc_actor.size()) return 0; switch(rc_actor[actor].node_type) { case RC_NODE_TYPE_LIGHT: irr::scene::ILightSceneNode* node = (irr::scene::ILightSceneNode*)rc_actor[actor].mesh_node; irr::video::SLight light_data = node->getLightData(); return light_data.SpecularColor.toSColor().color; } return 0; } //set actor animation speed void rc_setActorVisible(int actor, bool flag) { if(actor < 0 || actor >= rc_actor.size()) return; irr::scene::ISceneNode* node = rc_actor[actor].mesh_node; node->setVisible(flag); } bool rc_actorIsVisible(int actor) { if(actor < 0 || actor >= rc_actor.size()) return false; return rc_actor[actor].mesh_node->isVisible(); } void rc_getTerrainPatchAABB(int actor, double patch_x, double patch_z, double* min_x, double* min_y, double* min_z, double* max_x, double* max_y, double* max_z) { if(actor < 0 || actor >= rc_actor.size()) return; *min_x = 0; *min_y = 0; *min_z = 0; *max_x = 0; *max_y = 0; *max_z = 0; switch(rc_actor[actor].node_type) { case RC_NODE_TYPE_TERRAIN: irr::scene::ITerrainSceneNode* node = (irr::scene::ITerrainSceneNode*)rc_actor[actor].mesh_node; irr::core::aabbox3d bbox = node->getBoundingBox(patch_x, patch_z); *min_x = bbox.MinEdge.X; *min_y = bbox.MinEdge.Y; *min_z = bbox.MinEdge.Z; *max_x = bbox.MaxEdge.X; *max_y = bbox.MaxEdge.Y; *max_z = bbox.MaxEdge.Z; } } int rc_getTerrainPatchLOD(int actor, int patchX, int patchZ) { if(actor < 0 || actor >= rc_actor.size()) return -1; switch(rc_actor[actor].node_type) { case RC_NODE_TYPE_TERRAIN: irr::scene::ITerrainSceneNode* terrain = (irr::scene::ITerrainSceneNode*) rc_actor[actor].mesh_node; irr::core::array lod; int lodp_size = terrain->getCurrentLODOfPatches(lod); irr::s32 dim_size = irr::core::squareroot(lodp_size); return lod[patchX * dim_size + patchZ]; } return -1; } double rc_getTerrainHeight(int actor, int patchX, int patchZ ) { if(actor < 0 || actor >= rc_actor.size()) return 0; switch(rc_actor[actor].node_type) { case RC_NODE_TYPE_TERRAIN: irr::scene::ITerrainSceneNode* terrain = (irr::scene::ITerrainSceneNode*) rc_actor[actor].mesh_node; return terrain->getHeight(patchX, patchZ); } return 0; } void rc_getTerrainCenter(int actor, double* x, double* y, double* z) { if(actor < 0 || actor >= rc_actor.size()) return; *x = 0; *y = 0; *z = 0; switch(rc_actor[actor].node_type) { case RC_NODE_TYPE_TERRAIN: irr::scene::ITerrainSceneNode* terrain = (irr::scene::ITerrainSceneNode*) rc_actor[actor].mesh_node; irr::core::vector3df v = terrain->getTerrainCenter(); *x = v.X; *y = v.Y; *z = v.Z; } } void rc_setTerrainLODDistance(int actor, int lod, double distance) { if(actor < 0 || actor >= rc_actor.size()) return; switch(rc_actor[actor].node_type) { case RC_NODE_TYPE_TERRAIN: irr::scene::ITerrainSceneNode* terrain = (irr::scene::ITerrainSceneNode*) rc_actor[actor].mesh_node; terrain->overrideLODDistance(lod, distance); } } void rc_scaleTerrainTexture(int actor, double scale1, double scale2) { if(actor < 0 || actor >= rc_actor.size()) return; switch(rc_actor[actor].node_type) { case RC_NODE_TYPE_TERRAIN: irr::scene::ITerrainSceneNode* terrain = (irr::scene::ITerrainSceneNode*) rc_actor[actor].mesh_node; terrain->scaleTexture(scale1, scale2); } } void rc_setTerrainCameraMovementDelta(int actor, double delta) { if(actor < 0 || actor >= rc_actor.size()) return; switch(rc_actor[actor].node_type) { case RC_NODE_TYPE_TERRAIN: irr::scene::ITerrainSceneNode* terrain = (irr::scene::ITerrainSceneNode*) rc_actor[actor].mesh_node; terrain->setCameraMovementDelta(delta); } } void rc_setTerrainCameraRotationDelta(int actor, double delta) { if(actor < 0 || actor >= rc_actor.size()) return; switch(rc_actor[actor].node_type) { case RC_NODE_TYPE_TERRAIN: irr::scene::ITerrainSceneNode* terrain = (irr::scene::ITerrainSceneNode*) rc_actor[actor].mesh_node; terrain->setCameraRotationDelta(delta); } } void rc_setTerrainPatchLOD(int actor, int patchX, int patchZ, int lod) { if(actor < 0 || actor >= rc_actor.size()) return; switch(rc_actor[actor].node_type) { case RC_NODE_TYPE_TERRAIN: irr::scene::ITerrainSceneNode* terrain = (irr::scene::ITerrainSceneNode*) rc_actor[actor].mesh_node; terrain->setLODOfPatch(patchX, patchZ, lod); } } void rc_setProjectorTarget(int actor, double x, double y, double z) { if(actor < 0 || actor >= rc_actor.size()) return; switch(rc_actor[actor].node_type) { case RC_NODE_TYPE_PROJECTOR: CProjectiveTextures* projector = (CProjectiveTextures*) rc_actor[actor].mesh_node; projector->setTarget(irr::core::vector3df(x,y,z)); break; } } void rc_getProjectorTarget(int actor, double* x, double* y, double* z) { if(actor < 0 || actor >= rc_actor.size()) return; switch(rc_actor[actor].node_type) { case RC_NODE_TYPE_PROJECTOR: CProjectiveTextures* projector = (CProjectiveTextures*) rc_actor[actor].mesh_node; *x = projector->getTarget().X; *y = projector->getTarget().Y; *z = projector->getTarget().Z; break; } } void rc_setProjectorFOV(int actor, double fov) { if(actor < 0 || actor >= rc_actor.size()) return; switch(rc_actor[actor].node_type) { case RC_NODE_TYPE_PROJECTOR: CProjectiveTextures* projector = (CProjectiveTextures*) rc_actor[actor].mesh_node; return projector->setFOV(fov); } } double rc_getProjectorFOV(int actor) { if(actor < 0 || actor >= rc_actor.size()) return 0; switch(rc_actor[actor].node_type) { case RC_NODE_TYPE_PROJECTOR: CProjectiveTextures* projector = (CProjectiveTextures*) rc_actor[actor].mesh_node; return projector->getFOV(); } } #endif // RC_BASE_ACTOR_H_INCLUDED