Added tree, fixed imgui crash, changed how scenenode behaves

This commit is contained in:
Anselme 2018-05-10 15:21:00 +02:00
parent 8d5b5f7ac9
commit 6c70b27d50
26 changed files with 190 additions and 86 deletions

3
deploy/data/ColorMap.jpg Normal file
View File

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:0ef5565c529081f035c2a272b7e6f920e0b33ede3f0acf60c913f79cd7254c38
size 998404

View File

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:4320913d741a11f8494d8bfee32fe1ec6a3eadea767bd5b58bbaf1abc5ea4571
size 1122793

View File

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:c333ce51caaa31f73433958ed92ab1c929b0fa2e465d4cc1a7e0bd85ebd1a6a6
size 1183022

View File

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:b595bef300d4b2b26ce7332f4731fad75aadff62e3f116fbb480d376d693590b
size 120571

View File

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:ae822dec7735ae6ac1f01fb8c176031d9868cae784d966a5ff5b554acd454c02
size 1863853

3
deploy/data/Tree01.mtl Normal file
View File

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:d24deee892de3ef3b9b688efdf33b4cd5c3557fb0cb1aeb33607b62770972dcd
size 369

3
deploy/data/Tree01.obj Normal file
View File

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:03ee3df999e01bd004cebec7bb782fbdd9bcec6084e74a09d4e4fe0247282281
size 1947443

View File

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:c73b46baf07a0b889885c64c2d5a7d3027d8600e911067e2a715faf6cbd90fca
size 267996

View File

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:f3d70c05a2ac42bfdfc6ef5bcbb43d5af6c16dd98f7885e4f73a32c345d6bd96
size 2139284

View File

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:4abfea7a19bb381686dad653c2448464f2c59c2673173340c7ccee65de28e1af
size 811575

View File

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:a44ca584ebde2ff39ae82b62873dfead09af3125db6678b765ea5259e37d2adc
size 1166620

View File

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:e198f6856d4fbab967f4c9dded854c325432c7e5613f9d6f457aac1fb9ed9e7a
size 203100

View File

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:2ca55cc1407ff1e68932439531e2091e06040c6e159b9b894a5f24e411ce5741
size 6556000

View File

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:b022701249a4e1a1b80a0c685a05cdbcd11f80ebe4b99a3a789dbdddfa9e7a87
size 6833993

BIN
deploy/data/sandbox.obj (Stored with Git LFS)

Binary file not shown.

View File

@ -64,6 +64,7 @@ void Engine::createWindow(std::string title,
style, style,
sf::ContextSettings(24, 8, 0, 3, 3, sf::ContextSettings::Attribute::Core)); sf::ContextSettings(24, 8, 0, 3, 3, sf::ContextSettings::Attribute::Core));
m_window->setFramerateLimit(60); m_window->setFramerateLimit(60);
ImGui::CreateContext();
m_input = new Input(m_window); m_input = new Input(m_window);
m_renderer->initGL(w, h); m_renderer->initGL(w, h);
m_sparrowshell = new SparrowShell(m_window); m_sparrowshell = new SparrowShell(m_window);

View File

@ -3,7 +3,6 @@
#include "glm/vec2.hpp" #include "glm/vec2.hpp"
class MeshNode;
class BackGroundNode; class BackGroundNode;
class ButtonShape class ButtonShape

View File

@ -6,6 +6,7 @@
#include <SparrowRenderer/mesh.h> #include <SparrowRenderer/mesh.h>
#include <bullet/btBulletCollisionCommon.h> #include <bullet/btBulletCollisionCommon.h>
#include <bullet/btBulletDynamicsCommon.h> #include <bullet/btBulletDynamicsCommon.h>
#include "tools/utils.h"
Engine &SceneNode::getEngine() Engine &SceneNode::getEngine()
{ {
@ -273,3 +274,15 @@ void SceneNode::setRigidBody(btRigidBody* body)
if(m_rigidBody != nullptr) if(m_rigidBody != nullptr)
m_rigidBody->setUserPointer(this); m_rigidBody->setUserPointer(this);
} }
SceneNode* SceneNode::clone()
{
SceneNode* node = new SceneNode(m_script);
node->setMesh(getMesh());
node->setTransform(getTransform());
node->setLight(getLight());
node->setRigidBody(new btRigidBody(m_rigidBody->getInvMass(), node->getMotionState(), m_rigidBody->getCollisionShape()));
for(SceneNode* child : m_children)
node->addChild(child->clone());
return node;
}

