* Added collision callback * Set sprite density to 1 by default * Added default frame value of 0 on frame resize * Changed defaults for sprite fixture * Made changes to some of the animation functions parameters
6773 lines
186 KiB
C++
6773 lines
186 KiB
C++
#ifndef RC_GFX3D_H_INCLUDED
|
|
#define RC_GFX3D_H_INCLUDED
|
|
|
|
#ifdef RC_ANDROID
|
|
#include "SDL.h"
|
|
#include <btBulletDynamicsCommon.h>
|
|
#include <BulletCollision/CollisionDispatch/btGhostObject.h>
|
|
#else
|
|
#include <SDL2/SDL.h>
|
|
#include <bullet/btBulletDynamicsCommon.h>
|
|
#include <bullet/BulletCollision/CollisionDispatch/btGhostObject.h>
|
|
#endif // _IRR_ANDROID_PLATFORM_
|
|
#include <irrlicht.h>
|
|
#include <iostream>
|
|
#include <sstream>
|
|
#include <string>
|
|
#include <locale>
|
|
#include <codecvt>
|
|
#include <cmath>
|
|
#include <set>
|
|
|
|
#include "camera.h"
|
|
#include "rc_gfx_core.h"
|
|
#include "rc_matrix.h"
|
|
#include "RealisticWater.h"
|
|
|
|
//load a mesh from a file
|
|
int rc_loadMesh(std::string mesh_file)
|
|
{
|
|
int mesh_id = -1;
|
|
|
|
rc_mesh_obj mesh_obj;
|
|
mesh_obj.mesh_type = RC_MESH_TYPE_ANIMATED;
|
|
|
|
irr::scene::IAnimatedMesh* mesh = SceneManager->getMesh(mesh_file.c_str());
|
|
mesh_obj.mesh = mesh;
|
|
|
|
if(!mesh)
|
|
return -1;
|
|
|
|
for(int i = 0; i < rc_mesh.size(); i++)
|
|
{
|
|
if(!rc_mesh[i].mesh)
|
|
{
|
|
mesh_id = i;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if(mesh_id < 0)
|
|
{
|
|
mesh_id = rc_mesh.size();
|
|
rc_mesh.push_back(mesh_obj);
|
|
}
|
|
else
|
|
{
|
|
rc_mesh[mesh_id] = mesh_obj;
|
|
}
|
|
|
|
return mesh_id;
|
|
}
|
|
|
|
//load a mesh from an archive
|
|
int rc_loadMeshFromArchive(std::string archive, std::string mesh_file)
|
|
{
|
|
int mesh_id = -1;
|
|
|
|
device->getFileSystem()->addFileArchive(archive.c_str());
|
|
irr::scene::IAnimatedMesh *mesh = SceneManager->getMesh(mesh_file.c_str());
|
|
device->getFileSystem()->removeFileArchive((irr::u32) 0);
|
|
|
|
rc_mesh_obj mesh_obj;
|
|
mesh_obj.mesh_type = RC_MESH_TYPE_ANIMATED;
|
|
mesh_obj.mesh = mesh;
|
|
|
|
if(!mesh)
|
|
return -1;
|
|
|
|
for(int i = 0; i < rc_mesh.size(); i++)
|
|
{
|
|
if(!rc_mesh[i].mesh)
|
|
{
|
|
mesh_id = i;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if(mesh_id < 0)
|
|
{
|
|
mesh_id = rc_mesh.size();
|
|
rc_mesh.push_back(mesh_obj);
|
|
}
|
|
else
|
|
{
|
|
rc_mesh[mesh_id] = mesh_obj;
|
|
}
|
|
|
|
return mesh_id;
|
|
}
|
|
|
|
int rc_loadAN8(std::string an8_file)
|
|
{
|
|
int id = -1;
|
|
|
|
for(int i = 0; i < rc_an8.size(); i++)
|
|
{
|
|
if(!rc_an8[i].active)
|
|
{
|
|
id = i;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if(id < 0)
|
|
{
|
|
id = rc_an8.size();
|
|
rc_an8_obj obj;
|
|
rc_an8.push_back(obj);
|
|
}
|
|
|
|
rc_an8[id].project = an8::loadAN8(an8_file);
|
|
if(rc_an8[id].project.exists)
|
|
{
|
|
rc_an8[id].active = true;
|
|
return id;
|
|
}
|
|
|
|
rc_an8[id].active = false;
|
|
|
|
return -1;
|
|
}
|
|
|
|
//load a mesh from an archive
|
|
int rc_loadMeshFromAN8(int an8_id, std::string scene_name)
|
|
{
|
|
int mesh_id = -1;
|
|
|
|
if(an8_id < 0 || an8_id >= rc_an8.size())
|
|
return -1;
|
|
|
|
if(!rc_an8[an8_id].active)
|
|
return -1;
|
|
|
|
rc_mesh_obj mesh_obj;
|
|
mesh_obj.mesh_type = RC_MESH_TYPE_ANIMATED;
|
|
mesh_obj.mesh = an8::loadAN8Scene(device, rc_an8[an8_id].project, scene_name);
|
|
|
|
if(!mesh_obj.mesh)
|
|
return -1;
|
|
|
|
for(int i = 0; i < rc_mesh.size(); i++)
|
|
{
|
|
if(!rc_mesh[i].mesh)
|
|
{
|
|
mesh_id = i;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if(mesh_id < 0)
|
|
{
|
|
mesh_id = rc_mesh.size();
|
|
rc_mesh.push_back(mesh_obj);
|
|
}
|
|
else
|
|
{
|
|
rc_mesh[mesh_id] = mesh_obj;
|
|
}
|
|
|
|
return mesh_id;
|
|
}
|
|
|
|
int rc_getNumAN8Scenes(int an8_id)
|
|
{
|
|
if(an8_id < 0 || an8_id >= rc_an8.size())
|
|
return 0;
|
|
|
|
if(!rc_an8[an8_id].active)
|
|
return 0;
|
|
|
|
return rc_an8[an8_id].project.scenes.size();
|
|
}
|
|
|
|
std::string rc_getAN8SceneName(int an8_id, int scene_num)
|
|
{
|
|
if(an8_id < 0 || an8_id >= rc_an8.size())
|
|
return "";
|
|
|
|
if(!rc_an8[an8_id].active)
|
|
return "";
|
|
|
|
if(scene_num < 0 || scene_num >= rc_an8[an8_id].project.scenes.size())
|
|
return "";
|
|
|
|
return rc_an8[an8_id].project.scenes[scene_num].name;
|
|
}
|
|
|
|
//delete mesh
|
|
void rc_deleteMesh(int mesh_id)
|
|
{
|
|
if(mesh_id < 0 || mesh_id >= rc_mesh.size())
|
|
return;
|
|
|
|
if(rc_mesh[mesh_id].mesh)
|
|
rc_mesh[mesh_id].mesh->drop();
|
|
|
|
rc_mesh[mesh_id].mesh = NULL;
|
|
rc_mesh[mesh_id].mesh_type = 0;
|
|
|
|
}
|
|
|
|
//create mesh from geometry data [TODO]
|
|
int rc_createMesh()
|
|
{
|
|
irr::scene::ISkinnedMesh * mesh = SceneManager->createSkinnedMesh();
|
|
|
|
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;
|
|
}
|
|
|
|
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)
|
|
{
|
|
irr::scene::ISkinnedMesh * mesh = (irr::scene::ISkinnedMesh*) rc_mesh[mesh_id].mesh;
|
|
|
|
irr::scene::SSkinMeshBuffer* mbuf = mesh->addMeshBuffer();
|
|
|
|
if(!mbuf)
|
|
{
|
|
mesh->drop();
|
|
return false;
|
|
}
|
|
|
|
irr::core::array<irr::video::S3DVertex> vertices;
|
|
irr::core::array<irr::u16> indices;
|
|
|
|
for(int i = 0; i < vertex_count; i++)
|
|
{
|
|
irr::video::S3DVertex v;
|
|
v.Pos = irr::core::vector3df( (irr::f32) vertex_data[i*3], (irr::f32) vertex_data[i*3+1], (irr::f32) vertex_data[i*3+2] );
|
|
v.Normal = irr::core::vector3df( (irr::f32) normal_data[i*3], (irr::f32) normal_data[i*3+1], (irr::f32) normal_data[i*3+2] );
|
|
v.TCoords = irr::core::vector2df( (irr::f32) uv_data[i*2], (irr::f32) uv_data[i*2+1] );
|
|
vertices.push_back(v);
|
|
}
|
|
|
|
for(int i = 0; i < index_count; i++)
|
|
{
|
|
indices.push_back( (irr::u16) index_data[i] );
|
|
}
|
|
|
|
if(indices.size() > 0)
|
|
{
|
|
for(int i = 0; i < vertices.size(); i++)
|
|
mbuf->Vertices_Standard.push_back(vertices[i]);
|
|
|
|
for(int i = 0; i < indices.size(); i++)
|
|
mbuf->Indices.push_back(indices[i]);
|
|
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
|
|
|
|
//Set Gravity
|
|
void rc_setGravity3D(double x, double y, double z)
|
|
{
|
|
rc_physics3D.world->setGravity(irr::core::vector3d<f32>(x, y, z));
|
|
}
|
|
|
|
void rc_getGravity3D(double* x, double* y, double* z)
|
|
{
|
|
btVector3 v = rc_physics3D.world->getPointer()->getGravity();
|
|
*x = v.getX();
|
|
*y = v.getY();
|
|
*z = v.getZ();
|
|
}
|
|
|
|
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 << "SetActorCollisionShape 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_createMeshActor(int mesh_id)
|
|
{
|
|
if(mesh_id < 0 || mesh_id >= rc_mesh.size())
|
|
return -1;
|
|
|
|
irr::scene::IAnimatedMesh* mesh = rc_mesh[mesh_id].mesh;
|
|
|
|
if(!mesh)
|
|
return -1;
|
|
|
|
int actor_id = -1;
|
|
irr::scene::IAnimatedMeshSceneNode* node = SceneManager->addAnimatedMeshSceneNode(mesh);
|
|
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_createMeshOctreeActor(int mesh_id)
|
|
{
|
|
if(mesh_id < 0 || mesh_id >= rc_mesh.size())
|
|
return -1;
|
|
|
|
irr::scene::IAnimatedMesh* 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;
|
|
}
|
|
|
|
//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;
|
|
}
|
|
|
|
|
|
//set actor texture
|
|
void rc_setActorTexture(int actor, int layer, int image_id)
|
|
{
|
|
if(actor < 0 || actor >= rc_actor.size())
|
|
return;
|
|
|
|
if(!rc_actor[actor].mesh_node)
|
|
return;
|
|
|
|
if(image_id < 0 || image_id >= rc_image.size())
|
|
return;
|
|
|
|
if(rc_image[image_id].image)
|
|
{
|
|
rc_actor[actor].mesh_node->setMaterialTexture(layer, rc_image[image_id].image);
|
|
}
|
|
}
|
|
|
|
//get Material count
|
|
Uint32 rc_getActorMaterialCount(int actor)
|
|
{
|
|
if(actor < 0 || actor >= rc_actor.size())
|
|
return 0;
|
|
|
|
if(!rc_actor[actor].mesh_node)
|
|
return 0;
|
|
|
|
return rc_actor[actor].mesh_node->getMaterialCount();
|
|
}
|
|
|
|
//set Actor Material Flag
|
|
void rc_setActorMaterialFlag(int actor, int flag, bool flag_value)
|
|
{
|
|
if(actor < 0 || actor >= rc_actor.size())
|
|
return;
|
|
|
|
if(!rc_actor[actor].mesh_node)
|
|
return;
|
|
|
|
rc_actor[actor].mesh_node->setMaterialFlag((irr::video::E_MATERIAL_FLAG)flag, flag_value);
|
|
}
|
|
|
|
//set Actor Material Flag
|
|
bool rc_getActorMaterialFlag(int actor, int material, int flag)
|
|
{
|
|
if(actor < 0 || actor >= rc_actor.size())
|
|
return false;
|
|
|
|
if(!rc_actor[actor].mesh_node)
|
|
return false;
|
|
|
|
return rc_actor[actor].mesh_node->getMaterial(material).getFlag((irr::video::E_MATERIAL_FLAG)flag);
|
|
}
|
|
|
|
//Set Actor Material Type
|
|
void rc_setActorMaterialType(int actor, int material_type)
|
|
{
|
|
if(actor < 0 || actor >= rc_actor.size())
|
|
return;
|
|
|
|
if(!rc_actor[actor].mesh_node)
|
|
return;
|
|
|
|
irr::video::E_MATERIAL_TYPE n = (irr::video::E_MATERIAL_TYPE) material_type;
|
|
rc_actor[actor].mesh_node->setMaterialType(n);
|
|
}
|
|
|
|
//Set Actor Material Type
|
|
int rc_getActorMaterialType(int actor, int material)
|
|
{
|
|
if(actor < 0 || actor >= rc_actor.size())
|
|
return 0;
|
|
|
|
if(!rc_actor[actor].mesh_node)
|
|
return 0;
|
|
|
|
return (int)rc_actor[actor].mesh_node->getMaterial(material).MaterialType;
|
|
}
|
|
|
|
struct rc_material_obj
|
|
{
|
|
irr::video::SMaterial mat;
|
|
bool isUsed = false;
|
|
bool isReference = false;
|
|
int refActor = -1;
|
|
int refMatNum = 0;
|
|
};
|
|
|
|
irr::core::array<rc_material_obj> rc_material;
|
|
|
|
int rc_createMaterial()
|
|
{
|
|
int material_id = -1;
|
|
|
|
for(int i = 0; i < rc_material.size(); i++)
|
|
{
|
|
if(!rc_material[i].isUsed)
|
|
{
|
|
material_id = i;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if(material_id < 0)
|
|
{
|
|
material_id = rc_material.size();
|
|
rc_material_obj mat;
|
|
mat.isUsed = true;
|
|
mat.isReference = false;
|
|
rc_material.push_back(mat);
|
|
}
|
|
|
|
return material_id;
|
|
}
|
|
|
|
void rc_deleteMaterial(int material_id)
|
|
{
|
|
if(material_id < 0 || material_id >= rc_material.size())
|
|
return;
|
|
|
|
rc_material[material_id].isUsed = false;
|
|
rc_material[material_id].mat = irr::video::SMaterial();
|
|
}
|
|
|
|
//Set Actor Material Type
|
|
void rc_setActorMaterial(int actor, int material_num, int material_id)
|
|
{
|
|
if(actor < 0 || actor >= rc_actor.size())
|
|
return;
|
|
|
|
if(!rc_actor[actor].mesh_node)
|
|
return;
|
|
|
|
if(material_id < 0 || material_id >= rc_material.size())
|
|
return;
|
|
|
|
if(rc_material[material_id].isUsed)
|
|
{
|
|
if(rc_material[material_id].isReference)
|
|
{
|
|
int refActor = rc_material[material_id].refActor;
|
|
int refMatNum = rc_material[material_id].refMatNum;
|
|
rc_actor[actor].mesh_node->getMaterial(material_num) = rc_actor[ refActor ].mesh_node->getMaterial( refMatNum );
|
|
}
|
|
else
|
|
rc_actor[actor].mesh_node->getMaterial(material_num) = rc_material[material_id].mat;
|
|
}
|
|
}
|
|
|
|
//Set Actor Material Type
|
|
int rc_copyActorMaterial(int actor, int material_num)
|
|
{
|
|
if(actor < 0 || actor >= rc_actor.size())
|
|
return -1;
|
|
|
|
if(!rc_actor[actor].mesh_node)
|
|
return -1;
|
|
|
|
int material_id = -1;
|
|
|
|
for(int i = 0; i < rc_material.size(); i++)
|
|
{
|
|
if(!rc_material[i].isUsed)
|
|
{
|
|
rc_material[i].isUsed = true;
|
|
material_id = i;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if(material_id < 0)
|
|
{
|
|
material_id = rc_material.size();
|
|
rc_material_obj nmat;
|
|
nmat.isUsed = true;
|
|
nmat.mat = rc_actor[actor].mesh_node->getMaterial(material_num);
|
|
rc_material.push_back(nmat);
|
|
}
|
|
else
|
|
rc_material[material_id].mat = rc_actor[actor].mesh_node->getMaterial(material_num);
|
|
|
|
return material_id;
|
|
}
|
|
|
|
int rc_copyMaterial(int src_material_id)
|
|
{
|
|
int material_id = -1;
|
|
|
|
for(int i = 0; i < rc_material.size(); i++)
|
|
{
|
|
if(!rc_material[i].isUsed)
|
|
{
|
|
rc_material[i].isUsed = true;
|
|
material_id = i;
|
|
break;
|
|
}
|
|
}
|
|
|
|
rc_material_obj nmat;
|
|
nmat.isUsed = true;
|
|
nmat.mat = rc_material[src_material_id].mat;
|
|
nmat.isReference = false;
|
|
nmat.refActor = -1;
|
|
nmat.refMatNum = 0;
|
|
|
|
if(material_id < 0)
|
|
{
|
|
material_id = rc_material.size();
|
|
rc_material.push_back(nmat);
|
|
}
|
|
else
|
|
rc_material[material_id] = nmat;
|
|
|
|
return material_id;
|
|
}
|
|
|
|
int rc_getActorMaterial(int actor, int material_num)
|
|
{
|
|
if(actor < 0 || actor >= rc_actor.size())
|
|
return -1;
|
|
|
|
if(!rc_actor[actor].mesh_node)
|
|
return -1;
|
|
|
|
if(rc_actor[actor].material_ref_index >= 0)
|
|
return rc_actor[actor].material_ref_index;
|
|
|
|
int material_id = -1;
|
|
|
|
for(int i = 0; i < rc_material.size(); i++)
|
|
{
|
|
if(!rc_material[i].isUsed)
|
|
{
|
|
rc_material[i].isUsed = true;
|
|
material_id = i;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if(material_id < 0)
|
|
{
|
|
material_id = rc_material.size();
|
|
rc_material_obj nmat;
|
|
nmat.isUsed = true;
|
|
nmat.isReference = true;
|
|
nmat.refActor = actor;
|
|
nmat.refMatNum = material_num;
|
|
rc_material.push_back(nmat);
|
|
}
|
|
else
|
|
{
|
|
rc_material_obj nmat;
|
|
nmat.isUsed = true;
|
|
nmat.isReference = true;
|
|
nmat.refActor = actor;
|
|
nmat.refMatNum = material_num;
|
|
rc_material[material_id] = nmat;
|
|
}
|
|
|
|
return material_id;
|
|
}
|
|
|
|
bool rc_materialExists(int material_id)
|
|
{
|
|
if(material_id < 0 || material_id >= rc_material.size())
|
|
return false;
|
|
|
|
return rc_material[material_id].isUsed;
|
|
}
|
|
|
|
void rc_setMaterialAmbientColor(int material_id, Uint32 color)
|
|
{
|
|
if(material_id < 0 || material_id >= rc_material.size())
|
|
return;
|
|
|
|
if(rc_material[material_id].isReference)
|
|
{
|
|
int refActor = rc_material[material_id].refActor;
|
|
int refMatNum = rc_material[material_id].refMatNum;
|
|
rc_actor[refActor].mesh_node->getMaterial(refMatNum).AmbientColor = irr::video::SColor(color);
|
|
}
|
|
else
|
|
rc_material[material_id].mat.AmbientColor = irr::video::SColor(color);
|
|
}
|
|
|
|
void rc_setMaterialTextureCanvas(int material_id, int level, int canvas_id)
|
|
{
|
|
if(material_id < 0 || material_id >= rc_material.size())
|
|
return;
|
|
|
|
if(canvas_id < 0 || canvas_id >= rc_canvas.size())
|
|
return;
|
|
|
|
if(!rc_canvas[canvas_id].texture)
|
|
return;
|
|
|
|
if(rc_material[material_id].isReference)
|
|
{
|
|
int refActor = rc_material[material_id].refActor;
|
|
int refMatNum = rc_material[material_id].refMatNum;
|
|
rc_actor[refActor].mesh_node->getMaterial(refMatNum).setTexture(level, rc_canvas[canvas_id].texture);
|
|
}
|
|
else
|
|
rc_material[material_id].mat.setTexture(level, rc_canvas[canvas_id].texture);
|
|
}
|
|
|
|
Uint32 rc_getMaterialAmbientColor(int material_id)
|
|
{
|
|
if(material_id < 0 || material_id >= rc_material.size())
|
|
return 0;
|
|
|
|
if(rc_material[material_id].isReference)
|
|
{
|
|
int refActor = rc_material[material_id].refActor;
|
|
int refMatNum = rc_material[material_id].refMatNum;
|
|
return rc_actor[refActor].mesh_node->getMaterial(refMatNum).AmbientColor.color;
|
|
}
|
|
else
|
|
return rc_material[material_id].mat.AmbientColor.color;
|
|
}
|
|
|
|
void rc_setMaterialAntiAliasing(int material_id, int aa)
|
|
{
|
|
if(material_id < 0 || material_id >= rc_material.size())
|
|
return;
|
|
|
|
if(rc_material[material_id].isReference)
|
|
{
|
|
int refActor = rc_material[material_id].refActor;
|
|
int refMatNum = rc_material[material_id].refMatNum;
|
|
rc_actor[refActor].mesh_node->getMaterial(refMatNum).AntiAliasing = aa;
|
|
}
|
|
else
|
|
rc_material[material_id].mat.AntiAliasing = aa;
|
|
}
|
|
|
|
int rc_getMaterialAntiAliasing(int material_id)
|
|
{
|
|
if(material_id < 0 || material_id >= rc_material.size())
|
|
return 0;
|
|
|
|
if(rc_material[material_id].isReference)
|
|
{
|
|
int refActor = rc_material[material_id].refActor;
|
|
int refMatNum = rc_material[material_id].refMatNum;
|
|
return rc_actor[refActor].mesh_node->getMaterial(refMatNum).AntiAliasing;
|
|
}
|
|
else
|
|
return rc_material[material_id].mat.AntiAliasing;
|
|
}
|
|
|
|
void rc_setMaterialBackfaceCulling(int material_id, bool flag)
|
|
{
|
|
if(material_id < 0 || material_id >= rc_material.size())
|
|
return;
|
|
|
|
if(rc_material[material_id].isReference)
|
|
{
|
|
int refActor = rc_material[material_id].refActor;
|
|
int refMatNum = rc_material[material_id].refMatNum;
|
|
rc_actor[refActor].mesh_node->getMaterial(refMatNum).BackfaceCulling = flag;
|
|
}
|
|
else
|
|
rc_material[material_id].mat.BackfaceCulling = flag;
|
|
}
|
|
|
|
bool rc_getMaterialBackfaceCulling(int material_id)
|
|
{
|
|
if(material_id < 0 || material_id >= rc_material.size())
|
|
return false;
|
|
|
|
if(rc_material[material_id].isReference)
|
|
{
|
|
int refActor = rc_material[material_id].refActor;
|
|
int refMatNum = rc_material[material_id].refMatNum;
|
|
return rc_actor[refActor].mesh_node->getMaterial(refMatNum).BackfaceCulling;
|
|
}
|
|
else
|
|
return rc_material[material_id].mat.BackfaceCulling;
|
|
}
|
|
|
|
void rc_setMaterialBlendFactor(int material_id, double bf)
|
|
{
|
|
if(material_id < 0 || material_id >= rc_material.size())
|
|
return;
|
|
|
|
if(rc_material[material_id].isReference)
|
|
{
|
|
int refActor = rc_material[material_id].refActor;
|
|
int refMatNum = rc_material[material_id].refMatNum;
|
|
rc_actor[refActor].mesh_node->getMaterial(refMatNum).BlendFactor = bf;
|
|
}
|
|
else
|
|
rc_material[material_id].mat.BlendFactor = bf;
|
|
}
|
|
|
|
double rc_getMaterialBlendFactor(int material_id)
|
|
{
|
|
if(material_id < 0 || material_id >= rc_material.size())
|
|
return 0;
|
|
|
|
if(rc_material[material_id].isReference)
|
|
{
|
|
int refActor = rc_material[material_id].refActor;
|
|
int refMatNum = rc_material[material_id].refMatNum;
|
|
return rc_actor[refActor].mesh_node->getMaterial(refMatNum).BlendFactor;
|
|
}
|
|
else
|
|
return rc_material[material_id].mat.BlendFactor;
|
|
}
|
|
|
|
void rc_setMaterialBlendMode(int material_id, int blend_mode)
|
|
{
|
|
if(material_id < 0 || material_id >= rc_material.size())
|
|
return;
|
|
|
|
if(rc_material[material_id].isReference)
|
|
{
|
|
int refActor = rc_material[material_id].refActor;
|
|
int refMatNum = rc_material[material_id].refMatNum;
|
|
rc_actor[refActor].mesh_node->getMaterial(refMatNum).BlendOperation = (irr::video::E_BLEND_OPERATION)blend_mode;
|
|
}
|
|
else
|
|
rc_material[material_id].mat.BlendOperation = (irr::video::E_BLEND_OPERATION)blend_mode;
|
|
}
|
|
|
|
int rc_getMaterialBlendMode(int material_id)
|
|
{
|
|
if(material_id < 0 || material_id >= rc_material.size())
|
|
return 0;
|
|
|
|
if(rc_material[material_id].isReference)
|
|
{
|
|
int refActor = rc_material[material_id].refActor;
|
|
int refMatNum = rc_material[material_id].refMatNum;
|
|
return (int)rc_actor[refActor].mesh_node->getMaterial(refMatNum).BlendOperation;
|
|
}
|
|
else
|
|
return (int)rc_material[material_id].mat.BlendOperation;
|
|
}
|
|
|
|
void rc_setMaterialColorMask(int material_id, int color_mask)
|
|
{
|
|
if(material_id < 0 || material_id >= rc_material.size())
|
|
return;
|
|
|
|
if(rc_material[material_id].isReference)
|
|
{
|
|
int refActor = rc_material[material_id].refActor;
|
|
int refMatNum = rc_material[material_id].refMatNum;
|
|
rc_actor[refActor].mesh_node->getMaterial(refMatNum).ColorMask = color_mask;
|
|
}
|
|
else
|
|
rc_material[material_id].mat.ColorMask = color_mask;
|
|
}
|
|
|
|
int rc_getMaterialColorMask(int material_id)
|
|
{
|
|
if(material_id < 0 || material_id >= rc_material.size())
|
|
return 0;
|
|
|
|
if(rc_material[material_id].isReference)
|
|
{
|
|
int refActor = rc_material[material_id].refActor;
|
|
int refMatNum = rc_material[material_id].refMatNum;
|
|
return rc_actor[refActor].mesh_node->getMaterial(refMatNum).ColorMask;
|
|
}
|
|
else
|
|
return rc_material[material_id].mat.ColorMask;
|
|
}
|
|
|
|
void rc_setMaterialColorMode(int material_id, int color_mode)
|
|
{
|
|
if(material_id < 0 || material_id >= rc_material.size())
|
|
return;
|
|
|
|
if(rc_material[material_id].isReference)
|
|
{
|
|
int refActor = rc_material[material_id].refActor;
|
|
int refMatNum = rc_material[material_id].refMatNum;
|
|
rc_actor[refActor].mesh_node->getMaterial(refMatNum).ColorMaterial = (irr::video::E_COLOR_MATERIAL)color_mode;
|
|
}
|
|
else
|
|
rc_material[material_id].mat.ColorMaterial = (irr::video::E_COLOR_MATERIAL)color_mode;
|
|
}
|
|
|
|
int rc_getMaterialColorMode(int material_id)
|
|
{
|
|
if(material_id < 0 || material_id >= rc_material.size())
|
|
return 0;
|
|
|
|
if(rc_material[material_id].isReference)
|
|
{
|
|
int refActor = rc_material[material_id].refActor;
|
|
int refMatNum = rc_material[material_id].refMatNum;
|
|
return (int)rc_actor[refActor].mesh_node->getMaterial(refMatNum).ColorMaterial;
|
|
}
|
|
else
|
|
return (int)rc_material[material_id].mat.ColorMaterial;
|
|
}
|
|
|
|
void rc_setMaterialDiffuseColor(int material_id, Uint32 color)
|
|
{
|
|
if(material_id < 0 || material_id >= rc_material.size())
|
|
return;
|
|
|
|
if(rc_material[material_id].isReference)
|
|
{
|
|
int refActor = rc_material[material_id].refActor;
|
|
int refMatNum = rc_material[material_id].refMatNum;
|
|
rc_actor[refActor].mesh_node->getMaterial(refMatNum).DiffuseColor.set(color);
|
|
}
|
|
else
|
|
rc_material[material_id].mat.DiffuseColor = irr::video::SColor(color);
|
|
}
|
|
|
|
Uint32 rc_getMaterialDiffuseColor(int material_id)
|
|
{
|
|
if(material_id < 0 || material_id >= rc_material.size())
|
|
return 0;
|
|
|
|
if(rc_material[material_id].isReference)
|
|
{
|
|
int refActor = rc_material[material_id].refActor;
|
|
int refMatNum = rc_material[material_id].refMatNum;
|
|
return rc_actor[refActor].mesh_node->getMaterial(refMatNum).DiffuseColor.color;
|
|
}
|
|
else
|
|
return rc_material[material_id].mat.DiffuseColor.color;
|
|
}
|
|
|
|
void rc_setMaterialEmissiveColor(int material_id, Uint32 color)
|
|
{
|
|
if(material_id < 0 || material_id >= rc_material.size())
|
|
return;
|
|
|
|
if(rc_material[material_id].isReference)
|
|
{
|
|
int refActor = rc_material[material_id].refActor;
|
|
int refMatNum = rc_material[material_id].refMatNum;
|
|
rc_actor[refActor].mesh_node->getMaterial(refMatNum).EmissiveColor.set(color);
|
|
}
|
|
else
|
|
rc_material[material_id].mat.EmissiveColor = irr::video::SColor(color);
|
|
}
|
|
|
|
Uint32 rc_getMaterialEmissiveColor(int material_id)
|
|
{
|
|
if(material_id < 0 || material_id >= rc_material.size())
|
|
return 0;
|
|
|
|
if(rc_material[material_id].isReference)
|
|
{
|
|
int refActor = rc_material[material_id].refActor;
|
|
int refMatNum = rc_material[material_id].refMatNum;
|
|
return rc_actor[refActor].mesh_node->getMaterial(refMatNum).EmissiveColor.color;
|
|
}
|
|
else
|
|
return rc_material[material_id].mat.EmissiveColor.color;
|
|
}
|
|
|
|
void rc_setMaterialFog(int material_id, bool flag)
|
|
{
|
|
if(material_id < 0 || material_id >= rc_material.size())
|
|
return;
|
|
|
|
if(rc_material[material_id].isReference)
|
|
{
|
|
int refActor = rc_material[material_id].refActor;
|
|
int refMatNum = rc_material[material_id].refMatNum;
|
|
rc_actor[refActor].mesh_node->getMaterial(refMatNum).FogEnable = flag;
|
|
}
|
|
else
|
|
rc_material[material_id].mat.FogEnable = flag;
|
|
}
|
|
|
|
bool rc_getMaterialFog(int material_id)
|
|
{
|
|
if(material_id < 0 || material_id >= rc_material.size())
|
|
return false;
|
|
|
|
if(rc_material[material_id].isReference)
|
|
{
|
|
int refActor = rc_material[material_id].refActor;
|
|
int refMatNum = rc_material[material_id].refMatNum;
|
|
return rc_actor[refActor].mesh_node->getMaterial(refMatNum).FogEnable;
|
|
}
|
|
else
|
|
return rc_material[material_id].mat.FogEnable;
|
|
}
|
|
|
|
void rc_setMaterialFrontfaceCulling(int material_id, bool flag)
|
|
{
|
|
if(material_id < 0 || material_id >= rc_material.size())
|
|
return;
|
|
|
|
if(rc_material[material_id].isReference)
|
|
{
|
|
int refActor = rc_material[material_id].refActor;
|
|
int refMatNum = rc_material[material_id].refMatNum;
|
|
rc_actor[refActor].mesh_node->getMaterial(refMatNum).FrontfaceCulling = flag;
|
|
}
|
|
else
|
|
rc_material[material_id].mat.FrontfaceCulling = flag;
|
|
}
|
|
|
|
bool rc_getMaterialFrontfaceCulling(int material_id)
|
|
{
|
|
if(material_id < 0 || material_id >= rc_material.size())
|
|
return false;
|
|
|
|
if(rc_material[material_id].isReference)
|
|
{
|
|
int refActor = rc_material[material_id].refActor;
|
|
int refMatNum = rc_material[material_id].refMatNum;
|
|
return rc_actor[refActor].mesh_node->getMaterial(refMatNum).FrontfaceCulling;
|
|
}
|
|
else
|
|
return rc_material[material_id].mat.FrontfaceCulling;
|
|
}
|
|
|
|
void rc_setMaterialGouraudShading(int material_id, bool flag)
|
|
{
|
|
if(material_id < 0 || material_id >= rc_material.size())
|
|
return;
|
|
|
|
if(rc_material[material_id].isReference)
|
|
{
|
|
int refActor = rc_material[material_id].refActor;
|
|
int refMatNum = rc_material[material_id].refMatNum;
|
|
rc_actor[refActor].mesh_node->getMaterial(refMatNum).GouraudShading = flag;
|
|
}
|
|
else
|
|
rc_material[material_id].mat.GouraudShading = flag;
|
|
}
|
|
|
|
bool rc_materialIsGouraudShaded(int material_id)
|
|
{
|
|
if(material_id < 0 || material_id >= rc_material.size())
|
|
return false;
|
|
|
|
if(rc_material[material_id].isReference)
|
|
{
|
|
int refActor = rc_material[material_id].refActor;
|
|
int refMatNum = rc_material[material_id].refMatNum;
|
|
return rc_actor[refActor].mesh_node->getMaterial(refMatNum).GouraudShading;
|
|
}
|
|
else
|
|
return rc_material[material_id].mat.GouraudShading;
|
|
}
|
|
|
|
bool rc_materialIsAplhaBlend(int material_id)
|
|
{
|
|
if(material_id < 0 || material_id >= rc_material.size())
|
|
return false;
|
|
|
|
if(rc_material[material_id].isReference)
|
|
{
|
|
int refActor = rc_material[material_id].refActor;
|
|
int refMatNum = rc_material[material_id].refMatNum;
|
|
return rc_actor[refActor].mesh_node->getMaterial(refMatNum).isAlphaBlendOperation();
|
|
}
|
|
else
|
|
return rc_material[material_id].mat.isAlphaBlendOperation();
|
|
}
|
|
|
|
bool rc_materialIsTransparent(int material_id)
|
|
{
|
|
if(material_id < 0 || material_id >= rc_material.size())
|
|
return false;
|
|
|
|
if(rc_material[material_id].isReference)
|
|
{
|
|
int refActor = rc_material[material_id].refActor;
|
|
int refMatNum = rc_material[material_id].refMatNum;
|
|
return rc_actor[refActor].mesh_node->getMaterial(refMatNum).isTransparent();
|
|
}
|
|
else
|
|
return rc_material[material_id].mat.isTransparent();
|
|
}
|
|
|
|
void rc_setMaterialLighting(int material_id, bool flag)
|
|
{
|
|
if(material_id < 0 || material_id >= rc_material.size())
|
|
return;
|
|
|
|
if(rc_material[material_id].isReference)
|
|
{
|
|
int refActor = rc_material[material_id].refActor;
|
|
int refMatNum = rc_material[material_id].refMatNum;
|
|
rc_actor[refActor].mesh_node->getMaterial(refMatNum).Lighting = flag;
|
|
}
|
|
else
|
|
rc_material[material_id].mat.Lighting = flag;
|
|
}
|
|
|
|
bool rc_materialIsLit(int material_id)
|
|
{
|
|
if(material_id < 0 || material_id >= rc_material.size())
|
|
return false;
|
|
|
|
if(rc_material[material_id].isReference)
|
|
{
|
|
int refActor = rc_material[material_id].refActor;
|
|
int refMatNum = rc_material[material_id].refMatNum;
|
|
return rc_actor[refActor].mesh_node->getMaterial(refMatNum).Lighting;
|
|
}
|
|
else
|
|
return rc_material[material_id].mat.Lighting;
|
|
}
|
|
|
|
void rc_setMaterialType(int material_id, int mat_type)
|
|
{
|
|
if(material_id < 0 || material_id >= rc_material.size())
|
|
return;
|
|
|
|
if(rc_material[material_id].isReference)
|
|
{
|
|
int refActor = rc_material[material_id].refActor;
|
|
int refMatNum = rc_material[material_id].refMatNum;
|
|
rc_actor[refActor].mesh_node->getMaterial(refMatNum).MaterialType = (irr::video::E_MATERIAL_TYPE)mat_type;
|
|
}
|
|
else
|
|
rc_material[material_id].mat.MaterialType = (irr::video::E_MATERIAL_TYPE)mat_type;
|
|
}
|
|
|
|
int rc_getMaterialType(int material_id)
|
|
{
|
|
if(material_id < 0 || material_id >= rc_material.size())
|
|
return 0;
|
|
|
|
if(rc_material[material_id].isReference)
|
|
{
|
|
int refActor = rc_material[material_id].refActor;
|
|
int refMatNum = rc_material[material_id].refMatNum;
|
|
return (int)rc_actor[refActor].mesh_node->getMaterial(refMatNum).MaterialType;
|
|
}
|
|
else
|
|
return (int)rc_material[material_id].mat.MaterialType;
|
|
}
|
|
|
|
void rc_setMaterialNormalize(int material_id, bool flag)
|
|
{
|
|
if(material_id < 0 || material_id >= rc_material.size())
|
|
return;
|
|
|
|
if(rc_material[material_id].isReference)
|
|
{
|
|
int refActor = rc_material[material_id].refActor;
|
|
int refMatNum = rc_material[material_id].refMatNum;
|
|
rc_actor[refActor].mesh_node->getMaterial(refMatNum).NormalizeNormals = flag;
|
|
}
|
|
else
|
|
rc_material[material_id].mat.NormalizeNormals = flag;
|
|
}
|
|
|
|
bool rc_materialIsNormalized(int material_id)
|
|
{
|
|
if(material_id < 0 || material_id >= rc_material.size())
|
|
return false;
|
|
|
|
if(rc_material[material_id].isReference)
|
|
{
|
|
int refActor = rc_material[material_id].refActor;
|
|
int refMatNum = rc_material[material_id].refMatNum;
|
|
return rc_actor[refActor].mesh_node->getMaterial(refMatNum).NormalizeNormals;
|
|
}
|
|
else
|
|
return rc_material[material_id].mat.NormalizeNormals;
|
|
}
|
|
|
|
void rc_setMaterialPointCloud(int material_id, bool flag)
|
|
{
|
|
if(material_id < 0 || material_id >= rc_material.size())
|
|
return;
|
|
|
|
if(rc_material[material_id].isReference)
|
|
{
|
|
int refActor = rc_material[material_id].refActor;
|
|
int refMatNum = rc_material[material_id].refMatNum;
|
|
rc_actor[refActor].mesh_node->getMaterial(refMatNum).PointCloud = flag;
|
|
}
|
|
else
|
|
rc_material[material_id].mat.PointCloud = flag;
|
|
}
|
|
|
|
bool rc_materialIsPointCloud(int material_id)
|
|
{
|
|
if(material_id < 0 || material_id >= rc_material.size())
|
|
return 0;
|
|
|
|
if(rc_material[material_id].isReference)
|
|
{
|
|
int refActor = rc_material[material_id].refActor;
|
|
int refMatNum = rc_material[material_id].refMatNum;
|
|
return rc_actor[refActor].mesh_node->getMaterial(refMatNum).PointCloud;
|
|
}
|
|
else
|
|
return rc_material[material_id].mat.PointCloud;
|
|
}
|
|
|
|
void rc_setMaterialFlag(int material_id, int material_flag, bool f_value)
|
|
{
|
|
if(material_id < 0 || material_id >= rc_material.size())
|
|
return;
|
|
|
|
if(rc_material[material_id].isReference)
|
|
{
|
|
int refActor = rc_material[material_id].refActor;
|
|
int refMatNum = rc_material[material_id].refMatNum;
|
|
rc_actor[refActor].mesh_node->getMaterial(refMatNum).setFlag((irr::video::E_MATERIAL_FLAG)material_flag, f_value);
|
|
}
|
|
else
|
|
rc_material[material_id].mat.setFlag((irr::video::E_MATERIAL_FLAG)material_flag, f_value);
|
|
}
|
|
|
|
bool rc_getMaterialFlag(int material_id, int material_flag)
|
|
{
|
|
if(material_id < 0 || material_id >= rc_material.size())
|
|
return false;
|
|
|
|
if(rc_material[material_id].isReference)
|
|
{
|
|
int refActor = rc_material[material_id].refActor;
|
|
int refMatNum = rc_material[material_id].refMatNum;
|
|
return rc_actor[refActor].mesh_node->getMaterial(refMatNum).getFlag((irr::video::E_MATERIAL_FLAG) material_flag);
|
|
}
|
|
else
|
|
return rc_material[material_id].mat.getFlag((irr::video::E_MATERIAL_FLAG) material_flag);
|
|
}
|
|
|
|
void rc_setMaterialTexture(int material_id, int level, int img_id)
|
|
{
|
|
if(material_id < 0 || material_id >= rc_material.size())
|
|
return;
|
|
|
|
if(level < 0 || level >= irr::video::MATERIAL_MAX_TEXTURES)
|
|
return;
|
|
|
|
if(img_id < 0 || img_id >= rc_image.size())
|
|
return;
|
|
|
|
if(!rc_image[img_id].image)
|
|
return;
|
|
|
|
if(rc_material[material_id].isReference)
|
|
{
|
|
int refActor = rc_material[material_id].refActor;
|
|
int refMatNum = rc_material[material_id].refMatNum;
|
|
rc_actor[refActor].mesh_node->getMaterial(refMatNum).setTexture(level, rc_image[img_id].image);
|
|
}
|
|
else
|
|
rc_material[material_id].mat.setTexture(level, rc_image[img_id].image);
|
|
}
|
|
|
|
void rc_setMaterialShininess(int material_id, double shininess)
|
|
{
|
|
if(material_id < 0 || material_id >= rc_material.size())
|
|
return;
|
|
|
|
|
|
if(rc_material[material_id].isReference)
|
|
{
|
|
int refActor = rc_material[material_id].refActor;
|
|
int refMatNum = rc_material[material_id].refMatNum;
|
|
rc_actor[refActor].mesh_node->getMaterial(refMatNum).Shininess = shininess;
|
|
}
|
|
else
|
|
rc_material[material_id].mat.Shininess = shininess;
|
|
}
|
|
|
|
double rc_getMaterialShininess(int material_id)
|
|
{
|
|
if(material_id < 0 || material_id >= rc_material.size())
|
|
return 0;
|
|
|
|
|
|
if(rc_material[material_id].isReference)
|
|
{
|
|
int refActor = rc_material[material_id].refActor;
|
|
int refMatNum = rc_material[material_id].refMatNum;
|
|
return rc_actor[refActor].mesh_node->getMaterial(refMatNum).Shininess;
|
|
}
|
|
else
|
|
return rc_material[material_id].mat.Shininess;
|
|
}
|
|
|
|
void rc_setMaterialSpecularColor(int material_id, Uint32 color)
|
|
{
|
|
if(material_id < 0 || material_id >= rc_material.size())
|
|
return;
|
|
|
|
if(rc_material[material_id].isReference)
|
|
{
|
|
int refActor = rc_material[material_id].refActor;
|
|
int refMatNum = rc_material[material_id].refMatNum;
|
|
rc_actor[refActor].mesh_node->getMaterial(refMatNum).SpecularColor.set(color);
|
|
}
|
|
else
|
|
rc_material[material_id].mat.SpecularColor = irr::video::SColor(color);
|
|
}
|
|
|
|
Uint32 rc_getMaterialSpecularColor(int material_id)
|
|
{
|
|
if(material_id < 0 || material_id >= rc_material.size())
|
|
return 0;
|
|
|
|
if(rc_material[material_id].isReference)
|
|
{
|
|
int refActor = rc_material[material_id].refActor;
|
|
int refMatNum = rc_material[material_id].refMatNum;
|
|
return rc_actor[refActor].mesh_node->getMaterial(refMatNum).SpecularColor.color;
|
|
}
|
|
else
|
|
return rc_material[material_id].mat.SpecularColor.color;
|
|
}
|
|
|
|
void rc_setMaterialThickness(int material_id, double thickness)
|
|
{
|
|
if(material_id < 0 || material_id >= rc_material.size())
|
|
return;
|
|
|
|
if(rc_material[material_id].isReference)
|
|
{
|
|
int refActor = rc_material[material_id].refActor;
|
|
int refMatNum = rc_material[material_id].refMatNum;
|
|
rc_actor[refActor].mesh_node->getMaterial(refMatNum).Thickness = thickness;
|
|
}
|
|
else
|
|
rc_material[material_id].mat.Thickness = thickness;
|
|
}
|
|
|
|
double rc_getMaterialThickness(int material_id)
|
|
{
|
|
if(material_id < 0 || material_id >= rc_material.size())
|
|
return 0;
|
|
|
|
if(rc_material[material_id].isReference)
|
|
{
|
|
int refActor = rc_material[material_id].refActor;
|
|
int refMatNum = rc_material[material_id].refMatNum;
|
|
return rc_actor[refActor].mesh_node->getMaterial(refMatNum).Thickness;
|
|
}
|
|
else
|
|
return rc_material[material_id].mat.Thickness;
|
|
}
|
|
|
|
void rc_setMaterialWireframe(int material_id, bool flag)
|
|
{
|
|
if(material_id < 0 || material_id >= rc_material.size())
|
|
return;
|
|
|
|
if(rc_material[material_id].isReference)
|
|
{
|
|
int refActor = rc_material[material_id].refActor;
|
|
int refMatNum = rc_material[material_id].refMatNum;
|
|
rc_actor[refActor].mesh_node->getMaterial(refMatNum).Wireframe = flag;
|
|
}
|
|
else
|
|
rc_material[material_id].mat.Wireframe = flag;
|
|
}
|
|
|
|
bool rc_materialIsWireframe(int material_id)
|
|
{
|
|
if(material_id < 0 || material_id >= rc_material.size())
|
|
return false;
|
|
|
|
if(rc_material[material_id].isReference)
|
|
{
|
|
int refActor = rc_material[material_id].refActor;
|
|
int refMatNum = rc_material[material_id].refMatNum;
|
|
return rc_actor[refActor].mesh_node->getMaterial(refMatNum).Wireframe;
|
|
}
|
|
else
|
|
return rc_material[material_id].mat.Wireframe;
|
|
}
|
|
|
|
|
|
|
|
|
|
//get Actor Texture
|
|
int rc_getActorTexture(int actor, int material, int layer)
|
|
{
|
|
if(actor < 0 || actor >= rc_actor.size())
|
|
return -1;
|
|
|
|
if(!rc_actor[actor].mesh_node)
|
|
return -1;
|
|
|
|
rc_image_obj img;
|
|
img.image = rc_actor[actor].mesh_node->getMaterial(material).getTexture(layer);
|
|
|
|
if(img.image == NULL)
|
|
return -1;
|
|
|
|
int img_id = -1;
|
|
|
|
for(int i = 0; i < rc_image.size(); i++)
|
|
{
|
|
if(rc_image[i].image == NULL)
|
|
{
|
|
img_id = i;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if(img_id < 0)
|
|
{
|
|
img_id = rc_image.size();
|
|
rc_image.push_back(img);
|
|
}
|
|
else
|
|
{
|
|
rc_image[img_id] = img;
|
|
}
|
|
|
|
return img_id;
|
|
}
|
|
|
|
|
|
|
|
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());
|
|
|
|
}
|
|
}
|
|
|
|
//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;
|
|
}
|
|
}
|
|
|
|
void rc_setActorGravity(int actor, double x, double y, double z)
|
|
{
|
|
if(actor < 0 || actor >= rc_actor.size())
|
|
return;
|
|
|
|
if(rc_actor[actor].physics.rigid_body)
|
|
{
|
|
rc_actor[actor].physics.rigid_body->setGravity(irr::core::vector3df(x, y, z));
|
|
}
|
|
}
|
|
|
|
void rc_getActorGravity(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)
|
|
{
|
|
irr::core::vector3df gvec = rc_actor[actor].physics.rigid_body->getGravity();
|
|
*x = gvec.X;
|
|
*y = gvec.Y;
|
|
*z = gvec.Z;
|
|
}
|
|
}
|
|
|
|
void rc_setActorDamping(int actor, double lin_damping, double ang_damping)
|
|
{
|
|
if(actor < 0 || actor >= rc_actor.size())
|
|
return;
|
|
|
|
if(rc_actor[actor].physics.rigid_body)
|
|
{
|
|
rc_actor[actor].physics.rigid_body->setDamping(lin_damping, ang_damping);
|
|
}
|
|
}
|
|
|
|
double rc_getActorLinearDamping(int actor)
|
|
{
|
|
if(actor < 0 || actor >= rc_actor.size())
|
|
return 0;
|
|
|
|
if(rc_actor[actor].physics.rigid_body)
|
|
{
|
|
return rc_actor[actor].physics.rigid_body->getLinearDamping();
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
double rc_getActorAngularDamping(int actor)
|
|
{
|
|
if(actor < 0 || actor >= rc_actor.size())
|
|
return 0;
|
|
|
|
if(rc_actor[actor].physics.rigid_body)
|
|
{
|
|
return rc_actor[actor].physics.rigid_body->getAngularDamping();
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
double rc_getActorLinearSleepThreshold(int actor)
|
|
{
|
|
if(actor < 0 || actor >= rc_actor.size())
|
|
return 0;
|
|
|
|
if(rc_actor[actor].physics.rigid_body)
|
|
{
|
|
return rc_actor[actor].physics.rigid_body->getLinearSleepingThreshold();
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
double rc_getActorAngularSleepThreshold(int actor)
|
|
{
|
|
if(actor < 0 || actor >= rc_actor.size())
|
|
return 0;
|
|
|
|
if(rc_actor[actor].physics.rigid_body)
|
|
{
|
|
return rc_actor[actor].physics.rigid_body->getAngularSleepingThreshold();
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
void rc_applyActorDamping(int actor, double timeStep)
|
|
{
|
|
if(actor < 0 || actor >= rc_actor.size())
|
|
return;
|
|
|
|
if(rc_actor[actor].physics.rigid_body)
|
|
{
|
|
rc_actor[actor].physics.rigid_body->applyDamping(timeStep);
|
|
}
|
|
}
|
|
|
|
void rc_setActorMassProperties(int actor, double mass, double inertia_x, double inertia_y, double inertia_z)
|
|
{
|
|
if(actor < 0 || actor >= rc_actor.size())
|
|
return;
|
|
|
|
if(rc_actor[actor].physics.rigid_body)
|
|
{
|
|
rc_physics3D.world->removeCollisionObject(rc_actor[actor].physics.rigid_body, false);
|
|
rc_actor[actor].physics.rigid_body->setMassProps(mass, irr::core::vector3df(inertia_x, inertia_y, inertia_z));
|
|
rc_physics3D.world->addRigidBody(rc_actor[actor].physics.rigid_body);
|
|
}
|
|
rc_actor[actor].physics.mass = mass;
|
|
}
|
|
|
|
void rc_getActorLinearFactor(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)
|
|
{
|
|
irr::core::vector3df lf = rc_actor[actor].physics.rigid_body->getLinearFactor();
|
|
*x = lf.X;
|
|
*y = lf.Y;
|
|
*z = lf.Z;
|
|
}
|
|
}
|
|
|
|
void rc_setActorLinearFactor(int actor, double x, double y, double z)
|
|
{
|
|
if(actor < 0 || actor >= rc_actor.size())
|
|
return;
|
|
|
|
if(rc_actor[actor].physics.rigid_body)
|
|
{
|
|
rc_actor[actor].physics.rigid_body->setLinearFactor(irr::core::vector3df(x, y, z));
|
|
}
|
|
}
|
|
|
|
double rc_getActorInverseMass(int actor)
|
|
{
|
|
if(actor < 0 || actor >= rc_actor.size())
|
|
return 0;
|
|
|
|
if(rc_actor[actor].physics.rigid_body)
|
|
{
|
|
return rc_actor[actor].physics.rigid_body->getInvMass();
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
void rc_integrateActorVelocities(int actor, double step)
|
|
{
|
|
if(actor < 0 || actor >= rc_actor.size())
|
|
return;
|
|
|
|
if(rc_actor[actor].physics.rigid_body)
|
|
{
|
|
rc_actor[actor].physics.rigid_body->integrateVelocities(step);
|
|
}
|
|
}
|
|
|
|
void rc_applyActorCentralForceLocal(int actor, double x, double y, double z)
|
|
{
|
|
if(actor < 0 || actor >= rc_actor.size())
|
|
return;
|
|
|
|
if(rc_actor[actor].physics.rigid_body)
|
|
{
|
|
rc_actor[actor].physics.rigid_body->applyCentralForce(irr::core::vector3df(x,y,z), ERBTransformSpace::ERBTS_LOCAL);
|
|
}
|
|
}
|
|
|
|
void rc_applyActorCentralForceWorld(int actor, double x, double y, double z)
|
|
{
|
|
if(actor < 0 || actor >= rc_actor.size())
|
|
return;
|
|
|
|
if(rc_actor[actor].physics.rigid_body)
|
|
{
|
|
rc_actor[actor].physics.rigid_body->applyCentralForce(irr::core::vector3df(x,y,z), ERBTransformSpace::ERBTS_WORLD);
|
|
}
|
|
}
|
|
|
|
void rc_getActorTotalForce(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)
|
|
{
|
|
irr::core::vector3df f = rc_actor[actor].physics.rigid_body->getTotalForce();
|
|
*x = f.X;
|
|
*y = f.Y;
|
|
*z = f.Z;
|
|
}
|
|
}
|
|
|
|
void rc_getActorTotalTorque(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)
|
|
{
|
|
irr::core::vector3df f = rc_actor[actor].physics.rigid_body->getTotalTorque();
|
|
*x = f.X;
|
|
*y = f.Y;
|
|
*z = f.Z;
|
|
}
|
|
}
|
|
|
|
void rc_getActorInverseInertiaDiagLocal(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)
|
|
{
|
|
irr::core::vector3df f = rc_actor[actor].physics.rigid_body->getInvInertiaDiagLocal();
|
|
*x = f.X;
|
|
*y = f.Y;
|
|
*z = f.Z;
|
|
}
|
|
}
|
|
|
|
void rc_setActorInverseInertiaDiagLocal(int actor, double x, double y, double z)
|
|
{
|
|
if(actor < 0 || actor >= rc_actor.size())
|
|
return;
|
|
|
|
if(rc_actor[actor].physics.rigid_body)
|
|
{
|
|
rc_actor[actor].physics.rigid_body->setInvInertiaDiagLocal(irr::core::vector3df(x,y,z));
|
|
}
|
|
}
|
|
|
|
void rc_setActorSleepThresholds(int actor, double linear, double angular)
|
|
{
|
|
if(actor < 0 || actor >= rc_actor.size())
|
|
return;
|
|
|
|
if(rc_actor[actor].physics.rigid_body)
|
|
{
|
|
rc_actor[actor].physics.rigid_body->setSleepingThresholds(linear, angular);
|
|
}
|
|
}
|
|
|
|
void rc_applyActorTorqueLocal(int actor, double x, double y, double z)
|
|
{
|
|
if(actor < 0 || actor >= rc_actor.size())
|
|
return;
|
|
|
|
if(rc_actor[actor].physics.rigid_body)
|
|
{
|
|
rc_actor[actor].physics.rigid_body->applyTorque(irr::core::vector3df(x,y,z), ERBTransformSpace::ERBTS_LOCAL);
|
|
}
|
|
}
|
|
|
|
void rc_applyActorTorqueWorld(int actor, double x, double y, double z)
|
|
{
|
|
if(actor < 0 || actor >= rc_actor.size())
|
|
return;
|
|
|
|
if(rc_actor[actor].physics.rigid_body)
|
|
{
|
|
rc_actor[actor].physics.rigid_body->applyTorque(irr::core::vector3df(x,y,z), ERBTransformSpace::ERBTS_WORLD);
|
|
}
|
|
}
|
|
|
|
void rc_applyActorForceLocal(int actor, double x, double y, double z, double rel_x, double rel_y, double rel_z)
|
|
{
|
|
if(actor < 0 || actor >= rc_actor.size())
|
|
return;
|
|
|
|
if(rc_actor[actor].physics.rigid_body)
|
|
{
|
|
rc_actor[actor].physics.rigid_body->applyForce(irr::core::vector3df(x,y,z), irr::core::vector3df(rel_x, rel_y, rel_z), ERBTransformSpace::ERBTS_LOCAL);
|
|
}
|
|
}
|
|
|
|
void rc_applyActorForceWorld(int actor, double x, double y, double z, double rel_x, double rel_y, double rel_z)
|
|
{
|
|
if(actor < 0 || actor >= rc_actor.size())
|
|
return;
|
|
|
|
if(rc_actor[actor].physics.rigid_body)
|
|
{
|
|
rc_actor[actor].physics.rigid_body->applyForce(irr::core::vector3df(x,y,z), irr::core::vector3df(rel_x, rel_y, rel_z), ERBTransformSpace::ERBTS_WORLD);
|
|
}
|
|
}
|
|
|
|
void rc_applyActorCentralImpulseLocal(int actor, double x, double y, double z)
|
|
{
|
|
if(actor < 0 || actor >= rc_actor.size())
|
|
return;
|
|
|
|
if(rc_actor[actor].physics.rigid_body)
|
|
{
|
|
rc_actor[actor].physics.rigid_body->applyCentralImpulse(irr::core::vector3df(x,y,z), ERBTransformSpace::ERBTS_LOCAL);
|
|
}
|
|
}
|
|
|
|
void rc_applyActorCentralImpulseWorld(int actor, double x, double y, double z)
|
|
{
|
|
if(actor < 0 || actor >= rc_actor.size())
|
|
return;
|
|
|
|
if(rc_actor[actor].physics.rigid_body)
|
|
{
|
|
rc_actor[actor].physics.rigid_body->applyCentralImpulse(irr::core::vector3df(x,y,z), ERBTransformSpace::ERBTS_WORLD);
|
|
}
|
|
}
|
|
|
|
void rc_applyActorTorqueImpulseLocal(int actor, double x, double y, double z)
|
|
{
|
|
if(actor < 0 || actor >= rc_actor.size())
|
|
return;
|
|
|
|
if(rc_actor[actor].physics.rigid_body)
|
|
{
|
|
rc_actor[actor].physics.rigid_body->applyTorqueImpulse(irr::core::vector3df(x,y,z), ERBTransformSpace::ERBTS_LOCAL);
|
|
}
|
|
}
|
|
|
|
void rc_applyActorTorqueImpulseWorld(int actor, double x, double y, double z)
|
|
{
|
|
if(actor < 0 || actor >= rc_actor.size())
|
|
return;
|
|
|
|
if(rc_actor[actor].physics.rigid_body)
|
|
{
|
|
rc_actor[actor].physics.rigid_body->applyTorqueImpulse(irr::core::vector3df(x,y,z), ERBTransformSpace::ERBTS_WORLD);
|
|
}
|
|
}
|
|
|
|
void rc_applyActorImpulseLocal(int actor, double x, double y, double z, double rel_x, double rel_y, double rel_z)
|
|
{
|
|
if(actor < 0 || actor >= rc_actor.size())
|
|
return;
|
|
|
|
if(rc_actor[actor].physics.rigid_body)
|
|
{
|
|
rc_actor[actor].physics.rigid_body->applyImpulse(irr::core::vector3df(x,y,z), irr::core::vector3df(rel_x, rel_y, rel_z), ERBTransformSpace::ERBTS_LOCAL);
|
|
}
|
|
}
|
|
|
|
void rc_applyActorImpulseWorld(int actor, double x, double y, double z, double rel_x, double rel_y, double rel_z)
|
|
{
|
|
if(actor < 0 || actor >= rc_actor.size())
|
|
return;
|
|
|
|
if(rc_actor[actor].physics.rigid_body)
|
|
{
|
|
rc_actor[actor].physics.rigid_body->applyImpulse(irr::core::vector3df(x,y,z), irr::core::vector3df(rel_x, rel_y, rel_z), ERBTransformSpace::ERBTS_WORLD);
|
|
}
|
|
}
|
|
|
|
void rc_clearActorForces(int actor)
|
|
{
|
|
if(actor < 0 || actor >= rc_actor.size())
|
|
return;
|
|
|
|
if(rc_actor[actor].physics.rigid_body)
|
|
{
|
|
rc_actor[actor].physics.rigid_body->clearForces();
|
|
}
|
|
}
|
|
|
|
void rc_updateActorInertiaTensor(int actor)
|
|
{
|
|
if(actor < 0 || actor >= rc_actor.size())
|
|
return;
|
|
|
|
if(rc_actor[actor].physics.rigid_body)
|
|
{
|
|
rc_actor[actor].physics.rigid_body->updateInertiaTensor();
|
|
}
|
|
}
|
|
|
|
void rc_getActorCOMPosition(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)
|
|
{
|
|
irr::core::vector3df pos = rc_actor[actor].physics.rigid_body->getCenterOfMassPosition();
|
|
*x = pos.X;
|
|
*y = pos.Y;
|
|
*z = pos.Z;
|
|
}
|
|
}
|
|
|
|
void rc_getActorRotationQ(int actor, double* x, double* y, double* z, double* w)
|
|
{
|
|
if(actor < 0 || actor >= rc_actor.size())
|
|
return;
|
|
|
|
*x = 0;
|
|
*y = 0;
|
|
*z = 0;
|
|
*w = 0;
|
|
|
|
if(rc_actor[actor].physics.rigid_body)
|
|
{
|
|
irr::core::quaternion q = rc_actor[actor].physics.rigid_body->getOrientation();
|
|
*x = q.X;
|
|
*y = q.Y;
|
|
*z = q.Z;
|
|
*w = q.W;
|
|
}
|
|
}
|
|
|
|
void rc_getActorLinearVelocityWorld(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)
|
|
{
|
|
irr::core::vector3df pos = rc_actor[actor].physics.rigid_body->getLinearVelocity();
|
|
*x = pos.X;
|
|
*y = pos.Y;
|
|
*z = pos.Z;
|
|
}
|
|
}
|
|
|
|
void rc_getActorAngularVelocityWorld(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)
|
|
{
|
|
irr::core::vector3df pos = rc_actor[actor].physics.rigid_body->getAngularVelocity();
|
|
*x = pos.X;
|
|
*y = pos.Y;
|
|
*z = pos.Z;
|
|
}
|
|
}
|
|
|
|
void rc_setActorLinearVelocityLocal(int actor, double x, double y, double z)
|
|
{
|
|
if(actor < 0 || actor >= rc_actor.size())
|
|
return;
|
|
|
|
if(rc_actor[actor].physics.rigid_body)
|
|
{
|
|
rc_actor[actor].physics.rigid_body->setLinearVelocity(irr::core::vector3df(x, y, z), ERBTransformSpace::ERBTS_LOCAL);
|
|
}
|
|
}
|
|
|
|
void rc_setActorLinearVelocityWorld(int actor, double x, double y, double z)
|
|
{
|
|
if(actor < 0 || actor >= rc_actor.size())
|
|
return;
|
|
|
|
if(rc_actor[actor].physics.rigid_body)
|
|
{
|
|
rc_actor[actor].physics.rigid_body->setLinearVelocity(irr::core::vector3df(x, y, z), ERBTransformSpace::ERBTS_WORLD);
|
|
}
|
|
}
|
|
|
|
void rc_setActorAngularVelocityLocal(int actor, double x, double y, double z)
|
|
{
|
|
if(actor < 0 || actor >= rc_actor.size())
|
|
return;
|
|
|
|
if(rc_actor[actor].physics.rigid_body)
|
|
{
|
|
rc_actor[actor].physics.rigid_body->setAngularVelocity(irr::core::vector3df(x, y, z), ERBTransformSpace::ERBTS_LOCAL);
|
|
}
|
|
}
|
|
|
|
void rc_setActorAngularVelocityWorld(int actor, double x, double y, double z)
|
|
{
|
|
if(actor < 0 || actor >= rc_actor.size())
|
|
return;
|
|
|
|
if(rc_actor[actor].physics.rigid_body)
|
|
{
|
|
rc_actor[actor].physics.rigid_body->setAngularVelocity(irr::core::vector3df(x, y, z), ERBTransformSpace::ERBTS_WORLD);
|
|
}
|
|
}
|
|
|
|
void rc_getActorLocalPointVelocity(int actor, double rel_x, double rel_y, double rel_z, 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)
|
|
{
|
|
irr::core::vector3df pos = rc_actor[actor].physics.rigid_body->getVelocityInLocalPoint(irr::core::vector3df(rel_x, rel_y, rel_z));
|
|
*x = pos.X;
|
|
*y = pos.Y;
|
|
*z = pos.Z;
|
|
}
|
|
}
|
|
|
|
void rc_getActorLinearVelocityLocal(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)
|
|
{
|
|
btVector3 v = rc_actor[actor].physics.rigid_body->getPointer()->getWorldTransform().getBasis().transpose() * rc_actor[actor].physics.rigid_body->getPointer()->getLinearVelocity();
|
|
*x = v.getX();
|
|
*y = v.getY();
|
|
*z = v.getZ();
|
|
}
|
|
}
|
|
|
|
void rc_getActorAngularVelocityLocal(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)
|
|
{
|
|
btVector3 v = rc_actor[actor].physics.rigid_body->getPointer()->getWorldTransform().getBasis().transpose() * rc_actor[actor].physics.rigid_body->getPointer()->getAngularVelocity();
|
|
*x = v.getX();
|
|
*y = v.getY();
|
|
*z = v.getZ();
|
|
}
|
|
}
|
|
|
|
void rc_getActorAABB(int actor, 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;
|
|
|
|
if(rc_actor[actor].physics.rigid_body)
|
|
{
|
|
irr::core::vector3df min_aabb;
|
|
irr::core::vector3df max_aabb;
|
|
rc_actor[actor].physics.rigid_body->getAabb(min_aabb, max_aabb);
|
|
*min_x = min_aabb.X;
|
|
*min_y = min_aabb.Y;
|
|
*min_z = min_aabb.Z;
|
|
*max_x = max_aabb.X;
|
|
*max_y = max_aabb.Y;
|
|
*max_z = max_aabb.Z;
|
|
}
|
|
}
|
|
|
|
double rc_computeActorImpulseDenominator(int actor, double pos_x, double pos_y, double pos_z, double normal_x, double normal_y, double normal_z)
|
|
{
|
|
if(actor < 0 || actor >= rc_actor.size())
|
|
return 0;
|
|
|
|
if(rc_actor[actor].physics.rigid_body)
|
|
{
|
|
return rc_actor[actor].physics.rigid_body->computeImpulseDenominator(irr::core::vector3df(pos_x, pos_y, pos_z), irr::core::vector3df(normal_x, normal_y, normal_z));
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
double rc_computeActorAngularImpulseDenominator(int actor, double x, double y, double z)
|
|
{
|
|
if(actor < 0 || actor >= rc_actor.size())
|
|
return 0;
|
|
|
|
if(rc_actor[actor].physics.rigid_body)
|
|
{
|
|
return rc_actor[actor].physics.rigid_body->computeAngularImpulseDenominator(irr::core::vector3df(x, y, z));
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
void rc_setActorAngularFactor(int actor, double x, double y, double z)
|
|
{
|
|
if(actor < 0 || actor >= rc_actor.size())
|
|
return;
|
|
|
|
if(rc_actor[actor].physics.rigid_body)
|
|
{
|
|
rc_actor[actor].physics.rigid_body->setAngularFactor(irr::core::vector3df(x, y, z));
|
|
}
|
|
}
|
|
|
|
void rc_getActorAngularFactor(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)
|
|
{
|
|
irr::core::vector3df af = rc_actor[actor].physics.rigid_body->getAngularFactor();
|
|
*x = af.X;
|
|
*y = af.Y;
|
|
*z = af.Z;
|
|
}
|
|
}
|
|
|
|
void rc_computeActorGyroImpulseLocal(int actor, double step, 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)
|
|
{
|
|
btVector3 v = rc_actor[actor].physics.rigid_body->getPointer()->computeGyroscopicImpulseImplicit_Body(step);
|
|
*x = v.getX();
|
|
*y = v.getY();
|
|
*z = v.getZ();
|
|
}
|
|
}
|
|
|
|
void rc_computeActorGyroImpulseWorld(int actor, double dt, 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)
|
|
{
|
|
btVector3 v = rc_actor[actor].physics.rigid_body->getPointer()->computeGyroscopicImpulseImplicit_World(dt);
|
|
*x = v.getX();
|
|
*y = v.getY();
|
|
*z = v.getZ();
|
|
}
|
|
}
|
|
|
|
void rc_getActorLocalInertia(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)
|
|
{
|
|
btVector3 v = rc_actor[actor].physics.rigid_body->getPointer()->getLocalInertia();
|
|
*x = v.getX();
|
|
*y = v.getY();
|
|
*z = v.getZ();
|
|
}
|
|
}
|
|
|
|
int getConstraintId()
|
|
{
|
|
int cid = -1;
|
|
for(int i = 0; i < rc_physics3D.constraints.size(); i++)
|
|
{
|
|
if(rc_physics3D.constraints[i].type <= 0)
|
|
{
|
|
cid = i;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if(cid >= 0)
|
|
return cid;
|
|
|
|
rc_constraint_obj constraint;
|
|
cid = rc_physics3D.constraints.size();
|
|
rc_physics3D.constraints.push_back(constraint);
|
|
return cid;
|
|
}
|
|
|
|
int rc_createPointConstraint(int actorA, double pxA, double pyA, double pzA)
|
|
{
|
|
if(actorA < 0 || actorA >= rc_actor.size())
|
|
return -1;
|
|
|
|
if(rc_actor[actorA].physics.rigid_body)
|
|
{
|
|
rc_constraint_obj p2p;
|
|
p2p.type = RC_CONSTRAINT_TYPE_POINT;
|
|
btVector3 pvtA(pxA, pyA, pzA);
|
|
p2p.constraint = new btPoint2PointConstraint(*rc_actor[actorA].physics.rigid_body->getPointer(), pvtA);
|
|
rc_physics3D.world->getPointer()->addConstraint(p2p.constraint);
|
|
int constraint_id = getConstraintId();
|
|
rc_physics3D.constraints[constraint_id] = p2p;
|
|
return constraint_id;
|
|
}
|
|
|
|
return -1;
|
|
}
|
|
|
|
int rc_createPointConstraintEx(int actorA, int actorB, double pxA, double pyA, double pzA, double pxB, double pyB, double pzB)
|
|
{
|
|
if(actorA < 0 || actorA >= rc_actor.size() || actorB < 0 || actorB >= rc_actor.size())
|
|
return -1;
|
|
|
|
if(rc_actor[actorA].physics.rigid_body && rc_actor[actorB].physics.rigid_body)
|
|
{
|
|
rc_constraint_obj p2p;
|
|
p2p.type = RC_CONSTRAINT_TYPE_POINT;
|
|
btVector3 pvtA(pxA, pyA, pzA);
|
|
btVector3 pvtB(pxB, pyB, pzB);
|
|
p2p.constraint = new btPoint2PointConstraint(*rc_actor[actorA].physics.rigid_body->getPointer(), *rc_actor[actorB].physics.rigid_body->getPointer(),
|
|
pvtA, pvtB);
|
|
rc_physics3D.world->getPointer()->addConstraint(p2p.constraint);
|
|
int constraint_id = getConstraintId();
|
|
rc_physics3D.constraints[constraint_id] = p2p;
|
|
return constraint_id;
|
|
}
|
|
|
|
return -1;
|
|
}
|
|
|
|
void rc_setPointPivotA(int constraint_id, double x, double y, double z)
|
|
{
|
|
if(constraint_id < 0 || constraint_id >= rc_physics3D.constraints.size())
|
|
return;
|
|
|
|
if(rc_physics3D.constraints[constraint_id].type == RC_CONSTRAINT_TYPE_POINT)
|
|
{
|
|
btPoint2PointConstraint* c = (btPoint2PointConstraint*)rc_physics3D.constraints[constraint_id].constraint;
|
|
c->setPivotA(btVector3(x, y, z));
|
|
}
|
|
}
|
|
|
|
void rc_setPointPivotB(int constraint_id, double x, double y, double z)
|
|
{
|
|
if(constraint_id < 0 || constraint_id >= rc_physics3D.constraints.size())
|
|
return;
|
|
|
|
if(rc_physics3D.constraints[constraint_id].type == RC_CONSTRAINT_TYPE_POINT)
|
|
{
|
|
btPoint2PointConstraint* c = (btPoint2PointConstraint*)rc_physics3D.constraints[constraint_id].constraint;
|
|
c->setPivotB(btVector3(x, y, z));
|
|
}
|
|
}
|
|
|
|
int rc_createHingeConstraint(int actorA, int frameInA_matrix, bool useReferenceFrameA)
|
|
{
|
|
if(actorA < 0 || actorA >= rc_actor.size())
|
|
return -1;
|
|
|
|
if(rc_actor[actorA].physics.rigid_body)
|
|
{
|
|
rc_constraint_obj hinge;
|
|
hinge.type = RC_CONSTRAINT_TYPE_HINGE;
|
|
|
|
irr::core::matrix4 irr_matA = rc_convertToIrrMatrix(frameInA_matrix);
|
|
btTransform frameInA;
|
|
btTransformFromIrrlichtMatrix(irr_matA, frameInA);
|
|
|
|
hinge.constraint = new btHingeConstraint(*rc_actor[actorA].physics.rigid_body->getPointer(), frameInA, useReferenceFrameA);
|
|
rc_physics3D.world->getPointer()->addConstraint(hinge.constraint);
|
|
int constraint_id = getConstraintId();
|
|
rc_physics3D.constraints[constraint_id] = hinge;
|
|
return constraint_id;
|
|
}
|
|
|
|
return -1;
|
|
}
|
|
|
|
|
|
int rc_createHingeConstraintEx(int actorA, int actorB, int frameInA_matrix, int frameInB_matrix, bool useReferenceFrameA)
|
|
{
|
|
if(actorA < 0 || actorA >= rc_actor.size() || actorB < 0 || actorB >= rc_actor.size())
|
|
return -1;
|
|
|
|
if(rc_actor[actorA].physics.rigid_body && rc_actor[actorB].physics.rigid_body)
|
|
{
|
|
rc_constraint_obj hinge;
|
|
hinge.type = RC_CONSTRAINT_TYPE_HINGE;
|
|
|
|
irr::core::matrix4 irr_matA = rc_convertToIrrMatrix(frameInA_matrix);
|
|
irr::core::matrix4 irr_matB = rc_convertToIrrMatrix(frameInB_matrix);
|
|
|
|
btTransform frameInA, frameInB;
|
|
btTransformFromIrrlichtMatrix(irr_matA, frameInA);
|
|
btTransformFromIrrlichtMatrix(irr_matB, frameInB);
|
|
|
|
hinge.constraint = new btHingeConstraint(*rc_actor[actorA].physics.rigid_body->getPointer(), *rc_actor[actorB].physics.rigid_body->getPointer(), frameInA, frameInB, useReferenceFrameA);
|
|
rc_physics3D.world->getPointer()->addConstraint(hinge.constraint);
|
|
int constraint_id = getConstraintId();
|
|
rc_physics3D.constraints[constraint_id] = hinge;
|
|
return constraint_id;
|
|
}
|
|
|
|
return -1;
|
|
}
|
|
|
|
int rc_createSlideConstraint(int actorA, int frameInB_matrix, bool useLinearReferenceFrameA)
|
|
{
|
|
if(actorA < 0 || actorA >= rc_actor.size())
|
|
return -1;
|
|
|
|
if(rc_actor[actorA].physics.rigid_body)
|
|
{
|
|
rc_constraint_obj slide;
|
|
slide.type = RC_CONSTRAINT_TYPE_SLIDER;
|
|
|
|
irr::core::matrix4 irr_mat = rc_convertToIrrMatrix(frameInB_matrix);
|
|
btTransform frameInB;
|
|
btTransformFromIrrlichtMatrix(irr_mat, frameInB);
|
|
|
|
slide.constraint = new btSliderConstraint(*rc_actor[actorA].physics.rigid_body->getPointer(), frameInB, useLinearReferenceFrameA);
|
|
rc_physics3D.world->getPointer()->addConstraint(slide.constraint);
|
|
int constraint_id = getConstraintId();
|
|
rc_physics3D.constraints[constraint_id] = slide;
|
|
return constraint_id;
|
|
}
|
|
|
|
return -1;
|
|
}
|
|
|
|
int rc_createSlideConstraintEx(int actorA, int actorB, int frameInA_matrix, int frameInB_matrix, bool useLinearReferenceFrameA)
|
|
{
|
|
if(actorA < 0 || actorA >= rc_actor.size() || actorB < 0 || actorB >= rc_actor.size())
|
|
return -1;
|
|
|
|
if(rc_actor[actorA].physics.rigid_body && rc_actor[actorB].physics.rigid_body)
|
|
{
|
|
rc_constraint_obj slide;
|
|
slide.type = RC_CONSTRAINT_TYPE_SLIDER;
|
|
|
|
irr::core::matrix4 irr_matA = rc_convertToIrrMatrix(frameInA_matrix);
|
|
irr::core::matrix4 irr_matB = rc_convertToIrrMatrix(frameInB_matrix);
|
|
|
|
btTransform frameInA, frameInB;
|
|
btTransformFromIrrlichtMatrix(irr_matA, frameInA);
|
|
btTransformFromIrrlichtMatrix(irr_matB, frameInB);
|
|
|
|
slide.constraint = new btSliderConstraint(*rc_actor[actorA].physics.rigid_body->getPointer(), *rc_actor[actorB].physics.rigid_body->getPointer(), frameInA, frameInB, useLinearReferenceFrameA);
|
|
rc_physics3D.world->getPointer()->addConstraint(slide.constraint);
|
|
int constraint_id = getConstraintId();
|
|
rc_physics3D.constraints[constraint_id] = slide;
|
|
return constraint_id;
|
|
}
|
|
|
|
return -1;
|
|
}
|
|
|
|
|
|
int rc_createConeConstraint(int actorA, int rbAFrame_matrix)
|
|
{
|
|
if(actorA < 0 || actorA >= rc_actor.size())
|
|
return -1;
|
|
|
|
if(rc_actor[actorA].physics.rigid_body)
|
|
{
|
|
rc_constraint_obj cone;
|
|
cone.type = RC_CONSTRAINT_TYPE_CONE;
|
|
|
|
irr::core::matrix4 irr_matA = rc_convertToIrrMatrix(rbAFrame_matrix);
|
|
|
|
btTransform rba;
|
|
btTransformFromIrrlichtMatrix(irr_matA, rba);
|
|
|
|
cone.constraint = new btConeTwistConstraint(*rc_actor[actorA].physics.rigid_body->getPointer(), rba);
|
|
rc_physics3D.world->getPointer()->addConstraint(cone.constraint);
|
|
int constraint_id = getConstraintId();
|
|
rc_physics3D.constraints[constraint_id] = cone;
|
|
return constraint_id;
|
|
}
|
|
|
|
return -1;
|
|
}
|
|
|
|
int rc_createConeConstraintEx(int actorA, int actorB, int rbAFrame_matrix, int rbBFrame_matrix)
|
|
{
|
|
if(actorA < 0 || actorA >= rc_actor.size() || actorB < 0 || actorB >= rc_actor.size())
|
|
return -1;
|
|
|
|
if(rc_actor[actorA].physics.rigid_body && rc_actor[actorB].physics.rigid_body)
|
|
{
|
|
rc_constraint_obj cone;
|
|
cone.type = RC_CONSTRAINT_TYPE_CONE;
|
|
|
|
irr::core::matrix4 irr_matA = rc_convertToIrrMatrix(rbAFrame_matrix);
|
|
irr::core::matrix4 irr_matB = rc_convertToIrrMatrix(rbBFrame_matrix);
|
|
|
|
btTransform rba, rbb;
|
|
btTransformFromIrrlichtMatrix(irr_matA, rba);
|
|
btTransformFromIrrlichtMatrix(irr_matB, rbb);
|
|
|
|
cone.constraint = new btConeTwistConstraint(*rc_actor[actorA].physics.rigid_body->getPointer(), *rc_actor[actorB].physics.rigid_body->getPointer(), rba, rbb);
|
|
rc_physics3D.world->getPointer()->addConstraint(cone.constraint);
|
|
int constraint_id = getConstraintId();
|
|
rc_physics3D.constraints[constraint_id] = cone;
|
|
return constraint_id;
|
|
}
|
|
|
|
return -1;
|
|
}
|
|
|
|
void rc_deleteConstraint(int constraint_id)
|
|
{
|
|
if(constraint_id < 0 || constraint_id >= rc_physics3D.constraints.size())
|
|
return;
|
|
|
|
if(rc_physics3D.constraints[constraint_id].constraint)
|
|
{
|
|
rc_physics3D.world->getPointer()->removeConstraint(rc_physics3D.constraints[constraint_id].constraint);
|
|
rc_physics3D.constraints[constraint_id].constraint = NULL;
|
|
rc_physics3D.constraints[constraint_id].type = 0;
|
|
}
|
|
}
|
|
|
|
bool rc_constraintExists(int constraint_id)
|
|
{
|
|
if(constraint_id < 0 || constraint_id >= rc_physics3D.constraints.size())
|
|
return false;
|
|
|
|
if(rc_physics3D.constraints[constraint_id].constraint)
|
|
return true;
|
|
|
|
return false;
|
|
}
|
|
|
|
|
|
void rc_getConstraintFrameOffsetA(int constraint_id, double* x, double* y, double* z, double* rx, double* ry, double* rz)
|
|
{
|
|
if(constraint_id < 0 || constraint_id >= rc_physics3D.constraints.size())
|
|
return;
|
|
|
|
*x = 0;
|
|
*y = 0;
|
|
*z = 0;
|
|
|
|
*rx = 0;
|
|
*ry = 0;
|
|
*rz = 0;
|
|
|
|
if(rc_physics3D.constraints[constraint_id].type == RC_CONSTRAINT_TYPE_HINGE)
|
|
{
|
|
btHingeConstraint* hinge = (btHingeConstraint*)rc_physics3D.constraints[constraint_id].constraint;
|
|
//btTransform t = hinge->getFrameOffsetA();
|
|
//t.getBasis().getEulerZYX()
|
|
*x = hinge->getFrameOffsetA().getOrigin().getX();
|
|
*y = hinge->getFrameOffsetA().getOrigin().getY();
|
|
*z = hinge->getFrameOffsetA().getOrigin().getZ();
|
|
|
|
btScalar yaw, pitch, roll;
|
|
hinge->getFrameOffsetA().getBasis().getEulerZYX(yaw, pitch, roll);
|
|
*rx = roll;
|
|
*ry = pitch;
|
|
*rz = yaw;
|
|
}
|
|
else if(rc_physics3D.constraints[constraint_id].type == RC_CONSTRAINT_TYPE_CONE)
|
|
{
|
|
btConeTwistConstraint* cone = (btConeTwistConstraint*)rc_physics3D.constraints[constraint_id].constraint;
|
|
*x = cone->getFrameOffsetA().getOrigin().getX();
|
|
*y = cone->getFrameOffsetA().getOrigin().getY();
|
|
*z = cone->getFrameOffsetA().getOrigin().getZ();
|
|
|
|
btScalar yaw, pitch, roll;
|
|
cone->getFrameOffsetA().getBasis().getEulerZYX(yaw, pitch, roll);
|
|
*rx = roll;
|
|
*ry = pitch;
|
|
*rz = yaw;
|
|
}
|
|
else if(rc_physics3D.constraints[constraint_id].type == RC_CONSTRAINT_TYPE_SLIDER)
|
|
{
|
|
btSliderConstraint* slide = (btSliderConstraint*)rc_physics3D.constraints[constraint_id].constraint;
|
|
*x = slide->getFrameOffsetA().getOrigin().getX();
|
|
*y = slide->getFrameOffsetA().getOrigin().getY();
|
|
*z = slide->getFrameOffsetA().getOrigin().getZ();
|
|
|
|
btScalar yaw, pitch, roll;
|
|
slide->getFrameOffsetA().getBasis().getEulerZYX(yaw, pitch, roll);
|
|
*rx = roll;
|
|
*ry = pitch;
|
|
*rz = yaw;
|
|
}
|
|
}
|
|
|
|
void rc_getConstraintFrameOffsetB(int constraint_id, double* x, double* y, double* z, double* rx, double* ry, double* rz)
|
|
{
|
|
if(constraint_id < 0 || constraint_id >= rc_physics3D.constraints.size())
|
|
return;
|
|
|
|
*x = 0;
|
|
*y = 0;
|
|
*z = 0;
|
|
|
|
*rx = 0;
|
|
*ry = 0;
|
|
*rz = 0;
|
|
|
|
if(rc_physics3D.constraints[constraint_id].type == RC_CONSTRAINT_TYPE_HINGE)
|
|
{
|
|
btHingeConstraint* hinge = (btHingeConstraint*)rc_physics3D.constraints[constraint_id].constraint;
|
|
*x = hinge->getFrameOffsetB().getOrigin().getX();
|
|
*y = hinge->getFrameOffsetB().getOrigin().getY(); btTransform:
|
|
*z = hinge->getFrameOffsetB().getOrigin().getZ();
|
|
|
|
btScalar yaw, pitch, roll;
|
|
hinge->getFrameOffsetB().getBasis().getEulerZYX(yaw, pitch, roll);
|
|
*rx = roll;
|
|
*ry = pitch;
|
|
*rz = yaw;
|
|
}
|
|
else if(rc_physics3D.constraints[constraint_id].type == RC_CONSTRAINT_TYPE_CONE)
|
|
{
|
|
btConeTwistConstraint* cone = (btConeTwistConstraint*)rc_physics3D.constraints[constraint_id].constraint;
|
|
*x = cone->getFrameOffsetB().getOrigin().getX();
|
|
*y = cone->getFrameOffsetB().getOrigin().getY();
|
|
*z = cone->getFrameOffsetB().getOrigin().getZ();
|
|
|
|
btScalar yaw, pitch, roll;
|
|
cone->getFrameOffsetB().getBasis().getEulerZYX(yaw, pitch, roll);
|
|
*rx = roll;
|
|
*ry = pitch;
|
|
*rz = yaw;
|
|
}
|
|
else if(rc_physics3D.constraints[constraint_id].type == RC_CONSTRAINT_TYPE_SLIDER)
|
|
{
|
|
btSliderConstraint* slide = (btSliderConstraint*)rc_physics3D.constraints[constraint_id].constraint;
|
|
*x = slide->getFrameOffsetB().getOrigin().getX();
|
|
*y = slide->getFrameOffsetB().getOrigin().getY();
|
|
*z = slide->getFrameOffsetB().getOrigin().getZ();
|
|
|
|
btScalar yaw, pitch, roll;
|
|
slide->getFrameOffsetB().getBasis().getEulerZYX(yaw, pitch, roll);
|
|
*rx = roll;
|
|
*ry = pitch;
|
|
*rz = yaw;
|
|
}
|
|
}
|
|
|
|
|
|
void rc_useConstraintFrameOffset(int constraint_id, bool flag)
|
|
{
|
|
if(constraint_id < 0 || constraint_id >= rc_physics3D.constraints.size())
|
|
return;
|
|
|
|
if(rc_physics3D.constraints[constraint_id].type == RC_CONSTRAINT_TYPE_HINGE)
|
|
{
|
|
btHingeConstraint* hinge = (btHingeConstraint*) rc_physics3D.constraints[constraint_id].constraint;
|
|
hinge->setUseFrameOffset(flag);
|
|
}
|
|
else if(rc_physics3D.constraints[constraint_id].type == RC_CONSTRAINT_TYPE_SLIDER)
|
|
{
|
|
btSliderConstraint* slide = (btSliderConstraint*) rc_physics3D.constraints[constraint_id].constraint;
|
|
slide->setUseFrameOffset(flag);
|
|
}
|
|
}
|
|
|
|
//btHingeConstraint::getHingeAngle()
|
|
double rc_getHingeAngle(int constraint_id)
|
|
{
|
|
if(constraint_id < 0 || constraint_id >= rc_physics3D.constraints.size())
|
|
return 0;
|
|
|
|
if(rc_physics3D.constraints[constraint_id].type == RC_CONSTRAINT_TYPE_HINGE)
|
|
{
|
|
btHingeConstraint* hinge = (btHingeConstraint*) rc_physics3D.constraints[constraint_id].constraint;
|
|
return hinge->getHingeAngle();
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
double rc_getHingeAngleEx(int constraint_id, int t_matrixA, int t_matrixB)
|
|
{
|
|
if(constraint_id < 0 || constraint_id >= rc_physics3D.constraints.size())
|
|
return 0;
|
|
|
|
if(rc_physics3D.constraints[constraint_id].type == RC_CONSTRAINT_TYPE_HINGE)
|
|
{
|
|
btHingeConstraint* hinge = (btHingeConstraint*) rc_physics3D.constraints[constraint_id].constraint;
|
|
btTransform transformA, transformB;
|
|
irr::core::matrix4 irr_matA = rc_convertToIrrMatrix(t_matrixA);
|
|
irr::core::matrix4 irr_matB = rc_convertToIrrMatrix(t_matrixB);
|
|
btTransformFromIrrlichtMatrix(irr_matA, transformA);
|
|
btTransformFromIrrlichtMatrix(irr_matB, transformB);
|
|
return hinge->getHingeAngle(transformA, transformB);
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
//btHingeConstraint::getBreakingImpulseThreshold()
|
|
double rc_getConstraintBreakingImpulseThreshold(int constraint_id)
|
|
{
|
|
if(constraint_id < 0 || constraint_id >= rc_physics3D.constraints.size())
|
|
return 0;
|
|
|
|
if(rc_physics3D.constraints[constraint_id].type == RC_CONSTRAINT_TYPE_HINGE)
|
|
{
|
|
btHingeConstraint* hinge = (btHingeConstraint*) rc_physics3D.constraints[constraint_id].constraint;
|
|
return hinge->getBreakingImpulseThreshold();
|
|
}
|
|
else if(rc_physics3D.constraints[constraint_id].type == RC_CONSTRAINT_TYPE_POINT)
|
|
{
|
|
btPoint2PointConstraint* p2p = (btPoint2PointConstraint*) rc_physics3D.constraints[constraint_id].constraint;
|
|
return p2p->getBreakingImpulseThreshold();
|
|
}
|
|
else if(rc_physics3D.constraints[constraint_id].type == RC_CONSTRAINT_TYPE_CONE)
|
|
{
|
|
btConeTwistConstraint* cone = (btConeTwistConstraint*) rc_physics3D.constraints[constraint_id].constraint;
|
|
return cone->getBreakingImpulseThreshold();
|
|
}
|
|
else if(rc_physics3D.constraints[constraint_id].type == RC_CONSTRAINT_TYPE_SLIDER)
|
|
{
|
|
btSliderConstraint* slide = (btSliderConstraint*) rc_physics3D.constraints[constraint_id].constraint;
|
|
return slide->getBreakingImpulseThreshold();
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
//btHingeConstraint::getAFrame()
|
|
int rc_getConstraintAFrame(int constraint_id, int mA)
|
|
{
|
|
if(constraint_id < 0 || constraint_id >= rc_physics3D.constraints.size())
|
|
return -1;
|
|
|
|
if(rc_physics3D.constraints[constraint_id].type == RC_CONSTRAINT_TYPE_HINGE)
|
|
{
|
|
btHingeConstraint* hinge = (btHingeConstraint*) rc_physics3D.constraints[constraint_id].constraint;
|
|
btTransform aframe = hinge->getAFrame();
|
|
irr::core::matrix4 irr_mat;
|
|
btTransformToIrrlichtMatrix(aframe, irr_mat);
|
|
mA = rc_convertFromIrrMatrix(irr_mat, mA);
|
|
return mA;
|
|
}
|
|
else if(rc_physics3D.constraints[constraint_id].type == RC_CONSTRAINT_TYPE_CONE)
|
|
{
|
|
btConeTwistConstraint* cone = (btConeTwistConstraint*) rc_physics3D.constraints[constraint_id].constraint;
|
|
btTransform aframe = cone->getAFrame();
|
|
irr::core::matrix4 irr_mat;
|
|
btTransformToIrrlichtMatrix(aframe, irr_mat);
|
|
mA = rc_convertFromIrrMatrix(irr_mat, mA);
|
|
return mA;
|
|
}
|
|
|
|
return -1;
|
|
}
|
|
|
|
//btHingeConstraint::getBFrame()
|
|
int rc_getConstraintBFrame(int constraint_id, int mA)
|
|
{
|
|
if(constraint_id < 0 || constraint_id >= rc_physics3D.constraints.size())
|
|
return -1;
|
|
|
|
if(rc_physics3D.constraints[constraint_id].type == RC_CONSTRAINT_TYPE_HINGE)
|
|
{
|
|
btHingeConstraint* hinge = (btHingeConstraint*) rc_physics3D.constraints[constraint_id].constraint;
|
|
btTransform bframe = hinge->getBFrame();
|
|
irr::core::matrix4 irr_mat;
|
|
btTransformToIrrlichtMatrix(bframe, irr_mat);
|
|
mA = rc_convertFromIrrMatrix(irr_mat, mA);
|
|
return mA;
|
|
}
|
|
else if(rc_physics3D.constraints[constraint_id].type == RC_CONSTRAINT_TYPE_CONE)
|
|
{
|
|
btConeTwistConstraint* cone = (btConeTwistConstraint*) rc_physics3D.constraints[constraint_id].constraint;
|
|
btTransform bframe = cone->getBFrame();
|
|
irr::core::matrix4 irr_mat;
|
|
btTransformToIrrlichtMatrix(bframe, irr_mat);
|
|
mA = rc_convertFromIrrMatrix(irr_mat, mA);
|
|
return mA;
|
|
}
|
|
|
|
return -1;
|
|
}
|
|
|
|
//btHingeConstraint::setAxis()
|
|
void rc_setHingeAxis(int constraint_id, double x, double y, double z)
|
|
{
|
|
if(constraint_id < 0 || constraint_id >= rc_physics3D.constraints.size())
|
|
return;
|
|
|
|
if(rc_physics3D.constraints[constraint_id].type == RC_CONSTRAINT_TYPE_HINGE)
|
|
{
|
|
btHingeConstraint* hinge = (btHingeConstraint*) rc_physics3D.constraints[constraint_id].constraint;
|
|
btVector3 axis(x,y,z);
|
|
hinge->setAxis(axis);
|
|
}
|
|
}
|
|
|
|
//btHingeConstraint::setBreakingImpulseThreshold()
|
|
void rc_setConstraintBreakingImpulseThreshold(int constraint_id, double threshold)
|
|
{
|
|
if(constraint_id < 0 || constraint_id >= rc_physics3D.constraints.size())
|
|
return;
|
|
|
|
if(rc_physics3D.constraints[constraint_id].type == RC_CONSTRAINT_TYPE_HINGE)
|
|
{
|
|
btHingeConstraint* hinge = (btHingeConstraint*) rc_physics3D.constraints[constraint_id].constraint;
|
|
hinge->setBreakingImpulseThreshold(threshold);
|
|
}
|
|
else if(rc_physics3D.constraints[constraint_id].type == RC_CONSTRAINT_TYPE_POINT)
|
|
{
|
|
btPoint2PointConstraint* p2p = (btPoint2PointConstraint*) rc_physics3D.constraints[constraint_id].constraint;
|
|
p2p->setBreakingImpulseThreshold(threshold);
|
|
}
|
|
else if(rc_physics3D.constraints[constraint_id].type == RC_CONSTRAINT_TYPE_CONE)
|
|
{
|
|
btConeTwistConstraint* cone = (btConeTwistConstraint*) rc_physics3D.constraints[constraint_id].constraint;
|
|
cone->setBreakingImpulseThreshold(threshold);
|
|
}
|
|
else if(rc_physics3D.constraints[constraint_id].type == RC_CONSTRAINT_TYPE_SLIDER)
|
|
{
|
|
btSliderConstraint* slide = (btSliderConstraint*) rc_physics3D.constraints[constraint_id].constraint;
|
|
slide->setBreakingImpulseThreshold(threshold);
|
|
}
|
|
}
|
|
|
|
//btHingeConstraint::setFrames()
|
|
void rc_setConstraintFrames(int constraint_id, int frameA_matrix, int frameB_matrix)
|
|
{
|
|
if(constraint_id < 0 || constraint_id >= rc_physics3D.constraints.size())
|
|
return;
|
|
|
|
if(rc_physics3D.constraints[constraint_id].type == RC_CONSTRAINT_TYPE_HINGE)
|
|
{
|
|
btHingeConstraint* hinge = (btHingeConstraint*) rc_physics3D.constraints[constraint_id].constraint;
|
|
btTransform frameA, frameB;
|
|
irr::core::matrix4 irr_matA, irr_matB;
|
|
irr_matA = rc_convertToIrrMatrix(frameA_matrix);
|
|
irr_matB = rc_convertToIrrMatrix(frameB_matrix);
|
|
btTransformFromIrrlichtMatrix(irr_matA, frameA);
|
|
btTransformFromIrrlichtMatrix(irr_matB, frameB);
|
|
hinge->setFrames(frameA, frameB);
|
|
}
|
|
else if(rc_physics3D.constraints[constraint_id].type == RC_CONSTRAINT_TYPE_CONE)
|
|
{
|
|
btConeTwistConstraint* cone = (btConeTwistConstraint*) rc_physics3D.constraints[constraint_id].constraint;
|
|
btTransform frameA, frameB;
|
|
irr::core::matrix4 irr_matA, irr_matB;
|
|
irr_matA = rc_convertToIrrMatrix(frameA_matrix);
|
|
irr_matB = rc_convertToIrrMatrix(frameB_matrix);
|
|
btTransformFromIrrlichtMatrix(irr_matA, frameA);
|
|
btTransformFromIrrlichtMatrix(irr_matB, frameB);
|
|
cone->setFrames(frameA, frameB);
|
|
}
|
|
else if(rc_physics3D.constraints[constraint_id].type == RC_CONSTRAINT_TYPE_SLIDER)
|
|
{
|
|
btSliderConstraint* slide = (btSliderConstraint*) rc_physics3D.constraints[constraint_id].constraint;
|
|
btTransform frameA, frameB;
|
|
irr::core::matrix4 irr_matA, irr_matB;
|
|
irr_matA = rc_convertToIrrMatrix(frameA_matrix);
|
|
irr_matB = rc_convertToIrrMatrix(frameB_matrix);
|
|
btTransformFromIrrlichtMatrix(irr_matA, frameA);
|
|
btTransformFromIrrlichtMatrix(irr_matB, frameB);
|
|
slide->setFrames(frameA, frameB);
|
|
}
|
|
}
|
|
|
|
//btHingeConstraint::setLimit();
|
|
void rc_setHingeLimit(int constraint_id, double low, double high, double softness, double bias_factor, double relaxation_factor)
|
|
{
|
|
if(constraint_id < 0 || constraint_id >= rc_physics3D.constraints.size())
|
|
return;
|
|
|
|
if(rc_physics3D.constraints[constraint_id].type == RC_CONSTRAINT_TYPE_HINGE)
|
|
{
|
|
btHingeConstraint* hinge = (btHingeConstraint*) rc_physics3D.constraints[constraint_id].constraint;
|
|
hinge->setLimit(low, high, softness, bias_factor, relaxation_factor);
|
|
}
|
|
}
|
|
|
|
void rc_setConeLimit(int constraint_id, double swingSpan1, double swingSpan2, double twistSpan, double softness, double bias_factor, double relaxation_factor)
|
|
{
|
|
if(constraint_id < 0 || constraint_id >= rc_physics3D.constraints.size())
|
|
return;
|
|
|
|
if(rc_physics3D.constraints[constraint_id].type == RC_CONSTRAINT_TYPE_CONE)
|
|
{
|
|
btConeTwistConstraint* cone = (btConeTwistConstraint*) rc_physics3D.constraints[constraint_id].constraint;
|
|
cone->setLimit(swingSpan1, swingSpan2, twistSpan, softness, bias_factor, relaxation_factor);
|
|
}
|
|
}
|
|
|
|
//btHingeConstraint::getLimitBiasFactor()
|
|
double rc_getHingeLimitBiasFactor(int constraint_id)
|
|
{
|
|
if(constraint_id < 0 || constraint_id >= rc_physics3D.constraints.size())
|
|
return 0;
|
|
|
|
if(rc_physics3D.constraints[constraint_id].type == RC_CONSTRAINT_TYPE_HINGE)
|
|
{
|
|
btHingeConstraint* hinge = (btHingeConstraint*) rc_physics3D.constraints[constraint_id].constraint;
|
|
return hinge->getLimitBiasFactor();
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
//btHingeConstraint::getLimitRelaxationFactor()
|
|
double rc_getHingeLimitRelaxationFactor(int constraint_id)
|
|
{
|
|
if(constraint_id < 0 || constraint_id >= rc_physics3D.constraints.size())
|
|
return 0;
|
|
|
|
if(rc_physics3D.constraints[constraint_id].type == RC_CONSTRAINT_TYPE_HINGE)
|
|
{
|
|
btHingeConstraint* hinge = (btHingeConstraint*) rc_physics3D.constraints[constraint_id].constraint;
|
|
return hinge->getLimitRelaxationFactor();
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
//btHingeConstraint::getLimitSign()
|
|
double rc_getHingeLimitSign(int constraint_id)
|
|
{
|
|
if(constraint_id < 0 || constraint_id >= rc_physics3D.constraints.size())
|
|
return 0;
|
|
|
|
if(rc_physics3D.constraints[constraint_id].type == RC_CONSTRAINT_TYPE_HINGE)
|
|
{
|
|
btHingeConstraint* hinge = (btHingeConstraint*) rc_physics3D.constraints[constraint_id].constraint;
|
|
return hinge->getLimitSign();
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
//btHingeConstraint::getSolveLimit()
|
|
int rc_getHingeSolveLimit(int constraint_id)
|
|
{
|
|
if(constraint_id < 0 || constraint_id >= rc_physics3D.constraints.size())
|
|
return 0;
|
|
|
|
if(rc_physics3D.constraints[constraint_id].type == RC_CONSTRAINT_TYPE_HINGE)
|
|
{
|
|
btHingeConstraint* hinge = (btHingeConstraint*) rc_physics3D.constraints[constraint_id].constraint;
|
|
return hinge->getSolveLimit();
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
//btHingeConstraint::setUseReferenceFrameA()
|
|
void rc_useHingeReferenceFrameA(int constraint_id, bool flag)
|
|
{
|
|
if(constraint_id < 0 || constraint_id >= rc_physics3D.constraints.size())
|
|
return;
|
|
|
|
if(rc_physics3D.constraints[constraint_id].type == RC_CONSTRAINT_TYPE_HINGE)
|
|
{
|
|
btHingeConstraint* hinge = (btHingeConstraint*) rc_physics3D.constraints[constraint_id].constraint;
|
|
hinge->setUseReferenceFrameA(flag);
|
|
}
|
|
}
|
|
|
|
|
|
//
|
|
//btPoint2PointConstraint::getAppliedImpulse()
|
|
double rc_getConstraintAppliedImpulse(int constraint_id)
|
|
{
|
|
if(constraint_id < 0 || constraint_id >= rc_physics3D.constraints.size())
|
|
return 0;
|
|
|
|
if(rc_physics3D.constraints[constraint_id].type == RC_CONSTRAINT_TYPE_HINGE)
|
|
{
|
|
btHingeConstraint* hinge = (btHingeConstraint*) rc_physics3D.constraints[constraint_id].constraint;
|
|
return hinge->getAppliedImpulse();
|
|
}
|
|
else if(rc_physics3D.constraints[constraint_id].type == RC_CONSTRAINT_TYPE_POINT)
|
|
{
|
|
btPoint2PointConstraint* p2p = (btPoint2PointConstraint*) rc_physics3D.constraints[constraint_id].constraint;
|
|
return p2p->getAppliedImpulse();
|
|
}
|
|
else if(rc_physics3D.constraints[constraint_id].type == RC_CONSTRAINT_TYPE_CONE)
|
|
{
|
|
btConeTwistConstraint* cone = (btConeTwistConstraint*) rc_physics3D.constraints[constraint_id].constraint;
|
|
return cone->getAppliedImpulse();
|
|
}
|
|
else if(rc_physics3D.constraints[constraint_id].type == RC_CONSTRAINT_TYPE_SLIDER)
|
|
{
|
|
btSliderConstraint* slide = (btSliderConstraint*) rc_physics3D.constraints[constraint_id].constraint;
|
|
return slide->getAppliedImpulse();
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
//btPoint2PointConstraint::getFixedBody()
|
|
int rc_getConstraintFixedActor(int constraint_id)
|
|
{
|
|
if(constraint_id < 0 || constraint_id >= rc_physics3D.constraints.size())
|
|
return -1;
|
|
|
|
if(rc_physics3D.constraints[constraint_id].type == RC_CONSTRAINT_TYPE_HINGE)
|
|
{
|
|
btHingeConstraint* hinge = (btHingeConstraint*) rc_physics3D.constraints[constraint_id].constraint;
|
|
btRigidBody body = hinge->getFixedBody();
|
|
SCollisionObjectIdentification* identification = (SCollisionObjectIdentification*)body.getUserPointer();
|
|
return identification->getId();
|
|
}
|
|
else if(rc_physics3D.constraints[constraint_id].type == RC_CONSTRAINT_TYPE_POINT)
|
|
{
|
|
btPoint2PointConstraint* p2p = (btPoint2PointConstraint*) rc_physics3D.constraints[constraint_id].constraint;
|
|
btRigidBody body = p2p->getFixedBody();
|
|
SCollisionObjectIdentification* identification = (SCollisionObjectIdentification*)body.getUserPointer();
|
|
return identification->getId();
|
|
}
|
|
else if(rc_physics3D.constraints[constraint_id].type == RC_CONSTRAINT_TYPE_CONE)
|
|
{
|
|
btConeTwistConstraint* cone = (btConeTwistConstraint*) rc_physics3D.constraints[constraint_id].constraint;
|
|
btRigidBody body = cone->getFixedBody();
|
|
SCollisionObjectIdentification* identification = (SCollisionObjectIdentification*)body.getUserPointer();
|
|
return identification->getId();
|
|
}
|
|
else if(rc_physics3D.constraints[constraint_id].type == RC_CONSTRAINT_TYPE_SLIDER)
|
|
{
|
|
btSliderConstraint* slide = (btSliderConstraint*) rc_physics3D.constraints[constraint_id].constraint;
|
|
btRigidBody body = slide->getFixedBody();
|
|
SCollisionObjectIdentification* identification = (SCollisionObjectIdentification*)body.getUserPointer();
|
|
return identification->getId();
|
|
}
|
|
|
|
return -1;
|
|
}
|
|
|
|
//btPoint2PointConstraint::getPivotInA()
|
|
void rc_getPointPivotA(int constraint_id, double* x, double* y, double* z)
|
|
{
|
|
if(constraint_id < 0 || constraint_id >= rc_physics3D.constraints.size())
|
|
return;
|
|
|
|
*x = 0;
|
|
*y = 0;
|
|
*z = 0;
|
|
|
|
if(rc_physics3D.constraints[constraint_id].type == RC_CONSTRAINT_TYPE_POINT)
|
|
{
|
|
btPoint2PointConstraint* p2p = (btPoint2PointConstraint*) rc_physics3D.constraints[constraint_id].constraint;
|
|
btVector3 pivot = p2p->getPivotInA();
|
|
*x = pivot.getX();
|
|
*y = pivot.getY();
|
|
*z = pivot.getZ();
|
|
}
|
|
}
|
|
|
|
//btPoint2PointConstraint::getPivotInB()
|
|
void rc_getPointPivotB(int constraint_id, double* x, double* y, double* z)
|
|
{
|
|
if(constraint_id < 0 || constraint_id >= rc_physics3D.constraints.size())
|
|
return;
|
|
|
|
*x = 0;
|
|
*y = 0;
|
|
*z = 0;
|
|
|
|
if(rc_physics3D.constraints[constraint_id].type == RC_CONSTRAINT_TYPE_POINT)
|
|
{
|
|
btPoint2PointConstraint* p2p = (btPoint2PointConstraint*) rc_physics3D.constraints[constraint_id].constraint;
|
|
btVector3 pivot = p2p->getPivotInB();
|
|
*x = pivot.getX();
|
|
*y = pivot.getY();
|
|
*z = pivot.getZ();
|
|
}
|
|
}
|
|
|
|
//btPoint2PointConstraint::getRigidBodyA()
|
|
int rc_getConstraintActorA(int constraint_id)
|
|
{
|
|
if(constraint_id < 0 || constraint_id >= rc_physics3D.constraints.size())
|
|
return -1;
|
|
|
|
if(rc_physics3D.constraints[constraint_id].type == RC_CONSTRAINT_TYPE_HINGE)
|
|
{
|
|
btHingeConstraint* hinge = (btHingeConstraint*) rc_physics3D.constraints[constraint_id].constraint;
|
|
btRigidBody body = hinge->getRigidBodyA();
|
|
SCollisionObjectIdentification* identification = (SCollisionObjectIdentification*)body.getUserPointer();
|
|
return identification->getId();
|
|
}
|
|
else if(rc_physics3D.constraints[constraint_id].type == RC_CONSTRAINT_TYPE_POINT)
|
|
{
|
|
btPoint2PointConstraint* p2p = (btPoint2PointConstraint*) rc_physics3D.constraints[constraint_id].constraint;
|
|
btRigidBody body = p2p->getRigidBodyA();
|
|
SCollisionObjectIdentification* identification = (SCollisionObjectIdentification*)body.getUserPointer();
|
|
return identification->getId();
|
|
}
|
|
else if(rc_physics3D.constraints[constraint_id].type == RC_CONSTRAINT_TYPE_CONE)
|
|
{
|
|
btConeTwistConstraint* cone = (btConeTwistConstraint*) rc_physics3D.constraints[constraint_id].constraint;
|
|
btRigidBody body = cone->getRigidBodyA();
|
|
SCollisionObjectIdentification* identification = (SCollisionObjectIdentification*)body.getUserPointer();
|
|
return identification->getId();
|
|
}
|
|
else if(rc_physics3D.constraints[constraint_id].type == RC_CONSTRAINT_TYPE_SLIDER)
|
|
{
|
|
btSliderConstraint* slide = (btSliderConstraint*) rc_physics3D.constraints[constraint_id].constraint;
|
|
btRigidBody body = slide->getRigidBodyA();
|
|
SCollisionObjectIdentification* identification = (SCollisionObjectIdentification*)body.getUserPointer();
|
|
return identification->getId();
|
|
}
|
|
|
|
return -1;
|
|
}
|
|
|
|
//btPoint2PointConstraint::getRigidBodyB()
|
|
int rc_getConstraintActorB(int constraint_id)
|
|
{
|
|
if(constraint_id < 0 || constraint_id >= rc_physics3D.constraints.size())
|
|
return -1;
|
|
|
|
if(rc_physics3D.constraints[constraint_id].type == RC_CONSTRAINT_TYPE_HINGE)
|
|
{
|
|
btHingeConstraint* hinge = (btHingeConstraint*) rc_physics3D.constraints[constraint_id].constraint;
|
|
btRigidBody body = hinge->getRigidBodyB();
|
|
SCollisionObjectIdentification* identification = (SCollisionObjectIdentification*)body.getUserPointer();
|
|
return identification->getId();
|
|
}
|
|
else if(rc_physics3D.constraints[constraint_id].type == RC_CONSTRAINT_TYPE_POINT)
|
|
{
|
|
btPoint2PointConstraint* p2p = (btPoint2PointConstraint*) rc_physics3D.constraints[constraint_id].constraint;
|
|
btRigidBody body = p2p->getRigidBodyB();
|
|
SCollisionObjectIdentification* identification = (SCollisionObjectIdentification*)body.getUserPointer();
|
|
return identification->getId();
|
|
}
|
|
else if(rc_physics3D.constraints[constraint_id].type == RC_CONSTRAINT_TYPE_CONE)
|
|
{
|
|
btConeTwistConstraint* cone = (btConeTwistConstraint*) rc_physics3D.constraints[constraint_id].constraint;
|
|
btRigidBody body = cone->getRigidBodyB();
|
|
SCollisionObjectIdentification* identification = (SCollisionObjectIdentification*)body.getUserPointer();
|
|
return identification->getId();
|
|
}
|
|
else if(rc_physics3D.constraints[constraint_id].type == RC_CONSTRAINT_TYPE_SLIDER)
|
|
{
|
|
btSliderConstraint* slide = (btSliderConstraint*) rc_physics3D.constraints[constraint_id].constraint;
|
|
btRigidBody body = slide->getRigidBodyB();
|
|
SCollisionObjectIdentification* identification = (SCollisionObjectIdentification*)body.getUserPointer();
|
|
return identification->getId();
|
|
}
|
|
|
|
return -1;
|
|
}
|
|
|
|
//btPoint2PointConstraint::setOverrideNumSolverIterations()
|
|
void rc_setConstraintSolverIterations(int constraint_id, int num)
|
|
{
|
|
if(constraint_id < 0 || constraint_id >= rc_physics3D.constraints.size())
|
|
return;
|
|
|
|
if(rc_physics3D.constraints[constraint_id].type == RC_CONSTRAINT_TYPE_HINGE)
|
|
{
|
|
btHingeConstraint* hinge = (btHingeConstraint*) rc_physics3D.constraints[constraint_id].constraint;
|
|
hinge->setOverrideNumSolverIterations(num);
|
|
}
|
|
else if(rc_physics3D.constraints[constraint_id].type == RC_CONSTRAINT_TYPE_POINT)
|
|
{
|
|
btPoint2PointConstraint* p2p = (btPoint2PointConstraint*) rc_physics3D.constraints[constraint_id].constraint;
|
|
p2p->setOverrideNumSolverIterations(num);
|
|
}
|
|
else if(rc_physics3D.constraints[constraint_id].type == RC_CONSTRAINT_TYPE_CONE)
|
|
{
|
|
btConeTwistConstraint* cone = (btConeTwistConstraint*) rc_physics3D.constraints[constraint_id].constraint;
|
|
cone->setOverrideNumSolverIterations(num);
|
|
}
|
|
else if(rc_physics3D.constraints[constraint_id].type == RC_CONSTRAINT_TYPE_SLIDER)
|
|
{
|
|
btSliderConstraint* slide = (btSliderConstraint*) rc_physics3D.constraints[constraint_id].constraint;
|
|
slide->setOverrideNumSolverIterations(num);
|
|
}
|
|
}
|
|
|
|
//
|
|
//btConeTwistConstraint::getBiasFactor()
|
|
double rc_getConeBiasFactor(int constraint_id)
|
|
{
|
|
if(constraint_id < 0 || constraint_id >= rc_physics3D.constraints.size())
|
|
return 0;
|
|
|
|
if(rc_physics3D.constraints[constraint_id].type == RC_CONSTRAINT_TYPE_CONE)
|
|
{
|
|
btConeTwistConstraint* cone = (btConeTwistConstraint*) rc_physics3D.constraints[constraint_id].constraint;
|
|
return cone->getBiasFactor();
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
//btConeTwistConstraint::getDamping()
|
|
double rc_getConeDamping(int constraint_id)
|
|
{
|
|
if(constraint_id < 0 || constraint_id >= rc_physics3D.constraints.size())
|
|
return 0;
|
|
|
|
if(rc_physics3D.constraints[constraint_id].type == RC_CONSTRAINT_TYPE_CONE)
|
|
{
|
|
btConeTwistConstraint* cone = (btConeTwistConstraint*) rc_physics3D.constraints[constraint_id].constraint;
|
|
return cone->getDamping();
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
//btConeTwistConstraint::getFixThresh()
|
|
double rc_getConeFixThresh(int constraint_id)
|
|
{
|
|
if(constraint_id < 0 || constraint_id >= rc_physics3D.constraints.size())
|
|
return 0;
|
|
|
|
if(rc_physics3D.constraints[constraint_id].type == RC_CONSTRAINT_TYPE_CONE)
|
|
{
|
|
btConeTwistConstraint* cone = (btConeTwistConstraint*) rc_physics3D.constraints[constraint_id].constraint;
|
|
return cone->getFixThresh();
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
//btConeTwistConstraint::getLimit()
|
|
double rc_getConeLimit(int constraint_id, int limit_index)
|
|
{
|
|
if(constraint_id < 0 || constraint_id >= rc_physics3D.constraints.size())
|
|
return 0;
|
|
|
|
if(rc_physics3D.constraints[constraint_id].type == RC_CONSTRAINT_TYPE_CONE)
|
|
{
|
|
btConeTwistConstraint* cone = (btConeTwistConstraint*) rc_physics3D.constraints[constraint_id].constraint;
|
|
return cone->getLimit(limit_index);
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
//btConeTwistConstraint::getLimitSoftness()
|
|
double rc_getConstraintLimitSoftness(int constraint_id)
|
|
{
|
|
if(constraint_id < 0 || constraint_id >= rc_physics3D.constraints.size())
|
|
return 0;
|
|
|
|
if(rc_physics3D.constraints[constraint_id].type == RC_CONSTRAINT_TYPE_HINGE)
|
|
{
|
|
btHingeConstraint* hinge = (btHingeConstraint*) rc_physics3D.constraints[constraint_id].constraint;
|
|
return hinge->getLimitSoftness();
|
|
}
|
|
else if(rc_physics3D.constraints[constraint_id].type == RC_CONSTRAINT_TYPE_CONE)
|
|
{
|
|
btConeTwistConstraint* cone = (btConeTwistConstraint*) rc_physics3D.constraints[constraint_id].constraint;
|
|
return cone->getLimitSoftness();
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
//btConeTwistConstraint::getOverrideNumSolverIterations()
|
|
double rc_getConstraintSolverIterations(int constraint_id)
|
|
{
|
|
if(constraint_id < 0 || constraint_id >= rc_physics3D.constraints.size())
|
|
return 0;
|
|
|
|
if(rc_physics3D.constraints[constraint_id].type == RC_CONSTRAINT_TYPE_HINGE)
|
|
{
|
|
btHingeConstraint* hinge = (btHingeConstraint*) rc_physics3D.constraints[constraint_id].constraint;
|
|
return hinge->getOverrideNumSolverIterations();
|
|
}
|
|
else if(rc_physics3D.constraints[constraint_id].type == RC_CONSTRAINT_TYPE_POINT)
|
|
{
|
|
btPoint2PointConstraint* p2p = (btPoint2PointConstraint*) rc_physics3D.constraints[constraint_id].constraint;
|
|
return p2p->getOverrideNumSolverIterations();
|
|
}
|
|
else if(rc_physics3D.constraints[constraint_id].type == RC_CONSTRAINT_TYPE_CONE)
|
|
{
|
|
btConeTwistConstraint* cone = (btConeTwistConstraint*) rc_physics3D.constraints[constraint_id].constraint;
|
|
return cone->getOverrideNumSolverIterations();
|
|
}
|
|
else if(rc_physics3D.constraints[constraint_id].type == RC_CONSTRAINT_TYPE_SLIDER)
|
|
{
|
|
btSliderConstraint* slide = (btSliderConstraint*) rc_physics3D.constraints[constraint_id].constraint;
|
|
return slide->getOverrideNumSolverIterations();
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
//btConeTwistConstraint::GetPointForAngle()
|
|
void rc_getConeAnglePoint(int constraint_id, double angle, double len, double* x, double* y, double* z)
|
|
{
|
|
if(constraint_id < 0 || constraint_id >= rc_physics3D.constraints.size())
|
|
return;
|
|
|
|
if(rc_physics3D.constraints[constraint_id].type == RC_CONSTRAINT_TYPE_CONE)
|
|
{
|
|
btConeTwistConstraint* cone = (btConeTwistConstraint*) rc_physics3D.constraints[constraint_id].constraint;
|
|
btVector3 v = cone->GetPointForAngle( radians(angle), len);
|
|
*x = v.getX();
|
|
*y = v.getY();
|
|
*z = v.getZ();
|
|
}
|
|
}
|
|
|
|
//btConeTwistConstraint::getAngularOnly()
|
|
bool rc_getConstraintAngularOnly(int constraint_id)
|
|
{
|
|
if(constraint_id < 0 || constraint_id >= rc_physics3D.constraints.size())
|
|
return false;
|
|
|
|
if(rc_physics3D.constraints[constraint_id].type == RC_CONSTRAINT_TYPE_HINGE)
|
|
{
|
|
btHingeConstraint* hinge = (btHingeConstraint*) rc_physics3D.constraints[constraint_id].constraint;
|
|
return hinge->getAngularOnly();
|
|
}
|
|
else if(rc_physics3D.constraints[constraint_id].type == RC_CONSTRAINT_TYPE_CONE)
|
|
{
|
|
btConeTwistConstraint* cone = (btConeTwistConstraint*) rc_physics3D.constraints[constraint_id].constraint;
|
|
return cone->getAngularOnly();
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
//btConeTwistConstraint::getSolveSwingLimit()
|
|
int rc_getConeSolveSwingLimit(int constraint_id)
|
|
{
|
|
if(constraint_id < 0 || constraint_id >= rc_physics3D.constraints.size())
|
|
return 0;
|
|
|
|
if(rc_physics3D.constraints[constraint_id].type == RC_CONSTRAINT_TYPE_CONE)
|
|
{
|
|
btConeTwistConstraint* cone = (btConeTwistConstraint*) rc_physics3D.constraints[constraint_id].constraint;
|
|
return cone->getSolveSwingLimit();
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
int rc_getConeSolveTwistLimit(int constraint_id)
|
|
{
|
|
if(constraint_id < 0 || constraint_id >= rc_physics3D.constraints.size())
|
|
return 0;
|
|
|
|
if(rc_physics3D.constraints[constraint_id].type == RC_CONSTRAINT_TYPE_CONE)
|
|
{
|
|
btConeTwistConstraint* cone = (btConeTwistConstraint*) rc_physics3D.constraints[constraint_id].constraint;
|
|
return cone->getSolveTwistLimit();
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
//btConeTwistConstraint::getSwingSpan1()
|
|
double rc_getConeSwingSpan1(int constraint_id)
|
|
{
|
|
if(constraint_id < 0 || constraint_id >= rc_physics3D.constraints.size())
|
|
return 0;
|
|
|
|
if(rc_physics3D.constraints[constraint_id].type == RC_CONSTRAINT_TYPE_CONE)
|
|
{
|
|
btConeTwistConstraint* cone = (btConeTwistConstraint*) rc_physics3D.constraints[constraint_id].constraint;
|
|
return cone->getSwingSpan1();
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
//btConeTwistConstraint::getSwingSpan2()
|
|
int rc_getConeSwingSpan2(int constraint_id)
|
|
{
|
|
if(constraint_id < 0 || constraint_id >= rc_physics3D.constraints.size())
|
|
return 0;
|
|
|
|
if(rc_physics3D.constraints[constraint_id].type == RC_CONSTRAINT_TYPE_CONE)
|
|
{
|
|
btConeTwistConstraint* cone = (btConeTwistConstraint*) rc_physics3D.constraints[constraint_id].constraint;
|
|
return cone->getSwingSpan2();
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
//btConeTwistConstraint::getTwistAngle()
|
|
double rc_getConeTwistAngle(int constraint_id)
|
|
{
|
|
if(constraint_id < 0 || constraint_id >= rc_physics3D.constraints.size())
|
|
return 0;
|
|
|
|
if(rc_physics3D.constraints[constraint_id].type == RC_CONSTRAINT_TYPE_CONE)
|
|
{
|
|
btConeTwistConstraint* cone = (btConeTwistConstraint*) rc_physics3D.constraints[constraint_id].constraint;
|
|
return cone->getTwistAngle();
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
//btConeTwistConstraint::getTwistLimitSign()
|
|
double rc_getConeTwistLimitSign(int constraint_id)
|
|
{
|
|
if(constraint_id < 0 || constraint_id >= rc_physics3D.constraints.size())
|
|
return 0;
|
|
|
|
if(rc_physics3D.constraints[constraint_id].type == RC_CONSTRAINT_TYPE_CONE)
|
|
{
|
|
btConeTwistConstraint* cone = (btConeTwistConstraint*) rc_physics3D.constraints[constraint_id].constraint;
|
|
return cone->getTwistLimitSign();
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
//btConeTwistConstraint::getTwistSpan()
|
|
int rc_getConeTwistSpan(int constraint_id)
|
|
{
|
|
if(constraint_id < 0 || constraint_id >= rc_physics3D.constraints.size())
|
|
return 0;
|
|
|
|
if(rc_physics3D.constraints[constraint_id].type == RC_CONSTRAINT_TYPE_CONE)
|
|
{
|
|
btConeTwistConstraint* cone = (btConeTwistConstraint*) rc_physics3D.constraints[constraint_id].constraint;
|
|
return cone->getTwistSpan();
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
//btConeTwistConstraint::setAngularOnly()
|
|
void rc_setConstraintAngularOnly(int constraint_id, bool flag)
|
|
{
|
|
if(constraint_id < 0 || constraint_id >= rc_physics3D.constraints.size())
|
|
return;
|
|
|
|
if(rc_physics3D.constraints[constraint_id].type == RC_CONSTRAINT_TYPE_HINGE)
|
|
{
|
|
btHingeConstraint* hinge = (btHingeConstraint*) rc_physics3D.constraints[constraint_id].constraint;
|
|
hinge->setAngularOnly(flag);
|
|
}
|
|
else if(rc_physics3D.constraints[constraint_id].type == RC_CONSTRAINT_TYPE_CONE)
|
|
{
|
|
btConeTwistConstraint* cone = (btConeTwistConstraint*) rc_physics3D.constraints[constraint_id].constraint;
|
|
cone->setAngularOnly(flag);
|
|
}
|
|
}
|
|
|
|
//btConeTwistConstraint::setDamping()
|
|
void rc_setConeDamping(int constraint_id, double damping)
|
|
{
|
|
if(constraint_id < 0 || constraint_id >= rc_physics3D.constraints.size())
|
|
return;
|
|
|
|
if(rc_physics3D.constraints[constraint_id].type == RC_CONSTRAINT_TYPE_CONE)
|
|
{
|
|
btConeTwistConstraint* cone = (btConeTwistConstraint*) rc_physics3D.constraints[constraint_id].constraint;
|
|
cone->setDamping(damping);
|
|
}
|
|
}
|
|
|
|
//btConeTwistConstraint::setFixThresh()
|
|
void rc_setConeFixThresh(int constraint_id, double fixThresh)
|
|
{
|
|
if(constraint_id < 0 || constraint_id >= rc_physics3D.constraints.size())
|
|
return;
|
|
|
|
if(rc_physics3D.constraints[constraint_id].type == RC_CONSTRAINT_TYPE_CONE)
|
|
{
|
|
btConeTwistConstraint* cone = (btConeTwistConstraint*) rc_physics3D.constraints[constraint_id].constraint;
|
|
cone->setFixThresh(fixThresh);
|
|
}
|
|
}
|
|
|
|
|
|
//btSliderConstraint::getAncorInA()
|
|
void rc_getSlideAnchorA(int constraint_id, double* x, double* y, double* z)
|
|
{
|
|
if(constraint_id < 0 || constraint_id >= rc_physics3D.constraints.size())
|
|
return;
|
|
|
|
*x = 0;
|
|
*y = 0;
|
|
*z = 0;
|
|
|
|
if(rc_physics3D.constraints[constraint_id].type == RC_CONSTRAINT_TYPE_SLIDER)
|
|
{
|
|
btSliderConstraint* slide = (btSliderConstraint*) rc_physics3D.constraints[constraint_id].constraint;
|
|
btVector3 v = slide->getAncorInA();
|
|
*x = v.getX();
|
|
*y = v.getY();
|
|
*z = v.getZ();
|
|
}
|
|
}
|
|
|
|
//btSliderConstraint::getAncorInB()
|
|
void rc_getSlideAnchorB(int constraint_id, double* x, double* y, double* z)
|
|
{
|
|
if(constraint_id < 0 || constraint_id >= rc_physics3D.constraints.size())
|
|
return;
|
|
|
|
*x = 0;
|
|
*y = 0;
|
|
*z = 0;
|
|
|
|
if(rc_physics3D.constraints[constraint_id].type == RC_CONSTRAINT_TYPE_SLIDER)
|
|
{
|
|
btSliderConstraint* slide = (btSliderConstraint*) rc_physics3D.constraints[constraint_id].constraint;
|
|
btVector3 v = slide->getAncorInB();
|
|
*x = v.getX();
|
|
*y = v.getY();
|
|
*z = v.getZ();
|
|
}
|
|
}
|
|
|
|
//btSliderConstraint::getAngDepth()
|
|
double rc_getSlideAngDepth(int constraint_id)
|
|
{
|
|
if(constraint_id < 0 || constraint_id >= rc_physics3D.constraints.size())
|
|
return 0;
|
|
|
|
if(rc_physics3D.constraints[constraint_id].type == RC_CONSTRAINT_TYPE_SLIDER)
|
|
{
|
|
btSliderConstraint* slide = (btSliderConstraint*) rc_physics3D.constraints[constraint_id].constraint;
|
|
return slide->getAngDepth();
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
//btSliderConstraint::getAngularPos()
|
|
double rc_getSlideAngularPos(int constraint_id)
|
|
{
|
|
if(constraint_id < 0 || constraint_id >= rc_physics3D.constraints.size())
|
|
return 0;
|
|
|
|
if(rc_physics3D.constraints[constraint_id].type == RC_CONSTRAINT_TYPE_SLIDER)
|
|
{
|
|
btSliderConstraint* slide = (btSliderConstraint*) rc_physics3D.constraints[constraint_id].constraint;
|
|
return slide->getAngularPos();
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
//btSliderConstraint::getDampingDirAng()
|
|
double rc_getSlideDampingDirAng(int constraint_id)
|
|
{
|
|
if(constraint_id < 0 || constraint_id >= rc_physics3D.constraints.size())
|
|
return 0;
|
|
|
|
if(rc_physics3D.constraints[constraint_id].type == RC_CONSTRAINT_TYPE_SLIDER)
|
|
{
|
|
btSliderConstraint* slide = (btSliderConstraint*) rc_physics3D.constraints[constraint_id].constraint;
|
|
return slide->getDampingDirAng();
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
//btSliderConstraint::getDampingDirLin()
|
|
double rc_getSlideDampingDirLin(int constraint_id)
|
|
{
|
|
if(constraint_id < 0 || constraint_id >= rc_physics3D.constraints.size())
|
|
return 0;
|
|
|
|
if(rc_physics3D.constraints[constraint_id].type == RC_CONSTRAINT_TYPE_SLIDER)
|
|
{
|
|
btSliderConstraint* slide = (btSliderConstraint*) rc_physics3D.constraints[constraint_id].constraint;
|
|
return slide->getDampingDirLin();
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
//btSliderConstraint::getDampingLimAng()
|
|
double rc_getSlideDampingLimAng(int constraint_id)
|
|
{
|
|
if(constraint_id < 0 || constraint_id >= rc_physics3D.constraints.size())
|
|
return 0;
|
|
|
|
if(rc_physics3D.constraints[constraint_id].type == RC_CONSTRAINT_TYPE_SLIDER)
|
|
{
|
|
btSliderConstraint* slide = (btSliderConstraint*) rc_physics3D.constraints[constraint_id].constraint;
|
|
return slide->getDampingLimAng();
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
//btSliderConstraint::getDampingLimLin()
|
|
double rc_getSlideDampingLimLin(int constraint_id)
|
|
{
|
|
if(constraint_id < 0 || constraint_id >= rc_physics3D.constraints.size())
|
|
return 0;
|
|
|
|
if(rc_physics3D.constraints[constraint_id].type == RC_CONSTRAINT_TYPE_SLIDER)
|
|
{
|
|
btSliderConstraint* slide = (btSliderConstraint*) rc_physics3D.constraints[constraint_id].constraint;
|
|
return slide->getDampingLimLin();
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
//btSliderConstraint::getDampingOrthoAng()
|
|
double rc_getSlideDampingOrthoAng(int constraint_id)
|
|
{
|
|
if(constraint_id < 0 || constraint_id >= rc_physics3D.constraints.size())
|
|
return 0;
|
|
|
|
if(rc_physics3D.constraints[constraint_id].type == RC_CONSTRAINT_TYPE_SLIDER)
|
|
{
|
|
btSliderConstraint* slide = (btSliderConstraint*) rc_physics3D.constraints[constraint_id].constraint;
|
|
return slide->getDampingOrthoAng();
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
//btSliderConstraint::getDampingOrthoLin()
|
|
double rc_getSlideDampingOrthoLin(int constraint_id)
|
|
{
|
|
if(constraint_id < 0 || constraint_id >= rc_physics3D.constraints.size())
|
|
return 0;
|
|
|
|
if(rc_physics3D.constraints[constraint_id].type == RC_CONSTRAINT_TYPE_SLIDER)
|
|
{
|
|
btSliderConstraint* slide = (btSliderConstraint*) rc_physics3D.constraints[constraint_id].constraint;
|
|
return slide->getDampingOrthoLin();
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
//btSliderConstraint::getLinearPos()
|
|
double rc_getSlideLinearPos(int constraint_id)
|
|
{
|
|
if(constraint_id < 0 || constraint_id >= rc_physics3D.constraints.size())
|
|
return 0;
|
|
|
|
if(rc_physics3D.constraints[constraint_id].type == RC_CONSTRAINT_TYPE_SLIDER)
|
|
{
|
|
btSliderConstraint* slide = (btSliderConstraint*) rc_physics3D.constraints[constraint_id].constraint;
|
|
return slide->getLinearPos();
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
//btSliderConstraint::getLinDepth()
|
|
double rc_getSlideLinDepth(int constraint_id)
|
|
{
|
|
if(constraint_id < 0 || constraint_id >= rc_physics3D.constraints.size())
|
|
return 0;
|
|
|
|
if(rc_physics3D.constraints[constraint_id].type == RC_CONSTRAINT_TYPE_SLIDER)
|
|
{
|
|
btSliderConstraint* slide = (btSliderConstraint*) rc_physics3D.constraints[constraint_id].constraint;
|
|
return slide->getLinDepth();
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
//btSliderConstraint::getLowerAngLimit()
|
|
double rc_getSlideLowerAngLimit(int constraint_id)
|
|
{
|
|
if(constraint_id < 0 || constraint_id >= rc_physics3D.constraints.size())
|
|
return 0;
|
|
|
|
if(rc_physics3D.constraints[constraint_id].type == RC_CONSTRAINT_TYPE_SLIDER)
|
|
{
|
|
btSliderConstraint* slide = (btSliderConstraint*) rc_physics3D.constraints[constraint_id].constraint;
|
|
return slide->getLowerAngLimit();
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
//btSliderConstraint::getLowerLinLimit()
|
|
double rc_getSlideLowerLinLimit(int constraint_id)
|
|
{
|
|
if(constraint_id < 0 || constraint_id >= rc_physics3D.constraints.size())
|
|
return 0;
|
|
|
|
if(rc_physics3D.constraints[constraint_id].type == RC_CONSTRAINT_TYPE_SLIDER)
|
|
{
|
|
btSliderConstraint* slide = (btSliderConstraint*) rc_physics3D.constraints[constraint_id].constraint;
|
|
return slide->getLowerLinLimit();
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
//btSliderConstraint::getRestitutionDirAng()
|
|
double rc_getSlideRestitutionDirAng(int constraint_id)
|
|
{
|
|
if(constraint_id < 0 || constraint_id >= rc_physics3D.constraints.size())
|
|
return 0;
|
|
|
|
if(rc_physics3D.constraints[constraint_id].type == RC_CONSTRAINT_TYPE_SLIDER)
|
|
{
|
|
btSliderConstraint* slide = (btSliderConstraint*) rc_physics3D.constraints[constraint_id].constraint;
|
|
return slide->getRestitutionDirAng();
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
//btSliderConstraint::getRestitutionDirLin()
|
|
double rc_getSlideRestitutionDirLin(int constraint_id)
|
|
{
|
|
if(constraint_id < 0 || constraint_id >= rc_physics3D.constraints.size())
|
|
return 0;
|
|
|
|
if(rc_physics3D.constraints[constraint_id].type == RC_CONSTRAINT_TYPE_SLIDER)
|
|
{
|
|
btSliderConstraint* slide = (btSliderConstraint*) rc_physics3D.constraints[constraint_id].constraint;
|
|
return slide->getRestitutionDirLin();
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
//btSliderConstraint::getRestitutionLimAng()
|
|
double rc_getSlideRestitutionLimAng(int constraint_id)
|
|
{
|
|
if(constraint_id < 0 || constraint_id >= rc_physics3D.constraints.size())
|
|
return 0;
|
|
|
|
if(rc_physics3D.constraints[constraint_id].type == RC_CONSTRAINT_TYPE_SLIDER)
|
|
{
|
|
btSliderConstraint* slide = (btSliderConstraint*) rc_physics3D.constraints[constraint_id].constraint;
|
|
return slide->getRestitutionLimAng();
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
//btSliderConstraint::getRestitutionLimLin()
|
|
double rc_getSlideRestitutionLimLin(int constraint_id)
|
|
{
|
|
if(constraint_id < 0 || constraint_id >= rc_physics3D.constraints.size())
|
|
return 0;
|
|
|
|
if(rc_physics3D.constraints[constraint_id].type == RC_CONSTRAINT_TYPE_SLIDER)
|
|
{
|
|
btSliderConstraint* slide = (btSliderConstraint*) rc_physics3D.constraints[constraint_id].constraint;
|
|
return slide->getRestitutionLimLin();
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
//btSliderConstraint::getRestitutionOrthoAng()
|
|
double rc_getSlideRestitutionOrthoAng(int constraint_id)
|
|
{
|
|
if(constraint_id < 0 || constraint_id >= rc_physics3D.constraints.size())
|
|
return 0;
|
|
|
|
if(rc_physics3D.constraints[constraint_id].type == RC_CONSTRAINT_TYPE_SLIDER)
|
|
{
|
|
btSliderConstraint* slide = (btSliderConstraint*) rc_physics3D.constraints[constraint_id].constraint;
|
|
return slide->getRestitutionOrthoAng();
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
//btSliderConstraint::getRestitutionOrthoLin()
|
|
double rc_getSlideRestitutionOrthoLin(int constraint_id)
|
|
{
|
|
if(constraint_id < 0 || constraint_id >= rc_physics3D.constraints.size())
|
|
return 0;
|
|
|
|
if(rc_physics3D.constraints[constraint_id].type == RC_CONSTRAINT_TYPE_SLIDER)
|
|
{
|
|
btSliderConstraint* slide = (btSliderConstraint*) rc_physics3D.constraints[constraint_id].constraint;
|
|
return slide->getRestitutionOrthoLin();
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
//btSliderConstraint::getSoftnessDirAng()
|
|
double rc_getSlideSoftnessDirAng(int constraint_id)
|
|
{
|
|
if(constraint_id < 0 || constraint_id >= rc_physics3D.constraints.size())
|
|
return 0;
|
|
|
|
if(rc_physics3D.constraints[constraint_id].type == RC_CONSTRAINT_TYPE_SLIDER)
|
|
{
|
|
btSliderConstraint* slide = (btSliderConstraint*) rc_physics3D.constraints[constraint_id].constraint;
|
|
return slide->getSoftnessDirAng();
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
//btSliderConstraint::getSoftnessDirLin()
|
|
double rc_getSlideSoftnessDirLin(int constraint_id)
|
|
{
|
|
if(constraint_id < 0 || constraint_id >= rc_physics3D.constraints.size())
|
|
return 0;
|
|
|
|
if(rc_physics3D.constraints[constraint_id].type == RC_CONSTRAINT_TYPE_SLIDER)
|
|
{
|
|
btSliderConstraint* slide = (btSliderConstraint*) rc_physics3D.constraints[constraint_id].constraint;
|
|
return slide->getSoftnessDirLin();
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
//btSliderConstraint::getSoftnessLimAng()
|
|
double rc_getSlideSoftnessLimAng(int constraint_id)
|
|
{
|
|
if(constraint_id < 0 || constraint_id >= rc_physics3D.constraints.size())
|
|
return 0;
|
|
|
|
if(rc_physics3D.constraints[constraint_id].type == RC_CONSTRAINT_TYPE_SLIDER)
|
|
{
|
|
btSliderConstraint* slide = (btSliderConstraint*) rc_physics3D.constraints[constraint_id].constraint;
|
|
return slide->getSoftnessLimAng();
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
//btSliderConstraint::getSoftnessLimLin()
|
|
double rc_getSlideSoftnessLimLin(int constraint_id)
|
|
{
|
|
if(constraint_id < 0 || constraint_id >= rc_physics3D.constraints.size())
|
|
return 0;
|
|
|
|
if(rc_physics3D.constraints[constraint_id].type == RC_CONSTRAINT_TYPE_SLIDER)
|
|
{
|
|
btSliderConstraint* slide = (btSliderConstraint*) rc_physics3D.constraints[constraint_id].constraint;
|
|
return slide->getSoftnessLimLin();
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
//btSliderConstraint::getSoftnessOrthoAng()
|
|
double rc_getSlideSoftnessOrthoAng(int constraint_id)
|
|
{
|
|
if(constraint_id < 0 || constraint_id >= rc_physics3D.constraints.size())
|
|
return 0;
|
|
|
|
if(rc_physics3D.constraints[constraint_id].type == RC_CONSTRAINT_TYPE_SLIDER)
|
|
{
|
|
btSliderConstraint* slide = (btSliderConstraint*) rc_physics3D.constraints[constraint_id].constraint;
|
|
return slide->getSoftnessOrthoAng();
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
//btSliderConstraint::getSoftnessOrthoLin()
|
|
double rc_getSlideSoftnessOrthoLin(int constraint_id)
|
|
{
|
|
if(constraint_id < 0 || constraint_id >= rc_physics3D.constraints.size())
|
|
return 0;
|
|
|
|
if(rc_physics3D.constraints[constraint_id].type == RC_CONSTRAINT_TYPE_SLIDER)
|
|
{
|
|
btSliderConstraint* slide = (btSliderConstraint*) rc_physics3D.constraints[constraint_id].constraint;
|
|
return slide->getSoftnessOrthoLin();
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
//btSliderConstraint::getSolveAngLimit()
|
|
bool rc_getSlideSolveAngLimit(int constraint_id)
|
|
{
|
|
if(constraint_id < 0 || constraint_id >= rc_physics3D.constraints.size())
|
|
return 0;
|
|
|
|
if(rc_physics3D.constraints[constraint_id].type == RC_CONSTRAINT_TYPE_SLIDER)
|
|
{
|
|
btSliderConstraint* slide = (btSliderConstraint*) rc_physics3D.constraints[constraint_id].constraint;
|
|
return slide->getSolveAngLimit();
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
//btSliderConstraint::getSolveLinLimit()
|
|
bool rc_getSlideSolveLinLimit(int constraint_id)
|
|
{
|
|
if(constraint_id < 0 || constraint_id >= rc_physics3D.constraints.size())
|
|
return 0;
|
|
|
|
if(rc_physics3D.constraints[constraint_id].type == RC_CONSTRAINT_TYPE_SLIDER)
|
|
{
|
|
btSliderConstraint* slide = (btSliderConstraint*) rc_physics3D.constraints[constraint_id].constraint;
|
|
return slide->getSolveLinLimit();
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
//btSliderConstraint::getUpperAngLimit()
|
|
double rc_getSlideUpperAngLimit(int constraint_id)
|
|
{
|
|
if(constraint_id < 0 || constraint_id >= rc_physics3D.constraints.size())
|
|
return 0;
|
|
|
|
if(rc_physics3D.constraints[constraint_id].type == RC_CONSTRAINT_TYPE_SLIDER)
|
|
{
|
|
btSliderConstraint* slide = (btSliderConstraint*) rc_physics3D.constraints[constraint_id].constraint;
|
|
return slide->getUpperAngLimit();
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
//btSliderConstraint::getUpperLinLimit()
|
|
double rc_getSlideUpperLinLimit(int constraint_id)
|
|
{
|
|
if(constraint_id < 0 || constraint_id >= rc_physics3D.constraints.size())
|
|
return 0;
|
|
|
|
if(rc_physics3D.constraints[constraint_id].type == RC_CONSTRAINT_TYPE_SLIDER)
|
|
{
|
|
btSliderConstraint* slide = (btSliderConstraint*) rc_physics3D.constraints[constraint_id].constraint;
|
|
return slide->getUpperLinLimit();
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
//btSliderConstraint::getUseFrameOffset()
|
|
bool rc_getSlideUseFrameOffset(int constraint_id)
|
|
{
|
|
if(constraint_id < 0 || constraint_id >= rc_physics3D.constraints.size())
|
|
return 0;
|
|
|
|
if(rc_physics3D.constraints[constraint_id].type == RC_CONSTRAINT_TYPE_SLIDER)
|
|
{
|
|
btSliderConstraint* slide = (btSliderConstraint*) rc_physics3D.constraints[constraint_id].constraint;
|
|
return slide->getUseFrameOffset();
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
//btSliderConstraint::setDampingDirAng()
|
|
void rc_setSlideDampingDirAng(int constraint_id, double n)
|
|
{
|
|
if(constraint_id < 0 || constraint_id >= rc_physics3D.constraints.size())
|
|
return;
|
|
|
|
if(rc_physics3D.constraints[constraint_id].type == RC_CONSTRAINT_TYPE_SLIDER)
|
|
{
|
|
btSliderConstraint* slide = (btSliderConstraint*) rc_physics3D.constraints[constraint_id].constraint;
|
|
slide->setDampingDirAng(n);
|
|
}
|
|
}
|
|
|
|
//btSliderConstraint::setDampingDirLin()
|
|
void rc_setSlideDampingDirLin(int constraint_id, double n)
|
|
{
|
|
if(constraint_id < 0 || constraint_id >= rc_physics3D.constraints.size())
|
|
return;
|
|
|
|
if(rc_physics3D.constraints[constraint_id].type == RC_CONSTRAINT_TYPE_SLIDER)
|
|
{
|
|
btSliderConstraint* slide = (btSliderConstraint*) rc_physics3D.constraints[constraint_id].constraint;
|
|
slide->setDampingDirLin(n);
|
|
}
|
|
}
|
|
|
|
//btSliderConstraint::setDampingLimAng()
|
|
void rc_setSlideDampingLimAng(int constraint_id, double n)
|
|
{
|
|
if(constraint_id < 0 || constraint_id >= rc_physics3D.constraints.size())
|
|
return;
|
|
|
|
if(rc_physics3D.constraints[constraint_id].type == RC_CONSTRAINT_TYPE_SLIDER)
|
|
{
|
|
btSliderConstraint* slide = (btSliderConstraint*) rc_physics3D.constraints[constraint_id].constraint;
|
|
slide->setDampingLimAng(n);
|
|
}
|
|
}
|
|
|
|
//btSliderConstraint::setDampingLimLin()
|
|
void rc_setSlideDampingLimLin(int constraint_id, double n)
|
|
{
|
|
if(constraint_id < 0 || constraint_id >= rc_physics3D.constraints.size())
|
|
return;
|
|
|
|
if(rc_physics3D.constraints[constraint_id].type == RC_CONSTRAINT_TYPE_SLIDER)
|
|
{
|
|
btSliderConstraint* slide = (btSliderConstraint*) rc_physics3D.constraints[constraint_id].constraint;
|
|
slide->setDampingLimLin(n);
|
|
}
|
|
}
|
|
|
|
//btSliderConstraint::setDampingOrthoAng()
|
|
void rc_setSlideDampingOrthoAng(int constraint_id, double n)
|
|
{
|
|
if(constraint_id < 0 || constraint_id >= rc_physics3D.constraints.size())
|
|
return;
|
|
|
|
if(rc_physics3D.constraints[constraint_id].type == RC_CONSTRAINT_TYPE_SLIDER)
|
|
{
|
|
btSliderConstraint* slide = (btSliderConstraint*) rc_physics3D.constraints[constraint_id].constraint;
|
|
slide->setDampingOrthoAng(n);
|
|
}
|
|
}
|
|
|
|
//btSliderConstraint::setDampingOrthoLin()
|
|
void rc_setSlideDampingOrthoLin(int constraint_id, double n)
|
|
{
|
|
if(constraint_id < 0 || constraint_id >= rc_physics3D.constraints.size())
|
|
return;
|
|
|
|
if(rc_physics3D.constraints[constraint_id].type == RC_CONSTRAINT_TYPE_SLIDER)
|
|
{
|
|
btSliderConstraint* slide = (btSliderConstraint*) rc_physics3D.constraints[constraint_id].constraint;
|
|
slide->setDampingOrthoLin(n);
|
|
}
|
|
}
|
|
|
|
//btSliderConstraint::setLowerAngLimit()
|
|
void rc_setSlideLowerAngLimit(int constraint_id, double n)
|
|
{
|
|
if(constraint_id < 0 || constraint_id >= rc_physics3D.constraints.size())
|
|
return;
|
|
|
|
if(rc_physics3D.constraints[constraint_id].type == RC_CONSTRAINT_TYPE_SLIDER)
|
|
{
|
|
btSliderConstraint* slide = (btSliderConstraint*) rc_physics3D.constraints[constraint_id].constraint;
|
|
slide->setLowerAngLimit(n);
|
|
}
|
|
}
|
|
|
|
//btSliderConstraint::setLowerLinLimit()
|
|
void rc_setSlideLowerLinLimit(int constraint_id, double n)
|
|
{
|
|
if(constraint_id < 0 || constraint_id >= rc_physics3D.constraints.size())
|
|
return;
|
|
|
|
if(rc_physics3D.constraints[constraint_id].type == RC_CONSTRAINT_TYPE_SLIDER)
|
|
{
|
|
btSliderConstraint* slide = (btSliderConstraint*) rc_physics3D.constraints[constraint_id].constraint;
|
|
slide->setLowerLinLimit(n);
|
|
}
|
|
}
|
|
|
|
//btSliderConstraint::setRestitutionDirAng()
|
|
void rc_setSlideRestitutionDirAng(int constraint_id, double n)
|
|
{
|
|
if(constraint_id < 0 || constraint_id >= rc_physics3D.constraints.size())
|
|
return;
|
|
|
|
if(rc_physics3D.constraints[constraint_id].type == RC_CONSTRAINT_TYPE_SLIDER)
|
|
{
|
|
btSliderConstraint* slide = (btSliderConstraint*) rc_physics3D.constraints[constraint_id].constraint;
|
|
slide->setRestitutionDirAng(n);
|
|
}
|
|
}
|
|
|
|
//btSliderConstraint::setRestitutionDirLin()
|
|
void rc_setSlideRestitutionDirLin(int constraint_id, double n)
|
|
{
|
|
if(constraint_id < 0 || constraint_id >= rc_physics3D.constraints.size())
|
|
return;
|
|
|
|
if(rc_physics3D.constraints[constraint_id].type == RC_CONSTRAINT_TYPE_SLIDER)
|
|
{
|
|
btSliderConstraint* slide = (btSliderConstraint*) rc_physics3D.constraints[constraint_id].constraint;
|
|
slide->setRestitutionDirLin(n);
|
|
}
|
|
}
|
|
|
|
//btSliderConstraint::setRestitutionLimAng()
|
|
void rc_setSlideRestitutionLimAng(int constraint_id, double n)
|
|
{
|
|
if(constraint_id < 0 || constraint_id >= rc_physics3D.constraints.size())
|
|
return;
|
|
|
|
if(rc_physics3D.constraints[constraint_id].type == RC_CONSTRAINT_TYPE_SLIDER)
|
|
{
|
|
btSliderConstraint* slide = (btSliderConstraint*) rc_physics3D.constraints[constraint_id].constraint;
|
|
slide->setRestitutionLimAng(n);
|
|
}
|
|
}
|
|
|
|
//btSliderConstraint::setRestitutionLimLin()
|
|
void rc_setSlideRestitutionLimLin(int constraint_id, double n)
|
|
{
|
|
if(constraint_id < 0 || constraint_id >= rc_physics3D.constraints.size())
|
|
return;
|
|
|
|
if(rc_physics3D.constraints[constraint_id].type == RC_CONSTRAINT_TYPE_SLIDER)
|
|
{
|
|
btSliderConstraint* slide = (btSliderConstraint*) rc_physics3D.constraints[constraint_id].constraint;
|
|
slide->setRestitutionLimLin(n);
|
|
}
|
|
}
|
|
|
|
//btSliderConstraint::setRestitutionOrthoAng()
|
|
void rc_setSlideRestitutionOrthoAng(int constraint_id, double n)
|
|
{
|
|
if(constraint_id < 0 || constraint_id >= rc_physics3D.constraints.size())
|
|
return;
|
|
|
|
if(rc_physics3D.constraints[constraint_id].type == RC_CONSTRAINT_TYPE_SLIDER)
|
|
{
|
|
btSliderConstraint* slide = (btSliderConstraint*) rc_physics3D.constraints[constraint_id].constraint;
|
|
slide->setRestitutionOrthoAng(n);
|
|
}
|
|
}
|
|
|
|
//btSliderConstraint::setRestitutionOrthoLin()
|
|
void rc_setSlideRestitutionOrthoLin(int constraint_id, double n)
|
|
{
|
|
if(constraint_id < 0 || constraint_id >= rc_physics3D.constraints.size())
|
|
return;
|
|
|
|
if(rc_physics3D.constraints[constraint_id].type == RC_CONSTRAINT_TYPE_SLIDER)
|
|
{
|
|
btSliderConstraint* slide = (btSliderConstraint*) rc_physics3D.constraints[constraint_id].constraint;
|
|
slide->setRestitutionOrthoLin(n);
|
|
}
|
|
}
|
|
|
|
//btSliderConstraint::setSoftnessDirAng()
|
|
void rc_setSlideSoftnessDirAng(int constraint_id, double n)
|
|
{
|
|
if(constraint_id < 0 || constraint_id >= rc_physics3D.constraints.size())
|
|
return;
|
|
|
|
if(rc_physics3D.constraints[constraint_id].type == RC_CONSTRAINT_TYPE_SLIDER)
|
|
{
|
|
btSliderConstraint* slide = (btSliderConstraint*) rc_physics3D.constraints[constraint_id].constraint;
|
|
slide->setSoftnessDirAng(n);
|
|
}
|
|
}
|
|
|
|
//btSliderConstraint::setSoftnessDirLin()
|
|
void rc_setSlideSoftnessDirLin(int constraint_id, double n)
|
|
{
|
|
if(constraint_id < 0 || constraint_id >= rc_physics3D.constraints.size())
|
|
return;
|
|
|
|
if(rc_physics3D.constraints[constraint_id].type == RC_CONSTRAINT_TYPE_SLIDER)
|
|
{
|
|
btSliderConstraint* slide = (btSliderConstraint*) rc_physics3D.constraints[constraint_id].constraint;
|
|
slide->setSoftnessDirLin(n);
|
|
}
|
|
}
|
|
|
|
//btSliderConstraint::setSoftnessLimAng()
|
|
void rc_setSlideSoftnessLimAng(int constraint_id, double n)
|
|
{
|
|
if(constraint_id < 0 || constraint_id >= rc_physics3D.constraints.size())
|
|
return;
|
|
|
|
if(rc_physics3D.constraints[constraint_id].type == RC_CONSTRAINT_TYPE_SLIDER)
|
|
{
|
|
btSliderConstraint* slide = (btSliderConstraint*) rc_physics3D.constraints[constraint_id].constraint;
|
|
slide->setSoftnessLimAng(n);
|
|
}
|
|
}
|
|
|
|
//btSliderConstraint::setSoftnessLimLin()
|
|
void rc_setSlideSoftnessLimLin(int constraint_id, double n)
|
|
{
|
|
if(constraint_id < 0 || constraint_id >= rc_physics3D.constraints.size())
|
|
return;
|
|
|
|
if(rc_physics3D.constraints[constraint_id].type == RC_CONSTRAINT_TYPE_SLIDER)
|
|
{
|
|
btSliderConstraint* slide = (btSliderConstraint*) rc_physics3D.constraints[constraint_id].constraint;
|
|
slide->setSoftnessLimLin(n);
|
|
}
|
|
}
|
|
|
|
//btSliderConstraint::setSoftnessOrthoAng()
|
|
void rc_setSlideSoftnessOrthoAng(int constraint_id, double n)
|
|
{
|
|
if(constraint_id < 0 || constraint_id >= rc_physics3D.constraints.size())
|
|
return;
|
|
|
|
if(rc_physics3D.constraints[constraint_id].type == RC_CONSTRAINT_TYPE_SLIDER)
|
|
{
|
|
btSliderConstraint* slide = (btSliderConstraint*) rc_physics3D.constraints[constraint_id].constraint;
|
|
slide->setSoftnessOrthoAng(n);
|
|
}
|
|
}
|
|
|
|
//btSliderConstraint::setSoftnessOrthoLin()
|
|
void rc_setSlideSoftnessOrthoLin(int constraint_id, double n)
|
|
{
|
|
if(constraint_id < 0 || constraint_id >= rc_physics3D.constraints.size())
|
|
return;
|
|
|
|
if(rc_physics3D.constraints[constraint_id].type == RC_CONSTRAINT_TYPE_SLIDER)
|
|
{
|
|
btSliderConstraint* slide = (btSliderConstraint*) rc_physics3D.constraints[constraint_id].constraint;
|
|
slide->setSoftnessOrthoLin(n);
|
|
}
|
|
}
|
|
|
|
//btSliderConstraint::setUpperAngLimit()
|
|
void rc_setSlideUpperAngLimit(int constraint_id, double n)
|
|
{
|
|
if(constraint_id < 0 || constraint_id >= rc_physics3D.constraints.size())
|
|
return;
|
|
|
|
if(rc_physics3D.constraints[constraint_id].type == RC_CONSTRAINT_TYPE_SLIDER)
|
|
{
|
|
btSliderConstraint* slide = (btSliderConstraint*) rc_physics3D.constraints[constraint_id].constraint;
|
|
slide->setUpperAngLimit(n);
|
|
}
|
|
}
|
|
|
|
//btSliderConstraint::setUpperLinLimit()
|
|
void rc_setSlideUpperLinLimit(int constraint_id, double n)
|
|
{
|
|
if(constraint_id < 0 || constraint_id >= rc_physics3D.constraints.size())
|
|
return;
|
|
|
|
if(rc_physics3D.constraints[constraint_id].type == RC_CONSTRAINT_TYPE_SLIDER)
|
|
{
|
|
btSliderConstraint* slide = (btSliderConstraint*) rc_physics3D.constraints[constraint_id].constraint;
|
|
slide->setUpperLinLimit(n);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void rc_setWorld3DDeltaTime(double dt)
|
|
{
|
|
rc_physics3D.DeltaTime = dt;
|
|
}
|
|
|
|
void rc_setWorld3DMaxSubSteps(double steps)
|
|
{
|
|
rc_physics3D.maxSubSteps = steps;
|
|
}
|
|
|
|
void rc_setWorld3DTimeStep(double ts)
|
|
{
|
|
rc_physics3D.fixedTimeStep = ts;
|
|
}
|
|
|
|
|
|
//set actor animation [TODO]
|
|
void rc_setActorAnimation(int actor, int start_frame, int end_frame)
|
|
{
|
|
if(actor < 0 || actor >= rc_actor.size())
|
|
return;
|
|
|
|
switch(rc_actor[actor].node_type)
|
|
{
|
|
case RC_NODE_TYPE_MESH:
|
|
irr::scene::IAnimatedMeshSceneNode* node = (irr::scene::IAnimatedMeshSceneNode*)rc_actor[actor].mesh_node;
|
|
node->setFrameLoop((irr::s32)start_frame, (irr::s32)end_frame );
|
|
break;
|
|
}
|
|
}
|
|
|
|
void rc_setActorMD2Animation(int actor, int md2_animation)
|
|
{
|
|
if(actor < 0 || actor >= rc_actor.size())
|
|
return;
|
|
|
|
switch(rc_actor[actor].node_type)
|
|
{
|
|
case RC_NODE_TYPE_MESH:
|
|
irr::scene::IAnimatedMeshSceneNode* node = (irr::scene::IAnimatedMeshSceneNode*)rc_actor[actor].mesh_node;
|
|
node->setMD2Animation( (irr::scene::EMD2_ANIMATION_TYPE) md2_animation );
|
|
break;
|
|
}
|
|
}
|
|
|
|
void rc_setActorMD2AnimationByName(int actor, std::string animation_name)
|
|
{
|
|
if(actor < 0 || actor >= rc_actor.size())
|
|
return;
|
|
|
|
switch(rc_actor[actor].node_type)
|
|
{
|
|
case RC_NODE_TYPE_MESH:
|
|
irr::scene::IAnimatedMeshSceneNode* node = (irr::scene::IAnimatedMeshSceneNode*)rc_actor[actor].mesh_node;
|
|
node->setMD2Animation( animation_name.c_str() );
|
|
break;
|
|
}
|
|
}
|
|
|
|
int rc_getActorStartFrame(int actor)
|
|
{
|
|
if(actor < 0 || actor >= rc_actor.size())
|
|
return 0;
|
|
|
|
switch(rc_actor[actor].node_type)
|
|
{
|
|
case RC_NODE_TYPE_MESH:
|
|
irr::scene::IAnimatedMeshSceneNode* node = (irr::scene::IAnimatedMeshSceneNode*)rc_actor[actor].mesh_node;
|
|
return node->getStartFrame();
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
int rc_getActorEndFrame(int actor)
|
|
{
|
|
if(actor < 0 || actor >= rc_actor.size())
|
|
return 0;
|
|
|
|
switch(rc_actor[actor].node_type)
|
|
{
|
|
case RC_NODE_TYPE_MESH:
|
|
irr::scene::IAnimatedMeshSceneNode* node = (irr::scene::IAnimatedMeshSceneNode*)rc_actor[actor].mesh_node;
|
|
return node->getEndFrame();
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
int rc_getActorCurrentFrame(int actor)
|
|
{
|
|
if(actor < 0 || actor >= rc_actor.size())
|
|
return 0;
|
|
|
|
switch(rc_actor[actor].node_type)
|
|
{
|
|
case RC_NODE_TYPE_MESH:
|
|
irr::scene::IAnimatedMeshSceneNode* node = (irr::scene::IAnimatedMeshSceneNode*)rc_actor[actor].mesh_node;
|
|
return node->getFrameNr();
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
//set actor animation speed
|
|
void rc_setActorAnimationSpeed(int actor, double speed)
|
|
{
|
|
if(actor < 0 || actor >= rc_actor.size())
|
|
return;
|
|
|
|
switch(rc_actor[actor].node_type)
|
|
{
|
|
case RC_NODE_TYPE_MESH:
|
|
irr::scene::IAnimatedMeshSceneNode* node = (irr::scene::IAnimatedMeshSceneNode*)rc_actor[actor].mesh_node;
|
|
node->setAnimationSpeed( (irr::f32)speed );
|
|
break;
|
|
}
|
|
}
|
|
|
|
double rc_getActorAnimationSpeed(int actor)
|
|
{
|
|
if(actor < 0 || actor >= rc_actor.size())
|
|
return 0;
|
|
|
|
switch(rc_actor[actor].node_type)
|
|
{
|
|
case RC_NODE_TYPE_MESH:
|
|
irr::scene::IAnimatedMeshSceneNode* node = (irr::scene::IAnimatedMeshSceneNode*)rc_actor[actor].mesh_node;
|
|
return node->getAnimationSpeed();
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
void rc_setActorFrame(int actor, int frame)
|
|
{
|
|
if(actor < 0 || actor >= rc_actor.size())
|
|
return;
|
|
|
|
switch(rc_actor[actor].node_type)
|
|
{
|
|
case RC_NODE_TYPE_MESH:
|
|
irr::scene::IAnimatedMeshSceneNode* node = (irr::scene::IAnimatedMeshSceneNode*)rc_actor[actor].mesh_node;
|
|
node->setCurrentFrame(frame);
|
|
break;
|
|
}
|
|
}
|
|
|
|
//set actor animation speed
|
|
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_MESH:
|
|
irr::scene::IAnimatedMeshSceneNode* node = (irr::scene::IAnimatedMeshSceneNode*)rc_actor[actor].mesh_node;
|
|
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_MESH:
|
|
irr::scene::IAnimatedMeshSceneNode* node = (irr::scene::IAnimatedMeshSceneNode*)rc_actor[actor].mesh_node;
|
|
node->removeChild(rc_actor[actor].shadow);
|
|
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;
|
|
c.set(color);
|
|
irr::video::SColorf cf(c);
|
|
irr::video::SLight light_data = node->getLightData();
|
|
light_data.AmbientColor = cf;
|
|
node->setLightData(light_data);
|
|
}
|
|
}
|
|
|
|
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;
|
|
irr::video::SLight light_data = node->getLightData();
|
|
light_data.Attenuation.set(l_constant, l_linear, l_quadratic);
|
|
node->setLightData(light_data);
|
|
}
|
|
}
|
|
|
|
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;
|
|
c.set(color);
|
|
irr::video::SColorf cf(c);
|
|
irr::video::SLight light_data = node->getLightData();
|
|
light_data.DiffuseColor = cf;
|
|
node->setLightData(light_data);
|
|
}
|
|
}
|
|
|
|
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;
|
|
irr::video::SLight light_data = node->getLightData();
|
|
light_data.Falloff = falloff;
|
|
node->setLightData(light_data);
|
|
}
|
|
}
|
|
|
|
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;
|
|
irr::video::SLight light_data = node->getLightData();
|
|
light_data.InnerCone = angle;
|
|
node->setLightData(light_data);
|
|
}
|
|
}
|
|
|
|
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;
|
|
irr::video::SLight light_data = node->getLightData();
|
|
light_data.OuterCone = angle;
|
|
node->setLightData(light_data);
|
|
}
|
|
}
|
|
|
|
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;
|
|
c.set(color);
|
|
irr::video::SColorf cf(c);
|
|
irr::video::SLight light_data = node->getLightData();
|
|
light_data.SpecularColor = cf;
|
|
node->setLightData(light_data);
|
|
}
|
|
}
|
|
|
|
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;
|
|
}
|
|
|
|
|
|
void rc_loopActorAnimation(int actor, bool flag)
|
|
{
|
|
if(actor < 0 || actor >= rc_actor.size())
|
|
return;
|
|
|
|
switch(rc_actor[actor].node_type)
|
|
{
|
|
case RC_NODE_TYPE_MESH:
|
|
irr::scene::IAnimatedMeshSceneNode* node = (irr::scene::IAnimatedMeshSceneNode*)rc_actor[actor].mesh_node;
|
|
node->setLoopMode(flag);
|
|
break;
|
|
}
|
|
}
|
|
|
|
bool rc_actorAnimationIsLooped(int actor)
|
|
{
|
|
if(actor < 0 || actor >= rc_actor.size())
|
|
return false;
|
|
|
|
switch(rc_actor[actor].node_type)
|
|
{
|
|
case RC_NODE_TYPE_MESH:
|
|
irr::scene::IAnimatedMeshSceneNode* node = (irr::scene::IAnimatedMeshSceneNode*)rc_actor[actor].mesh_node;
|
|
return node->getLoopMode();
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
//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_startActorTransition(int actor, double frame, double transition_time)
|
|
{
|
|
if(actor < 0 || actor >= rc_actor.size())
|
|
return;
|
|
|
|
if(rc_actor[actor].transition)
|
|
return;
|
|
|
|
switch(rc_actor[actor].node_type)
|
|
{
|
|
case RC_NODE_TYPE_MESH:
|
|
irr::scene::IAnimatedMeshSceneNode* node = (irr::scene::IAnimatedMeshSceneNode*)rc_actor[actor].mesh_node;
|
|
node->setTransitionTime(transition_time);
|
|
node->setJointMode(irr::scene::EJUOR_CONTROL);
|
|
node->setCurrentFrame(frame);
|
|
rc_actor[actor].transition = true;
|
|
rc_actor[actor].transition_time = transition_time;
|
|
rc_actor[actor].transition_start_time = ((double)SDL_GetTicks())/1000.0;
|
|
rc_transition_actor.push_back(actor);
|
|
}
|
|
}
|
|
|
|
double rc_getActorTransitionTime(int actor)
|
|
{
|
|
if(actor < 0 || actor >= rc_actor.size())
|
|
return 0;
|
|
|
|
if(rc_actor[actor].transition)
|
|
return rc_actor[actor].transition_time;
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
void rc_stopActorTransition(int actor)
|
|
{
|
|
if(actor < 0 || actor >= rc_actor.size())
|
|
return;
|
|
|
|
|
|
switch(rc_actor[actor].node_type)
|
|
{
|
|
case RC_NODE_TYPE_MESH:
|
|
irr::scene::IAnimatedMeshSceneNode* node = (irr::scene::IAnimatedMeshSceneNode*)rc_actor[actor].mesh_node;
|
|
node->setTransitionTime(0);
|
|
node->setJointMode(irr::scene::EJUOR_NONE);
|
|
rc_actor[actor].transition = false;
|
|
rc_actor[actor].transition_time = 0;
|
|
|
|
for(int i = 0; i < rc_transition_actor.size();)
|
|
{
|
|
if(rc_transition_actor[i] == actor)
|
|
{
|
|
rc_transition_actor.erase(i);
|
|
}
|
|
else
|
|
i++;
|
|
}
|
|
}
|
|
}
|
|
|
|
bool rc_actorIsInTransition(int actor)
|
|
{
|
|
if(actor < 0 || actor >= rc_actor.size())
|
|
return false;
|
|
|
|
return rc_actor[actor].transition;
|
|
}
|
|
|
|
|
|
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<irr::f32> 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<irr::s32> 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);
|
|
}
|
|
}
|
|
|
|
int rc_getParticleType(int actor)
|
|
{
|
|
if(actor < 0 || actor >= rc_actor.size())
|
|
return 0;
|
|
|
|
if(rc_actor[actor].node_type != RC_NODE_TYPE_PARTICLE)
|
|
return 0;
|
|
|
|
return rc_actor[actor].particle_properties.particle_type;
|
|
}
|
|
|
|
void rc_startParticleEmitter(int actor)
|
|
{
|
|
if(actor < 0 || actor >= rc_actor.size())
|
|
return;
|
|
|
|
if(rc_actor[actor].node_type != RC_NODE_TYPE_PARTICLE)
|
|
return;
|
|
|
|
|
|
bool everyMeshVertex = rc_actor[actor].particle_properties.everyMeshVertex;
|
|
irr::s32 mbNumber = rc_actor[actor].particle_properties.mbNumber;
|
|
irr::f32 normalDirectionModifier = rc_actor[actor].particle_properties.normalDirectionModifier;
|
|
bool useNormalDirection = rc_actor[actor].particle_properties.useNormalDirection;
|
|
irr::s32 mesh_id = rc_actor[actor].particle_properties.mesh_id;
|
|
irr::core::vector3df direction = rc_actor[actor].particle_properties.direction;
|
|
irr::u32 minParticlesPerSecond = rc_actor[actor].particle_properties.minParticlesPerSecond;
|
|
irr::u32 maxParticlesPerSecond = rc_actor[actor].particle_properties.maxParticlesPerSecond;
|
|
irr::video::SColor minStartColor = rc_actor[actor].particle_properties.minStartColor;
|
|
irr::video::SColor maxStartColor = rc_actor[actor].particle_properties.maxStartColor;
|
|
irr::u32 lifeTimeMin = rc_actor[actor].particle_properties.lifeTimeMin;
|
|
irr::u32 lifeTimeMax = rc_actor[actor].particle_properties.lifeTimeMax;
|
|
irr::s32 maxAngleDegrees = rc_actor[actor].particle_properties.maxAngleDegrees;
|
|
irr::core::dimension2df minStartSize = rc_actor[actor].particle_properties.minStartSize;
|
|
irr::core::dimension2df maxStartSize = rc_actor[actor].particle_properties.maxStartSize;
|
|
irr::core::vector3df center = rc_actor[actor].particle_properties.center;
|
|
irr::f32 radius = rc_actor[actor].particle_properties.radius;
|
|
irr::f32 ringThickness = rc_actor[actor].particle_properties.ringThickness;
|
|
irr::core::aabbox3df box = rc_actor[actor].particle_properties.box;
|
|
irr::core::vector3df normal = rc_actor[actor].particle_properties.normal;
|
|
irr::f32 length = rc_actor[actor].particle_properties.length;
|
|
bool outlineOnly = rc_actor[actor].particle_properties.outlineOnly;
|
|
|
|
irr::scene::IParticleSystemSceneNode* node = (irr::scene::IParticleSystemSceneNode*) rc_actor[actor].mesh_node;
|
|
|
|
irr::scene::IParticleEmitter* em = NULL;
|
|
|
|
switch(rc_actor[actor].particle_properties.particle_type)
|
|
{
|
|
case RC_PARTICLE_TYPE_POINT:
|
|
em = node->createPointEmitter(direction, minParticlesPerSecond, maxParticlesPerSecond,
|
|
minStartColor, maxStartColor, lifeTimeMin, lifeTimeMax,
|
|
maxAngleDegrees, minStartSize, maxStartSize);
|
|
node->setEmitter(em);
|
|
em->drop();
|
|
break;
|
|
|
|
case RC_PARTICLE_TYPE_BOX:
|
|
em = node->createBoxEmitter(box, direction, minParticlesPerSecond, maxParticlesPerSecond,
|
|
minStartColor, maxStartColor, lifeTimeMin, lifeTimeMax,
|
|
maxAngleDegrees, minStartSize, maxStartSize);
|
|
node->setEmitter(em);
|
|
em->drop();
|
|
break;
|
|
|
|
case RC_PARTICLE_TYPE_SPHERE:
|
|
em = node->createSphereEmitter(center, radius, direction,
|
|
minParticlesPerSecond, maxParticlesPerSecond,
|
|
minStartColor, maxStartColor, lifeTimeMin, lifeTimeMax,
|
|
maxAngleDegrees, minStartSize, maxStartSize);
|
|
node->setEmitter(em);
|
|
em->drop();
|
|
break;
|
|
|
|
case RC_PARTICLE_TYPE_CYLINDER:
|
|
em = node->createCylinderEmitter(center, radius, normal, length, outlineOnly,
|
|
direction, minParticlesPerSecond, maxParticlesPerSecond,
|
|
minStartColor, maxStartColor, lifeTimeMin, lifeTimeMax,
|
|
maxAngleDegrees, minStartSize, maxStartSize);
|
|
node->setEmitter(em);
|
|
em->drop();
|
|
break;
|
|
|
|
case RC_PARTICLE_TYPE_MESH:
|
|
if(mesh_id < 0 || mesh_id >= rc_mesh.size())
|
|
return;
|
|
|
|
if(!rc_mesh[mesh_id].mesh)
|
|
return;
|
|
|
|
em = node->createMeshEmitter(rc_mesh[mesh_id].mesh, useNormalDirection,
|
|
direction, normalDirectionModifier, mbNumber, everyMeshVertex,
|
|
minParticlesPerSecond, maxParticlesPerSecond,
|
|
minStartColor, maxStartColor, lifeTimeMin, lifeTimeMax,
|
|
maxAngleDegrees, minStartSize, maxStartSize);
|
|
node->setEmitter(em);
|
|
em->drop();
|
|
break;
|
|
|
|
case RC_PARTICLE_TYPE_RING:
|
|
em = node->createRingEmitter(center, radius, ringThickness,
|
|
direction, minParticlesPerSecond, maxParticlesPerSecond,
|
|
minStartColor, maxStartColor, lifeTimeMin, lifeTimeMax,
|
|
maxAngleDegrees, minStartSize, maxStartSize);
|
|
node->setEmitter(em);
|
|
em->drop();
|
|
break;
|
|
}
|
|
}
|
|
|
|
void rc_stopParticleEmitter(int actor)
|
|
{
|
|
if(actor < 0 || actor >= rc_actor.size())
|
|
return;
|
|
|
|
if(rc_actor[actor].node_type != RC_NODE_TYPE_PARTICLE)
|
|
return;
|
|
|
|
irr::scene::IParticleSystemSceneNode* node = (irr::scene::IParticleSystemSceneNode*) rc_actor[actor].mesh_node;
|
|
node->setEmitter(0);
|
|
}
|
|
|
|
void rc_setParticleDirection(int actor, double x, double y, double z)
|
|
{
|
|
if(actor < 0 || actor >= rc_actor.size())
|
|
return;
|
|
|
|
if(rc_actor[actor].node_type != RC_NODE_TYPE_PARTICLE)
|
|
return;
|
|
|
|
rc_actor[actor].particle_properties.direction.set(x, y, z);
|
|
|
|
irr::scene::IParticleSystemSceneNode* node = (irr::scene::IParticleSystemSceneNode*)rc_actor[actor].mesh_node;
|
|
|
|
if(node->getEmitter())
|
|
node->getEmitter()->setDirection( rc_actor[actor].particle_properties.direction );
|
|
}
|
|
|
|
void rc_getParticleDirection(int actor, double* x, double* y, double* z)
|
|
{
|
|
*x = 0;
|
|
*y = 0;
|
|
*z = 0;
|
|
|
|
if(actor < 0 || actor >= rc_actor.size())
|
|
return;
|
|
|
|
if(rc_actor[actor].node_type != RC_NODE_TYPE_PARTICLE)
|
|
return;
|
|
|
|
*x = rc_actor[actor].particle_properties.direction.X;
|
|
*y = rc_actor[actor].particle_properties.direction.Y;
|
|
*z = rc_actor[actor].particle_properties.direction.Z;
|
|
}
|
|
|
|
void rc_useParticleEveryMeshVertex(int actor, bool flag)
|
|
{
|
|
if(actor < 0 || actor >= rc_actor.size())
|
|
return;
|
|
|
|
if(rc_actor[actor].node_type != RC_NODE_TYPE_PARTICLE)
|
|
return;
|
|
|
|
if(rc_actor[actor].particle_properties.particle_type != RC_PARTICLE_TYPE_MESH)
|
|
return;
|
|
|
|
rc_actor[actor].particle_properties.everyMeshVertex = flag;
|
|
|
|
irr::scene::IParticleSystemSceneNode* node = (irr::scene::IParticleSystemSceneNode*)rc_actor[actor].mesh_node;
|
|
|
|
if(node->getEmitter())
|
|
{
|
|
irr::scene::IParticleMeshEmitter* em = (irr::scene::IParticleMeshEmitter*)node->getEmitter();
|
|
em->setEveryMeshVertex(rc_actor[actor].particle_properties.everyMeshVertex);
|
|
}
|
|
}
|
|
|
|
bool rc_particleIsUsingEveryMeshVertex(int actor)
|
|
{
|
|
if(actor < 0 || actor >= rc_actor.size())
|
|
return false;
|
|
|
|
if(rc_actor[actor].node_type != RC_NODE_TYPE_PARTICLE)
|
|
return false;
|
|
|
|
if(rc_actor[actor].particle_properties.particle_type != RC_PARTICLE_TYPE_MESH)
|
|
return false;
|
|
|
|
return rc_actor[actor].particle_properties.everyMeshVertex;
|
|
|
|
}
|
|
|
|
void rc_setParticleNormalDirectionMod(int actor, double mod)
|
|
{
|
|
if(actor < 0 || actor >= rc_actor.size())
|
|
return;
|
|
|
|
if(rc_actor[actor].node_type != RC_NODE_TYPE_PARTICLE)
|
|
return;
|
|
|
|
if(rc_actor[actor].particle_properties.particle_type != RC_PARTICLE_TYPE_MESH)
|
|
return;
|
|
|
|
rc_actor[actor].particle_properties.normalDirectionModifier = mod;
|
|
|
|
irr::scene::IParticleSystemSceneNode* node = (irr::scene::IParticleSystemSceneNode*)rc_actor[actor].mesh_node;
|
|
|
|
if(node->getEmitter())
|
|
{
|
|
irr::scene::IParticleMeshEmitter* em = (irr::scene::IParticleMeshEmitter*)node->getEmitter();
|
|
em->setNormalDirectionModifier(rc_actor[actor].particle_properties.normalDirectionModifier);
|
|
}
|
|
}
|
|
|
|
double rc_getParticleNormalDirectionMod(int actor)
|
|
{
|
|
if(actor < 0 || actor >= rc_actor.size())
|
|
return 0;
|
|
|
|
if(rc_actor[actor].node_type != RC_NODE_TYPE_PARTICLE)
|
|
return 0;
|
|
|
|
if(rc_actor[actor].particle_properties.particle_type != RC_PARTICLE_TYPE_MESH)
|
|
return 0;
|
|
|
|
return rc_actor[actor].particle_properties.normalDirectionModifier;
|
|
}
|
|
|
|
void rc_useParticleNormalDirection(int actor, bool flag)
|
|
{
|
|
if(actor < 0 || actor >= rc_actor.size())
|
|
return;
|
|
|
|
if(rc_actor[actor].node_type != RC_NODE_TYPE_PARTICLE)
|
|
return;
|
|
|
|
if(rc_actor[actor].particle_properties.particle_type != RC_PARTICLE_TYPE_MESH)
|
|
return;
|
|
|
|
rc_actor[actor].particle_properties.useNormalDirection = flag;
|
|
|
|
irr::scene::IParticleSystemSceneNode* node = (irr::scene::IParticleSystemSceneNode*)rc_actor[actor].mesh_node;
|
|
|
|
if(node->getEmitter())
|
|
{
|
|
irr::scene::IParticleMeshEmitter* em = (irr::scene::IParticleMeshEmitter*)node->getEmitter();
|
|
em->setUseNormalDirection(rc_actor[actor].particle_properties.useNormalDirection);
|
|
}
|
|
}
|
|
|
|
bool rc_particleIsUsingNormalDirection(int actor)
|
|
{
|
|
if(actor < 0 || actor >= rc_actor.size())
|
|
return false;
|
|
|
|
if(rc_actor[actor].node_type != RC_NODE_TYPE_PARTICLE)
|
|
return false;
|
|
|
|
if(rc_actor[actor].particle_properties.particle_type != RC_PARTICLE_TYPE_MESH)
|
|
return false;
|
|
|
|
return rc_actor[actor].particle_properties.useNormalDirection;
|
|
}
|
|
|
|
void rc_setParticleMesh(int actor, int mesh)
|
|
{
|
|
if(actor < 0 || actor >= rc_actor.size())
|
|
return;
|
|
|
|
if(rc_actor[actor].node_type != RC_NODE_TYPE_PARTICLE)
|
|
return;
|
|
|
|
if(rc_actor[actor].particle_properties.particle_type != RC_PARTICLE_TYPE_MESH)
|
|
return;
|
|
|
|
rc_actor[actor].particle_properties.mesh_id = mesh;
|
|
|
|
irr::scene::IParticleSystemSceneNode* node = (irr::scene::IParticleSystemSceneNode*)rc_actor[actor].mesh_node;
|
|
|
|
if(node->getEmitter())
|
|
{
|
|
if(mesh < 0 || mesh >= rc_mesh.size())
|
|
return;
|
|
|
|
if(!rc_mesh[mesh].mesh)
|
|
return;
|
|
|
|
irr::scene::IParticleMeshEmitter* em = (irr::scene::IParticleMeshEmitter*)node->getEmitter();
|
|
em->setMesh(rc_mesh[mesh].mesh);
|
|
}
|
|
}
|
|
|
|
void rc_setMinParticlesPerSecond(int actor, Uint32 minParticlesPerSecond)
|
|
{
|
|
if(actor < 0 || actor >= rc_actor.size())
|
|
return;
|
|
|
|
if(rc_actor[actor].node_type != RC_NODE_TYPE_PARTICLE)
|
|
return;
|
|
|
|
rc_actor[actor].particle_properties.minParticlesPerSecond = minParticlesPerSecond;
|
|
|
|
irr::scene::IParticleSystemSceneNode* node = (irr::scene::IParticleSystemSceneNode*)rc_actor[actor].mesh_node;
|
|
|
|
if(node->getEmitter())
|
|
node->getEmitter()->setMinParticlesPerSecond(minParticlesPerSecond);
|
|
}
|
|
|
|
Uint32 rc_getMinParticlesPerSecond(int actor)
|
|
{
|
|
if(actor < 0 || actor >= rc_actor.size())
|
|
return 0;
|
|
|
|
if(rc_actor[actor].node_type != RC_NODE_TYPE_PARTICLE)
|
|
return 0;
|
|
|
|
return rc_actor[actor].particle_properties.minParticlesPerSecond;
|
|
}
|
|
|
|
void rc_setMaxParticlesPerSecond(int actor, Uint32 maxParticlesPerSecond)
|
|
{
|
|
if(actor < 0 || actor >= rc_actor.size())
|
|
return;
|
|
|
|
if(rc_actor[actor].node_type != RC_NODE_TYPE_PARTICLE)
|
|
return;
|
|
|
|
rc_actor[actor].particle_properties.maxParticlesPerSecond = maxParticlesPerSecond;
|
|
|
|
irr::scene::IParticleSystemSceneNode* node = (irr::scene::IParticleSystemSceneNode*)rc_actor[actor].mesh_node;
|
|
|
|
if(node->getEmitter())
|
|
node->getEmitter()->setMaxParticlesPerSecond(maxParticlesPerSecond);
|
|
}
|
|
|
|
Uint32 rc_getMaxParticlesPerSecond(int actor)
|
|
{
|
|
if(actor < 0 || actor >= rc_actor.size())
|
|
return 0;
|
|
|
|
if(rc_actor[actor].node_type != RC_NODE_TYPE_PARTICLE)
|
|
return 0;
|
|
|
|
return rc_actor[actor].particle_properties.maxParticlesPerSecond;
|
|
}
|
|
|
|
void rc_setParticleMinStartColor(int actor, Uint32 color)
|
|
{
|
|
if(actor < 0 || actor >= rc_actor.size())
|
|
return;
|
|
|
|
if(rc_actor[actor].node_type != RC_NODE_TYPE_PARTICLE)
|
|
return;
|
|
|
|
rc_actor[actor].particle_properties.minStartColor = irr::video::SColor(color);
|
|
|
|
irr::scene::IParticleSystemSceneNode* node = (irr::scene::IParticleSystemSceneNode*)rc_actor[actor].mesh_node;
|
|
|
|
if(node->getEmitter())
|
|
node->getEmitter()->setMinStartColor(rc_actor[actor].particle_properties.minStartColor);
|
|
}
|
|
|
|
Uint32 rc_getParticleMinStartColor(int actor)
|
|
{
|
|
if(actor < 0 || actor >= rc_actor.size())
|
|
return 0;
|
|
|
|
if(rc_actor[actor].node_type != RC_NODE_TYPE_PARTICLE)
|
|
return 0;
|
|
|
|
return rc_actor[actor].particle_properties.minStartColor.color;
|
|
}
|
|
|
|
void rc_setParticleMaxStartColor(int actor, Uint32 color)
|
|
{
|
|
if(actor < 0 || actor >= rc_actor.size())
|
|
return;
|
|
|
|
if(rc_actor[actor].node_type != RC_NODE_TYPE_PARTICLE)
|
|
return;
|
|
|
|
rc_actor[actor].particle_properties.maxStartColor = irr::video::SColor(color);
|
|
|
|
irr::scene::IParticleSystemSceneNode* node = (irr::scene::IParticleSystemSceneNode*)rc_actor[actor].mesh_node;
|
|
|
|
if(node->getEmitter())
|
|
node->getEmitter()->setMaxStartColor(rc_actor[actor].particle_properties.maxStartColor);
|
|
}
|
|
|
|
Uint32 rc_getParticleMaxStartColor(int actor)
|
|
{
|
|
if(actor < 0 || actor >= rc_actor.size())
|
|
return 0;
|
|
|
|
if(rc_actor[actor].node_type != RC_NODE_TYPE_PARTICLE)
|
|
return 0;
|
|
|
|
return rc_actor[actor].particle_properties.maxStartColor.color;
|
|
}
|
|
|
|
void rc_setParticleMinLife(int actor, Uint32 minLife)
|
|
{
|
|
if(actor < 0 || actor >= rc_actor.size())
|
|
return;
|
|
|
|
if(rc_actor[actor].node_type != RC_NODE_TYPE_PARTICLE)
|
|
return;
|
|
|
|
rc_actor[actor].particle_properties.lifeTimeMin = minLife;
|
|
|
|
irr::scene::IParticleSystemSceneNode* node = (irr::scene::IParticleSystemSceneNode*)rc_actor[actor].mesh_node;
|
|
|
|
if(node->getEmitter())
|
|
node->getEmitter()->setMinLifeTime(rc_actor[actor].particle_properties.lifeTimeMin);
|
|
}
|
|
|
|
Uint32 rc_getParticleMinLife(int actor)
|
|
{
|
|
if(actor < 0 || actor >= rc_actor.size())
|
|
return 0;
|
|
|
|
if(rc_actor[actor].node_type != RC_NODE_TYPE_PARTICLE)
|
|
return 0;
|
|
|
|
return rc_actor[actor].particle_properties.lifeTimeMin;
|
|
}
|
|
|
|
void rc_setParticleMaxLife(int actor, Uint32 maxLife)
|
|
{
|
|
if(actor < 0 || actor >= rc_actor.size())
|
|
return;
|
|
|
|
if(rc_actor[actor].node_type != RC_NODE_TYPE_PARTICLE)
|
|
return;
|
|
|
|
rc_actor[actor].particle_properties.lifeTimeMax = maxLife;
|
|
|
|
irr::scene::IParticleSystemSceneNode* node = (irr::scene::IParticleSystemSceneNode*)rc_actor[actor].mesh_node;
|
|
|
|
if(node->getEmitter())
|
|
node->getEmitter()->setMaxLifeTime(rc_actor[actor].particle_properties.lifeTimeMax);
|
|
}
|
|
|
|
Uint32 rc_getParticleMaxLife(int actor)
|
|
{
|
|
if(actor < 0 || actor >= rc_actor.size())
|
|
return 0;
|
|
|
|
if(rc_actor[actor].node_type != RC_NODE_TYPE_PARTICLE)
|
|
return 0;
|
|
|
|
return rc_actor[actor].particle_properties.lifeTimeMax;
|
|
}
|
|
|
|
void rc_setParticleMaxAngle(int actor, int maxAngle)
|
|
{
|
|
if(actor < 0 || actor >= rc_actor.size())
|
|
return;
|
|
|
|
if(rc_actor[actor].node_type != RC_NODE_TYPE_PARTICLE)
|
|
return;
|
|
|
|
rc_actor[actor].particle_properties.maxAngleDegrees = maxAngle;
|
|
|
|
irr::scene::IParticleSystemSceneNode* node = (irr::scene::IParticleSystemSceneNode*)rc_actor[actor].mesh_node;
|
|
|
|
if(node->getEmitter())
|
|
node->getEmitter()->setMaxAngleDegrees(rc_actor[actor].particle_properties.maxAngleDegrees);
|
|
}
|
|
|
|
int rc_getParticleMaxAngle(int actor)
|
|
{
|
|
if(actor < 0 || actor >= rc_actor.size())
|
|
return 0;
|
|
|
|
if(rc_actor[actor].node_type != RC_NODE_TYPE_PARTICLE)
|
|
return 0;
|
|
|
|
return rc_actor[actor].particle_properties.maxAngleDegrees;
|
|
}
|
|
|
|
void rc_setParticleMinStartSize(int actor, double w, double h)
|
|
{
|
|
if(actor < 0 || actor >= rc_actor.size())
|
|
return;
|
|
|
|
if(rc_actor[actor].node_type != RC_NODE_TYPE_PARTICLE)
|
|
return;
|
|
|
|
rc_actor[actor].particle_properties.minStartSize = irr::core::dimension2df(w, h);
|
|
|
|
irr::scene::IParticleSystemSceneNode* node = (irr::scene::IParticleSystemSceneNode*)rc_actor[actor].mesh_node;
|
|
|
|
if(node->getEmitter())
|
|
node->getEmitter()->setMinStartSize(rc_actor[actor].particle_properties.minStartSize);
|
|
}
|
|
|
|
void rc_getParticleMinStartSize(int actor, double* w, double* h)
|
|
{
|
|
*w = 0;
|
|
*h = 0;
|
|
|
|
if(actor < 0 || actor >= rc_actor.size())
|
|
return;
|
|
|
|
if(rc_actor[actor].node_type != RC_NODE_TYPE_PARTICLE)
|
|
return;
|
|
|
|
*w = rc_actor[actor].particle_properties.minStartSize.Width;
|
|
*h = rc_actor[actor].particle_properties.minStartSize.Height;
|
|
}
|
|
|
|
void rc_setParticleMaxStartSize(int actor, double w, double h)
|
|
{
|
|
if(actor < 0 || actor >= rc_actor.size())
|
|
return;
|
|
|
|
if(rc_actor[actor].node_type != RC_NODE_TYPE_PARTICLE)
|
|
return;
|
|
|
|
rc_actor[actor].particle_properties.maxStartSize = irr::core::dimension2df(w, h);
|
|
|
|
irr::scene::IParticleSystemSceneNode* node = (irr::scene::IParticleSystemSceneNode*)rc_actor[actor].mesh_node;
|
|
|
|
if(node->getEmitter())
|
|
node->getEmitter()->setMaxStartSize(rc_actor[actor].particle_properties.maxStartSize);
|
|
}
|
|
|
|
void rc_getParticleMaxStartSize(int actor, double* w, double* h)
|
|
{
|
|
*w = 0;
|
|
*h = 0;
|
|
|
|
if(actor < 0 || actor >= rc_actor.size())
|
|
return;
|
|
|
|
if(rc_actor[actor].node_type != RC_NODE_TYPE_PARTICLE)
|
|
return;
|
|
|
|
*w = rc_actor[actor].particle_properties.maxStartSize.Width;
|
|
*h = rc_actor[actor].particle_properties.maxStartSize.Height;
|
|
}
|
|
|
|
void rc_setParticleCenter(int actor, double x, double y, double z)
|
|
{
|
|
if(actor < 0 || actor >= rc_actor.size())
|
|
return;
|
|
|
|
if(rc_actor[actor].node_type != RC_NODE_TYPE_PARTICLE)
|
|
return;
|
|
|
|
rc_actor[actor].particle_properties.center = irr::core::vector3df(x, y, z);
|
|
|
|
irr::scene::IParticleSystemSceneNode* node = (irr::scene::IParticleSystemSceneNode*)rc_actor[actor].mesh_node;
|
|
|
|
if(!node->getEmitter())
|
|
return;
|
|
|
|
|
|
switch(rc_actor[actor].particle_properties.particle_type)
|
|
{
|
|
case RC_PARTICLE_TYPE_SPHERE:
|
|
{
|
|
irr::scene::IParticleSphereEmitter* em = (irr::scene::IParticleSphereEmitter*)node->getEmitter();
|
|
em->setCenter(rc_actor[actor].particle_properties.center);
|
|
}
|
|
break;
|
|
case RC_PARTICLE_TYPE_CYLINDER:
|
|
{
|
|
irr::scene::IParticleCylinderEmitter* em = (irr::scene::IParticleCylinderEmitter*)node->getEmitter();
|
|
em->setCenter(rc_actor[actor].particle_properties.center);
|
|
}
|
|
break;
|
|
case RC_PARTICLE_TYPE_RING:
|
|
{
|
|
irr::scene::IParticleRingEmitter* em = (irr::scene::IParticleRingEmitter*)node->getEmitter();
|
|
em->setCenter(rc_actor[actor].particle_properties.center);
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
void rc_getParticleCenter(int actor, double* x, double* y, double* z)
|
|
{
|
|
*x = 0;
|
|
*y = 0;
|
|
*z = 0;
|
|
|
|
if(actor < 0 || actor >= rc_actor.size())
|
|
return;
|
|
|
|
if(rc_actor[actor].node_type != RC_NODE_TYPE_PARTICLE)
|
|
return;
|
|
|
|
*x = rc_actor[actor].particle_properties.center.X;
|
|
*y = rc_actor[actor].particle_properties.center.Y;
|
|
*z = rc_actor[actor].particle_properties.center.Z;
|
|
}
|
|
|
|
void rc_setParticleRadius(int actor, double radius)
|
|
{
|
|
if(actor < 0 || actor >= rc_actor.size())
|
|
return;
|
|
|
|
if(rc_actor[actor].node_type != RC_NODE_TYPE_PARTICLE)
|
|
return;
|
|
|
|
rc_actor[actor].particle_properties.radius = radius;
|
|
|
|
irr::scene::IParticleSystemSceneNode* node = (irr::scene::IParticleSystemSceneNode*)rc_actor[actor].mesh_node;
|
|
|
|
if(!node->getEmitter())
|
|
return;
|
|
|
|
|
|
switch(rc_actor[actor].particle_properties.particle_type)
|
|
{
|
|
case RC_PARTICLE_TYPE_SPHERE:
|
|
{
|
|
irr::scene::IParticleSphereEmitter* em = (irr::scene::IParticleSphereEmitter*)node->getEmitter();
|
|
em->setRadius(rc_actor[actor].particle_properties.radius);
|
|
}
|
|
break;
|
|
case RC_PARTICLE_TYPE_CYLINDER:
|
|
{
|
|
irr::scene::IParticleCylinderEmitter* em = (irr::scene::IParticleCylinderEmitter*)node->getEmitter();
|
|
em->setRadius(rc_actor[actor].particle_properties.radius);
|
|
}
|
|
break;
|
|
case RC_PARTICLE_TYPE_RING:
|
|
{
|
|
irr::scene::IParticleRingEmitter* em = (irr::scene::IParticleRingEmitter*)node->getEmitter();
|
|
em->setRadius(rc_actor[actor].particle_properties.radius);
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
double rc_getParticleRadius(int actor)
|
|
{
|
|
if(actor < 0 || actor >= rc_actor.size())
|
|
return 0;
|
|
|
|
if(rc_actor[actor].node_type != RC_NODE_TYPE_PARTICLE)
|
|
return 0;
|
|
|
|
return rc_actor[actor].particle_properties.radius;
|
|
}
|
|
|
|
void rc_setParticleRingThickness(int actor, double ringThickness)
|
|
{
|
|
if(actor < 0 || actor >= rc_actor.size())
|
|
return;
|
|
|
|
if(rc_actor[actor].node_type != RC_NODE_TYPE_PARTICLE)
|
|
return;
|
|
|
|
rc_actor[actor].particle_properties.ringThickness = ringThickness;
|
|
|
|
irr::scene::IParticleSystemSceneNode* node = (irr::scene::IParticleSystemSceneNode*)rc_actor[actor].mesh_node;
|
|
|
|
if(!node->getEmitter())
|
|
return;
|
|
|
|
|
|
switch(rc_actor[actor].particle_properties.particle_type)
|
|
{
|
|
case RC_PARTICLE_TYPE_RING:
|
|
{
|
|
irr::scene::IParticleRingEmitter* em = (irr::scene::IParticleRingEmitter*)node->getEmitter();
|
|
em->setRingThickness(rc_actor[actor].particle_properties.ringThickness);
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
double rc_getParticleRingThickness(int actor)
|
|
{
|
|
if(actor < 0 || actor >= rc_actor.size())
|
|
return 0;
|
|
|
|
if(rc_actor[actor].node_type != RC_NODE_TYPE_PARTICLE)
|
|
return 0;
|
|
|
|
return rc_actor[actor].particle_properties.ringThickness;
|
|
}
|
|
|
|
void rc_setParticleBox(int actor, 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;
|
|
|
|
if(rc_actor[actor].node_type != RC_NODE_TYPE_PARTICLE)
|
|
return;
|
|
|
|
rc_actor[actor].particle_properties.box = irr::core::aabbox3df(min_x, min_y, min_z, max_x, max_y, max_z);
|
|
|
|
irr::scene::IParticleSystemSceneNode* node = (irr::scene::IParticleSystemSceneNode*)rc_actor[actor].mesh_node;
|
|
|
|
if(!node->getEmitter())
|
|
return;
|
|
|
|
|
|
switch(rc_actor[actor].particle_properties.particle_type)
|
|
{
|
|
case RC_PARTICLE_TYPE_BOX:
|
|
{
|
|
irr::scene::IParticleBoxEmitter* em = (irr::scene::IParticleBoxEmitter*)node->getEmitter();
|
|
em->setBox(rc_actor[actor].particle_properties.box);
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
void rc_getParticleBox(int actor, double* min_x, double* min_y, double* min_z, double* max_x, double* max_y, double* max_z)
|
|
{
|
|
*min_x = 0;
|
|
*min_y = 0;
|
|
*min_z = 0;
|
|
|
|
*max_x = 0;
|
|
*max_y = 0;
|
|
*max_z = 0;
|
|
|
|
if(actor < 0 || actor >= rc_actor.size())
|
|
return;
|
|
|
|
if(rc_actor[actor].node_type != RC_NODE_TYPE_PARTICLE)
|
|
return;
|
|
|
|
*min_x = rc_actor[actor].particle_properties.box.MinEdge.X;
|
|
*min_y = rc_actor[actor].particle_properties.box.MinEdge.Y;
|
|
*min_z = rc_actor[actor].particle_properties.box.MinEdge.Z;
|
|
|
|
*max_x = rc_actor[actor].particle_properties.box.MaxEdge.X;
|
|
*max_y = rc_actor[actor].particle_properties.box.MaxEdge.Y;
|
|
*max_z = rc_actor[actor].particle_properties.box.MaxEdge.Z;
|
|
}
|
|
|
|
void rc_setParticleNormal(int actor, double x, double y, double z)
|
|
{
|
|
if(actor < 0 || actor >= rc_actor.size())
|
|
return;
|
|
|
|
if(rc_actor[actor].node_type != RC_NODE_TYPE_PARTICLE)
|
|
return;
|
|
|
|
rc_actor[actor].particle_properties.normal.set(x, y, z);
|
|
|
|
irr::scene::IParticleSystemSceneNode* node = (irr::scene::IParticleSystemSceneNode*)rc_actor[actor].mesh_node;
|
|
|
|
if(!node->getEmitter())
|
|
return;
|
|
|
|
|
|
switch(rc_actor[actor].particle_properties.particle_type)
|
|
{
|
|
case RC_PARTICLE_TYPE_CYLINDER:
|
|
{
|
|
irr::scene::IParticleCylinderEmitter* em = (irr::scene::IParticleCylinderEmitter*)node->getEmitter();
|
|
em->setNormal(rc_actor[actor].particle_properties.normal);
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
void rc_getParticleNormal(int actor, double* x, double* y, double* z)
|
|
{
|
|
*x = 0;
|
|
*y = 0;
|
|
*z = 0;
|
|
|
|
if(actor < 0 || actor >= rc_actor.size())
|
|
return;
|
|
|
|
if(rc_actor[actor].node_type != RC_NODE_TYPE_PARTICLE)
|
|
return;
|
|
|
|
*x = rc_actor[actor].particle_properties.normal.X;
|
|
*y = rc_actor[actor].particle_properties.normal.Y;
|
|
*z = rc_actor[actor].particle_properties.normal.Z;
|
|
}
|
|
|
|
void rc_setParticleLength(int actor, double length)
|
|
{
|
|
if(actor < 0 || actor >= rc_actor.size())
|
|
return;
|
|
|
|
if(rc_actor[actor].node_type != RC_NODE_TYPE_PARTICLE)
|
|
return;
|
|
|
|
rc_actor[actor].particle_properties.length = length;
|
|
|
|
irr::scene::IParticleSystemSceneNode* node = (irr::scene::IParticleSystemSceneNode*)rc_actor[actor].mesh_node;
|
|
|
|
if(!node->getEmitter())
|
|
return;
|
|
|
|
|
|
switch(rc_actor[actor].particle_properties.particle_type)
|
|
{
|
|
case RC_PARTICLE_TYPE_CYLINDER:
|
|
{
|
|
irr::scene::IParticleCylinderEmitter* em = (irr::scene::IParticleCylinderEmitter*)node->getEmitter();
|
|
em->setLength(rc_actor[actor].particle_properties.length);
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
double rc_getParticleLength(int actor)
|
|
{
|
|
if(actor < 0 || actor >= rc_actor.size())
|
|
return 0;
|
|
|
|
if(rc_actor[actor].node_type != RC_NODE_TYPE_PARTICLE)
|
|
return 0;
|
|
|
|
return rc_actor[actor].particle_properties.length;
|
|
}
|
|
|
|
void rc_useParticleOutlineOnly(int actor, bool flag)
|
|
{
|
|
if(actor < 0 || actor >= rc_actor.size())
|
|
return;
|
|
|
|
if(rc_actor[actor].node_type != RC_NODE_TYPE_PARTICLE)
|
|
return;
|
|
|
|
rc_actor[actor].particle_properties.outlineOnly = flag;
|
|
|
|
irr::scene::IParticleSystemSceneNode* node = (irr::scene::IParticleSystemSceneNode*)rc_actor[actor].mesh_node;
|
|
|
|
if(!node->getEmitter())
|
|
return;
|
|
|
|
|
|
switch(rc_actor[actor].particle_properties.particle_type)
|
|
{
|
|
case RC_PARTICLE_TYPE_CYLINDER:
|
|
{
|
|
irr::scene::IParticleCylinderEmitter* em = (irr::scene::IParticleCylinderEmitter*)node->getEmitter();
|
|
em->setOutlineOnly(flag);
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
bool rc_particleIsUsingOutlineOnly(int actor)
|
|
{
|
|
if(actor < 0 || actor >= rc_actor.size())
|
|
return false;
|
|
|
|
if(rc_actor[actor].node_type != RC_NODE_TYPE_PARTICLE)
|
|
return false;
|
|
|
|
return rc_actor[actor].particle_properties.outlineOnly;
|
|
}
|
|
|
|
|
|
|
|
void rc_setCameraPosition(double x, double y, double z)
|
|
{
|
|
if(!(rc_active_canvas > 0 && rc_active_canvas < rc_canvas.size()))
|
|
return;
|
|
|
|
rc_canvas[rc_active_canvas].camera.setPosition(x, y, z);
|
|
}
|
|
|
|
void rc_getCameraPosition(double* x, double* y, double* z)
|
|
{
|
|
if(!(rc_active_canvas > 0 && rc_active_canvas < rc_canvas.size()))
|
|
return;
|
|
|
|
irr::f32 fx, fy, fz;
|
|
|
|
rc_canvas[rc_active_canvas].camera.getPosition(fx, fy, fz);
|
|
|
|
*x = fx;
|
|
*y = fy;
|
|
*z = fz;
|
|
}
|
|
|
|
void rc_translateCamera(double x, double y, double z)
|
|
{
|
|
if(!(rc_active_canvas > 0 && rc_active_canvas < rc_canvas.size()))
|
|
return;
|
|
|
|
rc_canvas[rc_active_canvas].camera.translate(x, y, z);
|
|
}
|
|
|
|
void rc_translateCameraW(double x, double y, double z)
|
|
{
|
|
if(!(rc_active_canvas > 0 && rc_active_canvas < rc_canvas.size()))
|
|
return;
|
|
|
|
rc_canvas[rc_active_canvas].camera.translateW(x, y, z);
|
|
}
|
|
|
|
|
|
void rc_setCameraRotation(double x, double y, double z)
|
|
{
|
|
if(!(rc_active_canvas > 0 && rc_active_canvas < rc_canvas.size()))
|
|
return;
|
|
|
|
rc_canvas[rc_active_canvas].camera.setRotation(x, y, z);
|
|
}
|
|
|
|
void rc_getCameraRotation(double* x, double* y, double* z)
|
|
{
|
|
if(rc_active_canvas <= 0 || rc_active_canvas >= rc_canvas.size())
|
|
return;
|
|
|
|
*x = rc_canvas[rc_active_canvas].camera.rx;
|
|
*y = rc_canvas[rc_active_canvas].camera.ry;
|
|
*z = rc_canvas[rc_active_canvas].camera.rz;
|
|
|
|
//std::cout << "Get Rotation: " << x[0] << ", " << y[0] << ", " << z[0] << std::endl;
|
|
}
|
|
|
|
void rc_rotateCamera(double x, double y, double z)
|
|
{
|
|
if(!(rc_active_canvas > 0 && rc_active_canvas < rc_canvas.size()))
|
|
return;
|
|
|
|
rc_canvas[rc_active_canvas].camera.rotate(x, y, z);
|
|
}
|
|
|
|
void rc_setCameraFOV(double fov)
|
|
{
|
|
if(!(rc_active_canvas > 0 && rc_active_canvas < rc_canvas.size()))
|
|
return;
|
|
|
|
rc_canvas[rc_active_canvas].camera.camera->setFOV(fov);
|
|
}
|
|
|
|
double rc_getCameraFOV()
|
|
{
|
|
if(!(rc_active_canvas > 0 && rc_active_canvas < rc_canvas.size()))
|
|
return 0;
|
|
|
|
return rc_canvas[rc_active_canvas].camera.camera->getFOV();
|
|
}
|
|
|
|
void rc_setCameraAspectRatio(double aspect)
|
|
{
|
|
if(!(rc_active_canvas > 0 && rc_active_canvas < rc_canvas.size()))
|
|
return;
|
|
|
|
rc_canvas[rc_active_canvas].camera.camera->setAspectRatio(aspect);
|
|
}
|
|
|
|
double rc_getCameraAspectRatio()
|
|
{
|
|
if(!(rc_active_canvas > 0 && rc_active_canvas < rc_canvas.size()))
|
|
return 0;
|
|
|
|
return rc_canvas[rc_active_canvas].camera.camera->getAspectRatio();
|
|
}
|
|
|
|
void rc_setCameraFarValue(double zf)
|
|
{
|
|
if(!(rc_active_canvas > 0 && rc_active_canvas < rc_canvas.size()))
|
|
return;
|
|
|
|
rc_canvas[rc_active_canvas].camera.camera->setFarValue(zf);
|
|
}
|
|
|
|
double rc_getCameraFarValue()
|
|
{
|
|
if(!(rc_active_canvas > 0 && rc_active_canvas < rc_canvas.size()))
|
|
return 0;
|
|
|
|
return rc_canvas[rc_active_canvas].camera.camera->getFarValue();
|
|
}
|
|
|
|
void rc_setCameraNearValue(double zn)
|
|
{
|
|
if(!(rc_active_canvas > 0 && rc_active_canvas < rc_canvas.size()))
|
|
return;
|
|
|
|
rc_canvas[rc_active_canvas].camera.camera->setNearValue(zn);
|
|
}
|
|
|
|
double rc_getCameraNearValue()
|
|
{
|
|
if(!(rc_active_canvas > 0 && rc_active_canvas < rc_canvas.size()))
|
|
return 0;
|
|
|
|
return rc_canvas[rc_active_canvas].camera.camera->getNearValue();
|
|
}
|
|
|
|
|
|
void rc_addSceneSkyBox(int img_top, int img_bottom, int img_left, int img_right, int img_front, int img_back)
|
|
{
|
|
if(!SceneManager)
|
|
return;
|
|
|
|
if(rc_scene_properties.sky)
|
|
return;
|
|
|
|
irr::video::ITexture* tp = rc_image[img_top].image;
|
|
irr::video::ITexture* bt = rc_image[img_bottom].image;
|
|
irr::video::ITexture* lf = rc_image[img_left].image;
|
|
irr::video::ITexture* rt = rc_image[img_right].image;
|
|
irr::video::ITexture* ft = rc_image[img_front].image;
|
|
irr::video::ITexture* bk = rc_image[img_back].image;
|
|
rc_scene_properties.sky = SceneManager->addSkyBoxSceneNode(tp, bt, lf, rt, ft, bk);
|
|
}
|
|
|
|
void rc_addSceneSkyDome(int img)
|
|
{
|
|
if(!SceneManager)
|
|
return;
|
|
|
|
if(rc_scene_properties.sky)
|
|
return;
|
|
|
|
irr::video::ITexture* texture = rc_image[img].image;
|
|
rc_scene_properties.sky = SceneManager->addSkyDomeSceneNode(texture);
|
|
}
|
|
|
|
void rc_addSceneSkyDomeEx(int img, Uint32 horiRes, Uint32 vertRes, double txPercentage, double spherePercentage, double radius)
|
|
{
|
|
if(!SceneManager)
|
|
return;
|
|
|
|
if(rc_scene_properties.sky)
|
|
return;
|
|
|
|
irr::video::ITexture* texture = rc_image[img].image;
|
|
rc_scene_properties.sky = SceneManager->addSkyDomeSceneNode(texture, horiRes, vertRes, txPercentage, spherePercentage, radius);
|
|
}
|
|
|
|
void rc_removeSceneSky()
|
|
{
|
|
if(rc_scene_properties.sky)
|
|
rc_scene_properties.sky->remove();
|
|
|
|
rc_scene_properties.sky = NULL;
|
|
}
|
|
|
|
|
|
|
|
#endif // RC_GFX3D_H_INCLUDED
|