View File

@ -157,6 +157,9 @@ public:
void setRigidBody(btRigidBody* body); void setRigidBody(btRigidBody* body);
btRigidBody* getRigidBody() { return m_rigidBody; } btRigidBody* getRigidBody() { return m_rigidBody; }
/// the scene node clones itself, with no parent
virtual SceneNode* clone();
// global engine methods // global engine methods
Engine& getEngine(); Engine& getEngine();
}; };

View File

@ -75,9 +75,6 @@ void ScriptNode::version(){
oss.str(""); oss.str("");
oss << " SparrowRenderer version: "<< SparrowRenderer_VERSION_MAJOR << "." << SparrowRenderer_VERSION_MINOR; oss << " SparrowRenderer version: "<< SparrowRenderer_VERSION_MAJOR << "." << SparrowRenderer_VERSION_MINOR;
this->getEngine().getShell()->out(oss.str()); this->getEngine().getShell()->out(oss.str());
oss.str("");
oss << " SparrowSerializer version: "<< SparrowSerializer_VERSION_MAJOR << "." << SparrowSerializer_VERSION_MINOR;
this->getEngine().getShell()->out(oss.str());
} }
void ScriptNode::clear(){ void ScriptNode::clear(){

View File

@ -32,7 +32,7 @@
#include "scene/gui/backgroundnode.h" #include "scene/gui/backgroundnode.h"
#include "potator.h" //#include "potator.h"
#include "SparrowSerializer/serializationmanager.h" #include "SparrowSerializer/serializationmanager.h"
#include "SparrowSerializer/serializable.h" #include "SparrowSerializer/serializable.h"
#include <fstream> #include <fstream>
@ -118,27 +118,38 @@ void generateTerrain(SceneTree *scene, btDiscreteDynamicsWorld *world)
void generateSponza(SceneTree *scene, btDiscreteDynamicsWorld *world) void generateSponza(SceneTree *scene, btDiscreteDynamicsWorld *world)
{ {
SceneNode* sponzaContainer = new SceneNode();
scene->getRootObject()->addChild(sponzaContainer);
Loader::setTexDirectory("data/sponza/"); Loader::setTexDirectory("data/sponza/");
std::vector<Mesh*> meshes = Loader::loadMesh("sponza.obj"); SceneNode* sponzaContainer = Loader::loadMesh("sponza.obj");
Loader::setTexDirectory("data/"); Loader::setTexDirectory("data/");
for(Mesh* m : meshes) if(sponzaContainer != nullptr && sponzaContainer->getChildren().size() > 0)
{ {
if(m->getName().find("fabric") != std::string::npos) const std::vector<SceneNode*> children = sponzaContainer->getChildren();
delete m; // moyen crade de se débarasser temporairement des rideaux for(SceneNode* node : children)
else
{ {
m->initGL(); if(node->getMesh()->getName().find("fabric") != std::string::npos)
SceneNode *node = new SceneNode(); {
node->setMesh(m); // moyen crade de se débarasser des rideaux
node->getGeometryNode()->modelMatrix = glm::scale(glm::mat4(), glm::vec3(0.01f)); sponzaContainer->removeChild(node);
node->setTransform(node->getGeometryNode()->modelMatrix); node->destroyWhenOrphan();
sponzaContainer->addChild(node); }
btRigidBody* body = utils::buildStaticCollider(node->getGeometryNode()); else
node->setRigidBody(body); {
world->addRigidBody(body); // scale sponza before generating the static collider
glm::mat4 scaleMatrix = glm::scale(glm::mat4(), glm::vec3(0.01f));
node->getGeometryNode()->modelMatrix = scaleMatrix;
node->setTransform(scaleMatrix);
btRigidBody* body = utils::buildStaticCollider(node->getGeometryNode());
node->setRigidBody(body);
world->addRigidBody(body);
}
} }
scene->getRootObject()->addChild(sponzaContainer);
}
else
{
fprintf(stderr, "failed to load sponza");
if(sponzaContainer)
delete sponzaContainer;
} }
} }
@ -206,8 +217,8 @@ public:
scene->setMainCamera(m_player->getCamera()); scene->setMainCamera(m_player->getCamera());
//potator //potator
Potator *potator = new Potator(m_player, DefaultKeysMap::MAIN_ACTION, DefaultKeysMap::SECONDARY_ACTION, DefaultKeysMap::TERTIARY_ACTION); //Potator *potator = new Potator(m_player, DefaultKeysMap::MAIN_ACTION, DefaultKeysMap::SECONDARY_ACTION, DefaultKeysMap::TERTIARY_ACTION);
scene->getRootObject()->addChild(potator); //scene->getRootObject()->addChild(potator);
//lighting //lighting
Texture* skyboxTexture = RESOURCE_GET(Texture, "radiance"); Texture* skyboxTexture = RESOURCE_GET(Texture, "radiance");
@ -249,21 +260,17 @@ public:
else if(m_config->scene == "sandbox") else if(m_config->scene == "sandbox")
{ {
sun->initShadowMap(4096); sun->initShadowMap(4096);
SceneNode* sandboxContainer = new SceneNode(); SceneNode* sandbox = Loader::loadMesh("sandbox.obj");
scene->getRootObject()->addChild(sandboxContainer); btRigidBody* body = utils::buildStaticCollider(sandbox->getGeometryNode());
std::vector<Mesh*> meshes = Loader::loadMesh("sandbox.obj"); sandbox->setRigidBody(body);
for(Mesh* m : meshes) scene->getPhysics()->addRigidBody(body);
{ scene->getRootObject()->addChild(sandbox);
m->initGL();
SceneNode *node = new SceneNode();
node->setMesh(m);
sandboxContainer->addChild(node);
btRigidBody* body = utils::buildStaticCollider(node->getGeometryNode());
node->setRigidBody(body);
scene->getPhysics()->addRigidBody(body);
}
m_player->setPosition(0.f, 1.4f, 0.f); m_player->setPosition(0.f, 1.4f, 0.f);
sun->setShadowView(glm::vec3(80)); sun->setShadowView(glm::vec3(80));
// adding tree
SceneNode* tree = Loader::loadMesh("Tree01.obj");
scene->getRootObject()->addChild(tree);
} }
scene->getRootObject()->addChild(sunLight); scene->getRootObject()->addChild(sunLight);

View File

@ -13,6 +13,48 @@
#include <imgui/imgui.h> #include <imgui/imgui.h>
#define PHYSICS_SHAPES_OFFSET 0.0025f #define PHYSICS_SHAPES_OFFSET 0.0025f
/*
class GibScript : public SceneNode::Script
{
GibScript(const std::string &modelPath, btCollisionShape* shape, float mass) :
m_shape(shape),
m_mass(mass)
{
// preload model
Loader::loadMesh(modelPath);
}
void begin(SceneNode* node)
{
glm::vec3 pos(0, 10, 0);
glm::vec3 dir(0, 1, 0);
if(m_player != nullptr)
{
dir = m_player->getDirection();
pos = m_player->getEyePosition() + dir*2.f;
}
float throwForce = 5.f;
for(Mesh * m : m_bottleMeshes)
{
SceneNode* meshNode = new SceneNode();
meshNode->setMesh(m);
node->addChild(meshNode);
}
createGib(node, m_bottleShape, m_bottleMass, pos, dir*throwForce, 30000);
}
void update(SceneNode* node)
{
}
private:
std::vector<Mesh*> m_meshes;
btCollisionShape* m_shape;
float m_mass;
int m_action;
};
Potator::Potator(PlayerCharacterNode * player, Potator::Potator(PlayerCharacterNode * player,
int shield_action, int shield_action,
@ -23,13 +65,7 @@ Potator::Potator(PlayerCharacterNode * player,
m_throwBottleAction(bottle_action), m_throwBottleAction(bottle_action),
m_throwObjectAction(object_action) m_throwObjectAction(object_action)
{ {
// creating shield
m_shieldMeshes = Loader::loadMesh("shield.obj");
for(Mesh* m : m_shieldMeshes)
m->initGL();
btCompoundShape* shieldShape = new btCompoundShape(); btCompoundShape* shieldShape = new btCompoundShape();
btTransform woodTransform = btTransform::getIdentity(); btTransform woodTransform = btTransform::getIdentity();
woodTransform.setRotation(btQuaternion(0, 3.1416f, 0)); woodTransform.setRotation(btQuaternion(0, 3.1416f, 0));
shieldShape->addChildShape(woodTransform, new btCylinderShapeZ(btVector3(0.57f + PHYSICS_SHAPES_OFFSET, 0.57f + PHYSICS_SHAPES_OFFSET, 0.03f + PHYSICS_SHAPES_OFFSET))); shieldShape->addChildShape(woodTransform, new btCylinderShapeZ(btVector3(0.57f + PHYSICS_SHAPES_OFFSET, 0.57f + PHYSICS_SHAPES_OFFSET, 0.03f + PHYSICS_SHAPES_OFFSET)));
@ -37,15 +73,9 @@ Potator::Potator(PlayerCharacterNode * player,
guardTransform.setOrigin(btVector3(0.f, 0.f, -0.035f)); guardTransform.setOrigin(btVector3(0.f, 0.f, -0.035f));
shieldShape->addChildShape(guardTransform, new btSphereShape(0.08 + PHYSICS_SHAPES_OFFSET)); shieldShape->addChildShape(guardTransform, new btSphereShape(0.08 + PHYSICS_SHAPES_OFFSET));
m_shieldShape = shieldShape; m_shieldScript = new GibScript("shield.obj", shieldShape, 0.5f);
m_shieldMass = 0.5f;
// creating bottle // creating bottle
m_bottleMeshes = Loader::loadMesh("bottle.obj");
for(Mesh* m : m_bottleMeshes)
m->initGL();
btCompoundShape* bottleShape = new btCompoundShape(); btCompoundShape* bottleShape = new btCompoundShape();
btTransform ballTransform = btTransform::getIdentity(); btTransform ballTransform = btTransform::getIdentity();
ballTransform.setOrigin(btVector3(0.f, 0.098f, 0.f)); ballTransform.setOrigin(btVector3(0.f, 0.098f, 0.f));
@ -56,15 +86,10 @@ Potator::Potator(PlayerCharacterNode * player,
btTransform neckTransform = btTransform::getIdentity(); btTransform neckTransform = btTransform::getIdentity();
neckTransform.setOrigin(btVector3(0.f, 0.26f, 0.f)); neckTransform.setOrigin(btVector3(0.f, 0.26f, 0.f));
bottleShape->addChildShape(neckTransform, new btCylinderShape(btVector3(0.03f + PHYSICS_SHAPES_OFFSET, 0.08f + PHYSICS_SHAPES_OFFSET, 0.03f + PHYSICS_SHAPES_OFFSET))); bottleShape->addChildShape(neckTransform, new btCylinderShape(btVector3(0.03f + PHYSICS_SHAPES_OFFSET, 0.08f + PHYSICS_SHAPES_OFFSET, 0.03f + PHYSICS_SHAPES_OFFSET)));
m_bottleShape = bottleShape;
m_bottleMass = 0.03f; m_bottleScript = new GibScript("bottle.obj", bottleShape, 0.5f);
// creating sword : // creating sword :
m_swordMeshes = Loader::loadMesh("sword.obj");
for(Mesh* m : m_swordMeshes)
m->initGL();
btCompoundShape* swordShape = new btCompoundShape(); btCompoundShape* swordShape = new btCompoundShape();
btVector3 guardBox = btVector3(0.03 + PHYSICS_SHAPES_OFFSET, 0.04 + PHYSICS_SHAPES_OFFSET, 0.25 + PHYSICS_SHAPES_OFFSET); btVector3 guardBox = btVector3(0.03 + PHYSICS_SHAPES_OFFSET, 0.04 + PHYSICS_SHAPES_OFFSET, 0.25 + PHYSICS_SHAPES_OFFSET);
@ -74,8 +99,7 @@ Potator::Potator(PlayerCharacterNode * player,
bladeTransform.setOrigin(btVector3(0.f, 0.486705f, 0.f)); bladeTransform.setOrigin(btVector3(0.f, 0.486705f, 0.f));
swordShape->addChildShape(bladeTransform, new btConeShape(0.07 + PHYSICS_SHAPES_OFFSET, 2.15 + PHYSICS_SHAPES_OFFSET)); swordShape->addChildShape(bladeTransform, new btConeShape(0.07 + PHYSICS_SHAPES_OFFSET, 2.15 + PHYSICS_SHAPES_OFFSET));
m_swordShape = swordShape; m_swordScript = new GibScript("sword.obj", swordShape, 0.03f);
m_swordMass = 0.5f;
} }
void Potator::throwShield() void Potator::throwShield()
@ -158,7 +182,7 @@ void Potator::update()
throwSword(); throwSword();
} }
} }
/*
ImGui::Begin("Potator"); ImGui::Begin("Potator");
if(ImGui::Button("Load pack")) if(ImGui::Button("Load pack"))
LoadingThread::get()->loadResourcePack("woodbox"); LoadingThread::get()->loadResourcePack("woodbox");
@ -172,5 +196,5 @@ void Potator::update()
m_scene->registerMeshType(m_cubeMesh->getFlags()); m_scene->registerMeshType(m_cubeMesh->getFlags());
} }
ImGui::End(); ImGui::End();
*/
} }
*/

View File

@ -6,25 +6,15 @@
class PlayerCharacterNode; class PlayerCharacterNode;
class Mesh; class Mesh;
class GibScript;
/*
class Potator : public GibGeneratorNode class Potator : public GibGeneratorNode
{ {
PlayerCharacterNode *m_player; PlayerCharacterNode *m_player;
int m_throwShieldAction;
int m_throwBottleAction;
int m_throwObjectAction;
std::vector<Mesh*> m_shieldMeshes; GibScript* m_shieldScript;
btCollisionShape* m_shieldShape; GibScript* m_bottleScript;
float m_shieldMass; GibScript* m_swordScript;
std::vector<Mesh*> m_bottleMeshes;
btCollisionShape* m_bottleShape;
float m_bottleMass;
std::vector<Mesh*> m_swordMeshes;
btCollisionShape* m_swordShape;
float m_swordMass;
void throwShield(); void throwShield();
void throwBottle(); void throwBottle();
@ -38,11 +28,7 @@ public:
void setPlayer(PlayerCharacterNode *player) { m_player = player; } void setPlayer(PlayerCharacterNode *player) { m_player = player; }
void setShieldThrowingAction(int action) { m_throwShieldAction = action; }
void setSphereThrowingAction(int action) { m_throwBottleAction = action; }
void setObjectThrowingAction(int action) { m_throwObjectAction = action; }
virtual void update(); virtual void update();
}; };*/
#endif // POTATOR_H #endif // POTATOR_H

View File

@ -10,6 +10,7 @@
#include "SparrowRenderer/texture.h" #include "SparrowRenderer/texture.h"
#include "utils.h" #include "utils.h"
#include "font.h" #include "font.h"
#include "scene/scenenode.h"
#include <iostream> #include <iostream>
@ -143,7 +144,11 @@ Font* Loader::loadFont(const std::string &description_file, const std::string &t
return font; return font;
} }
std::vector<Mesh*> Loader::loadMesh(const std::string &filename){ SceneNode* Loader::loadMesh(const std::string &filename){
MeshNode* node = RESOURCE_GET(MeshNode, filename);
if(node != nullptr)
return node->clone();
std::vector<Mesh*> meshes; std::vector<Mesh*> meshes;
std::vector<glm::vec3> pos; std::vector<glm::vec3> pos;
@ -165,7 +170,7 @@ std::vector<Mesh*> Loader::loadMesh(const std::string &filename){
if(!file.is_open()) if(!file.is_open())
{ {
fprintf(stderr, "can't load %s.\n", filename.c_str()); fprintf(stderr, "can't load %s.\n", filename.c_str());
return meshes; return nullptr;
} }
Mesh* currentMesh = new Mesh(); Mesh* currentMesh = new Mesh();
@ -175,7 +180,7 @@ std::vector<Mesh*> Loader::loadMesh(const std::string &filename){
std::getline(file, line); std::getline(file, line);
while(!file.eof()) while(!file.eof())
{ {
if(line.length() == 0) // line vide if(line.length() == 0) // empty line
{ {
std::getline(file, line); std::getline(file, line);
continue; continue;
@ -264,6 +269,8 @@ std::vector<Mesh*> Loader::loadMesh(const std::string &filename){
currentMat = new PBRMaterial(); currentMat = new PBRMaterial();
RESOURCE_ADD(currentMat, Material, material_name); RESOURCE_ADD(currentMat, Material, material_name);
} }
currentMesh = new Mesh();
meshes.push_back(currentMesh);
currentMesh->setMaterial(currentMat); currentMesh->setMaterial(currentMat);
currentMesh->setName(material_name); currentMesh->setName(material_name);
} }
@ -292,9 +299,27 @@ std::vector<Mesh*> Loader::loadMesh(const std::string &filename){
if(m->getFlags() & (1 << Mesh::MATERIAL_PBR_NORMAL_MAP)) if(m->getFlags() & (1 << Mesh::MATERIAL_PBR_NORMAL_MAP))
m->computeTangents(); m->computeTangents();
m->mergeVertices(); m->mergeVertices();
m->initGL();
} }
} }
return meshes;
node = new SceneNode();
RESOURCE_ADD(node, MeshNode, filename);
if(meshes.size() == 1)
{
node->setMesh(meshes.back());
}
else
{
for(Mesh* m : meshes)
{
SceneNode* childNode = new SceneNode();
childNode->setMesh(m);
node->addChild(childNode);
}
}
return node;
} }
void initMaterialTexture(PBRMaterial* mat, PBRMaterial::TextureSlots slot, const std::string & file, int bitsPerPixel = 24) void initMaterialTexture(PBRMaterial* mat, PBRMaterial::TextureSlots slot, const std::string & file, int bitsPerPixel = 24)

View File

@ -9,6 +9,9 @@
class Image; class Image;
class Mesh; class Mesh;
class Font; class Font;
class SceneNode;
typedef SceneNode MeshNode;
class Loader class Loader
{ {
@ -20,7 +23,7 @@ public:
static std::string* loadTextFile(const std::string &filename); static std::string* loadTextFile(const std::string &filename);
static std::unordered_map<std::string, std::string>* loadConfigFile(const std::string &filename); static std::unordered_map<std::string, std::string>* loadConfigFile(const std::string &filename);
static Image* loadImage(const std::string &filename, int depth = 24, bool reversed = true); static Image* loadImage(const std::string &filename, int depth = 24, bool reversed = true);
static std::vector<Mesh*> loadMesh(const std::string &filename); static SceneNode* loadMesh(const std::string &filename);
static Font* loadFont(const std::string &texture, const std::string &description); static Font* loadFont(const std::string &texture, const std::string &description);
static bool loadMTL(const std::string &filename); static bool loadMTL(const std::string &filename);

View File

@ -19,6 +19,10 @@ void initStandardScene();
//void scale2D(MeshNode*, glm::vec2); //void scale2D(MeshNode*, glm::vec2);
//void rotate2D(MeshNode* mnode, glm::vec2 center, float angle); //void rotate2D(MeshNode* mnode, glm::vec2 center, float angle);
//void setDepth2D(MeshNode* mnode, float depth); //void setDepth2D(MeshNode* mnode, float depth);
/**
* @warning collisions on static meshes does not work if the transform is modified after the rigidbody construction
*/
btRigidBody* buildStaticCollider(GeometryNode* node); btRigidBody* buildStaticCollider(GeometryNode* node);
} }