world simulation, Part.Anchored
This commit is contained in:
parent
461866a1a4
commit
d76edb4425
|
|
@ -97,7 +97,7 @@ namespace RNR
|
||||||
pFont->setTrueTypeSize(16);
|
pFont->setTrueTypeSize(16);
|
||||||
pFont->load();
|
pFont->load();
|
||||||
|
|
||||||
ogreSceneManager->setShadowTechnique(Ogre::ShadowTechnique::SHADOWTYPE_STENCIL_MODULATIVE);
|
ogreSceneManager->setShadowTechnique(Ogre::ShadowTechnique::SHADOWTYPE_STENCIL_ADDITIVE);
|
||||||
ogreSceneManager->setShadowFarDistance(500.f);
|
ogreSceneManager->setShadowFarDistance(500.f);
|
||||||
|
|
||||||
ogreSceneLight = ogreSceneManager->createLight("SunLight");
|
ogreSceneLight = ogreSceneManager->createLight("SunLight");
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,7 @@ add_library(Engine STATIC
|
||||||
Header/Helpers/Strings.hpp
|
Header/Helpers/Strings.hpp
|
||||||
Header/Helpers/XML.hpp
|
Header/Helpers/XML.hpp
|
||||||
Header/Helpers/NormalId.hpp
|
Header/Helpers/NormalId.hpp
|
||||||
|
Header/Helpers/Bullet.hpp
|
||||||
Header/App/Script/ReflectionProperty.hpp
|
Header/App/Script/ReflectionProperty.hpp
|
||||||
Header/App/Script/Script.hpp
|
Header/App/Script/Script.hpp
|
||||||
Header/App/Script/ScriptContext.hpp
|
Header/App/Script/ScriptContext.hpp
|
||||||
|
|
@ -37,6 +38,7 @@ add_library(Engine STATIC
|
||||||
Source/Helpers/Strings.cpp
|
Source/Helpers/Strings.cpp
|
||||||
Source/Helpers/XML.cpp
|
Source/Helpers/XML.cpp
|
||||||
Source/Helpers/NormalId.cpp
|
Source/Helpers/NormalId.cpp
|
||||||
|
Source/Helpers/Bullet.cpp
|
||||||
Source/App/Script/ReflectionProperty.cpp
|
Source/App/Script/ReflectionProperty.cpp
|
||||||
Source/App/Script/Script.cpp
|
Source/App/Script/Script.cpp
|
||||||
Source/App/GUI/GuiBase3d.cpp
|
Source/App/GUI/GuiBase3d.cpp
|
||||||
|
|
|
||||||
|
|
@ -13,6 +13,7 @@ namespace RNR
|
||||||
int m_brickColor;
|
int m_brickColor;
|
||||||
float m_transparency;
|
float m_transparency;
|
||||||
float m_reflectance;
|
float m_reflectance;
|
||||||
|
bool m_anchored;
|
||||||
Ogre::Matrix4 m_matrix;
|
Ogre::Matrix4 m_matrix;
|
||||||
Ogre::Vector3 m_position;
|
Ogre::Vector3 m_position;
|
||||||
Ogre::Vector3 m_size;
|
Ogre::Vector3 m_size;
|
||||||
|
|
@ -34,6 +35,8 @@ namespace RNR
|
||||||
float getReflectance() { return m_reflectance; }
|
float getReflectance() { return m_reflectance; }
|
||||||
void setTransparency(float transparency) { m_transparency = transparency; }
|
void setTransparency(float transparency) { m_transparency = transparency; }
|
||||||
float getTransparency() { return m_transparency; }
|
float getTransparency() { return m_transparency; }
|
||||||
|
void setAnchored(bool anchored) { m_anchored = anchored; }
|
||||||
|
bool getAnchored() { return m_anchored; }
|
||||||
|
|
||||||
Ogre::Vector3 getOgreCenter() { return m_position + (m_size / 2.f); }
|
Ogre::Vector3 getOgreCenter() { return m_position + (m_size / 2.f); }
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -18,6 +18,7 @@
|
||||||
namespace RNR
|
namespace RNR
|
||||||
{
|
{
|
||||||
class IInputManager;
|
class IInputManager;
|
||||||
|
class PartInstance;
|
||||||
|
|
||||||
struct WorldUndeserialized
|
struct WorldUndeserialized
|
||||||
{
|
{
|
||||||
|
|
@ -68,5 +69,8 @@ namespace RNR
|
||||||
void setRunService(RunService* runService) { m_runService = runService; }
|
void setRunService(RunService* runService) { m_runService = runService; }
|
||||||
Ogre::Root* getOgreRoot() { return m_ogreRoot; }
|
Ogre::Root* getOgreRoot() { return m_ogreRoot; }
|
||||||
Ogre::SceneManager* getOgreSceneManager() { return m_ogreSceneManager; }
|
Ogre::SceneManager* getOgreSceneManager() { return m_ogreSceneManager; }
|
||||||
|
|
||||||
|
void registerPhysicsPart(PartInstance* partRegistered);
|
||||||
|
void deletePhysicsPart(PartInstance* partDelete);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
@ -0,0 +1,16 @@
|
||||||
|
#pragma once
|
||||||
|
#include "LinearMath/btVector3.h"
|
||||||
|
#include "btBulletDynamicsCommon.h"
|
||||||
|
#include <OGRE/Ogre.h>
|
||||||
|
|
||||||
|
namespace RNR
|
||||||
|
{
|
||||||
|
class Bullet
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
static btVector3 v3ToBullet(Ogre::Vector3 v);
|
||||||
|
static Ogre::Vector3 v3ToOgre(btVector3 v);
|
||||||
|
static btQuaternion qtToBullet(Ogre::Quaternion q);
|
||||||
|
static Ogre::Quaternion qtToOgre(btQuaternion q);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
@ -128,11 +128,12 @@ namespace RNR
|
||||||
snprintf(render_debugtext, 255, "using BATCH_STATIC_GEOMETRY\nGeom Regions: %i", workspace->m_geom->getRegions().size());
|
snprintf(render_debugtext, 255, "using BATCH_STATIC_GEOMETRY\nGeom Regions: %i", workspace->m_geom->getRegions().size());
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
snprintf(debugtext, 512, "Render\nLast DT = %f\n%s\n\nPhysics\n%i objects, %i constraints",
|
snprintf(debugtext, 512, "Render\nLast DT = %f\n%s\n\nPhysics\n%i objects, %i constraints\nRunService: running = %s, paused = %s",
|
||||||
m_world->getLastDelta(),
|
m_world->getLastDelta(),
|
||||||
render_debugtext,
|
render_debugtext,
|
||||||
m_world->getOgreSceneManager(),
|
dynamicsWorld->getNumCollisionObjects(), dynamicsWorld->getNumConstraints(),
|
||||||
dynamicsWorld->getNumCollisionObjects(), dynamicsWorld->getNumConstraints());
|
m_world->getRunService()->getRunning() ? "true" : "false",
|
||||||
|
m_world->getRunService()->getPaused() ? "true" : "false");
|
||||||
m_debugText->setCaption(debugtext);
|
m_debugText->setCaption(debugtext);
|
||||||
|
|
||||||
Players* players = (Players*)m_world->getDatamodel()->getService("Players");
|
Players* players = (Players*)m_world->getDatamodel()->getService("Players");
|
||||||
|
|
|
||||||
|
|
@ -33,7 +33,9 @@ namespace RNR
|
||||||
{
|
{
|
||||||
subentity->setMaterial(BrickColor::material(m_brickColor));
|
subentity->setMaterial(BrickColor::material(m_brickColor));
|
||||||
subentity->getMaterial()->setShininess(64);
|
subentity->getMaterial()->setShininess(64);
|
||||||
|
subentity->getMaterial()->setLightingEnabled(true);
|
||||||
}
|
}
|
||||||
|
entity->setCastShadows(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
void PartInstance::deserializeProperty(char* prop_name, pugi::xml_node node)
|
void PartInstance::deserializeProperty(char* prop_name, pugi::xml_node node)
|
||||||
|
|
@ -58,6 +60,10 @@ namespace RNR
|
||||||
{
|
{
|
||||||
setTransparency(node.text().as_float());
|
setTransparency(node.text().as_float());
|
||||||
}
|
}
|
||||||
|
else if(prop_name == std::string("Anchored"))
|
||||||
|
{
|
||||||
|
setAnchored(node.text().as_bool());
|
||||||
|
}
|
||||||
else
|
else
|
||||||
PVInstance::deserializeProperty(prop_name, node);
|
PVInstance::deserializeProperty(prop_name, node);
|
||||||
updateMatrix();
|
updateMatrix();
|
||||||
|
|
|
||||||
|
|
@ -57,6 +57,7 @@ namespace RNR
|
||||||
case BATCH_DONT:
|
case BATCH_DONT:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
world->registerPhysicsPart(part);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -75,6 +76,9 @@ namespace RNR
|
||||||
|
|
||||||
void Workspace::onDescendantRemoved(Instance* childRemoved)
|
void Workspace::onDescendantRemoved(Instance* childRemoved)
|
||||||
{
|
{
|
||||||
|
PartInstance* part = dynamic_cast<PartInstance*>(childRemoved);
|
||||||
|
if(part)
|
||||||
|
world->deletePhysicsPart(part);
|
||||||
m_geomDirty = true;
|
m_geomDirty = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -8,6 +8,7 @@
|
||||||
#include <Network/Player.hpp>
|
#include <Network/Player.hpp>
|
||||||
#include <stdexcept>
|
#include <stdexcept>
|
||||||
#include <pugixml.hpp>
|
#include <pugixml.hpp>
|
||||||
|
#include <Helpers/Bullet.hpp>
|
||||||
|
|
||||||
namespace RNR
|
namespace RNR
|
||||||
{
|
{
|
||||||
|
|
@ -20,7 +21,7 @@ namespace RNR
|
||||||
btBroadphaseInterface* overlappingPairCache = new btDbvtBroadphase();
|
btBroadphaseInterface* overlappingPairCache = new btDbvtBroadphase();
|
||||||
btSequentialImpulseConstraintSolver* solver = new btSequentialImpulseConstraintSolver;
|
btSequentialImpulseConstraintSolver* solver = new btSequentialImpulseConstraintSolver;
|
||||||
m_dynamicsWorld = new btDiscreteDynamicsWorld(dispatcher, overlappingPairCache, solver, collisionConfiguration);
|
m_dynamicsWorld = new btDiscreteDynamicsWorld(dispatcher, overlappingPairCache, solver, collisionConfiguration);
|
||||||
m_dynamicsWorld->setGravity(btVector3(0, -10, 0));
|
m_dynamicsWorld->setGravity(btVector3(0, -64, 0));
|
||||||
|
|
||||||
m_inputManager = 0;
|
m_inputManager = 0;
|
||||||
|
|
||||||
|
|
@ -118,7 +119,6 @@ namespace RNR
|
||||||
WorldUndeserialized s = m_undeserialized.top();
|
WorldUndeserialized s = m_undeserialized.top();
|
||||||
m_undeserialized.pop();
|
m_undeserialized.pop();
|
||||||
|
|
||||||
s.instance->setParent(s.parent);
|
|
||||||
|
|
||||||
pugi::xml_node props = s.node.child("Properties");
|
pugi::xml_node props = s.node.child("Properties");
|
||||||
for(pugi::xml_node prop : props.children())
|
for(pugi::xml_node prop : props.children())
|
||||||
|
|
@ -126,6 +126,8 @@ namespace RNR
|
||||||
s.instance->deserializeXmlProperty(prop);
|
s.instance->deserializeXmlProperty(prop);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
s.instance->setParent(s.parent);
|
||||||
|
|
||||||
if(s.instance->getClassName() == "Model")
|
if(s.instance->getClassName() == "Model")
|
||||||
{
|
{
|
||||||
ModelInstance* m = (ModelInstance*)s.instance;
|
ModelInstance* m = (ModelInstance*)s.instance;
|
||||||
|
|
@ -149,10 +151,34 @@ namespace RNR
|
||||||
|
|
||||||
double World::step(float timestep)
|
double World::step(float timestep)
|
||||||
{
|
{
|
||||||
if(m_runService && m_runService->getRunning())
|
if(m_runService && m_runService->getRunning() && !m_runService->getPaused())
|
||||||
{
|
{
|
||||||
m_runService->step(timestep);
|
m_runService->step(timestep);
|
||||||
m_dynamicsWorld->stepSimulation(timestep);
|
m_dynamicsWorld->stepSimulation(timestep, 4, 1.0/60.0);
|
||||||
|
|
||||||
|
for(int j = m_dynamicsWorld->getNumCollisionObjects() - 1; j >= 0; j--)
|
||||||
|
{
|
||||||
|
btCollisionObject* obj = m_dynamicsWorld->getCollisionObjectArray()[j];
|
||||||
|
if(!obj->isActive())
|
||||||
|
continue;
|
||||||
|
btRigidBody* body = btRigidBody::upcast(obj);
|
||||||
|
btTransform trans;
|
||||||
|
if(body && body->getMotionState())
|
||||||
|
{
|
||||||
|
body->getMotionState()->getWorldTransform(trans);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
trans = obj->getWorldTransform();
|
||||||
|
}
|
||||||
|
PartInstance* part = (PartInstance*)obj->getUserPointer();
|
||||||
|
part->getCFrame().setPosition(Bullet::v3ToOgre(trans.getOrigin()));
|
||||||
|
Ogre::Matrix3 partRot;
|
||||||
|
Ogre::Quaternion transOgre = Bullet::qtToOgre(trans.getRotation());
|
||||||
|
transOgre.ToRotationMatrix(partRot);
|
||||||
|
part->getCFrame().setRotation(partRot);
|
||||||
|
part->updateMatrix();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
m_lastDelta = timestep;
|
m_lastDelta = timestep;
|
||||||
return 0.0;
|
return 0.0;
|
||||||
|
|
@ -162,4 +188,34 @@ namespace RNR
|
||||||
{
|
{
|
||||||
m_workspace->buildGeom();
|
m_workspace->buildGeom();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void World::registerPhysicsPart(PartInstance* partRegistered)
|
||||||
|
{
|
||||||
|
btCollisionShape* partShape = new btBoxShape(Bullet::v3ToBullet(partRegistered->getSize() / 2.f));
|
||||||
|
partShape->setUserPointer(partRegistered);
|
||||||
|
|
||||||
|
btTransform partTransform;
|
||||||
|
partTransform.setIdentity();
|
||||||
|
partTransform.setOrigin(Bullet::v3ToBullet(partRegistered->getPosition()));
|
||||||
|
partTransform.setRotation(Bullet::qtToBullet(partRegistered->getRotation()));
|
||||||
|
|
||||||
|
btScalar mass = partRegistered->getSize().length();
|
||||||
|
if(partRegistered->getAnchored())
|
||||||
|
mass = 0;
|
||||||
|
|
||||||
|
btVector3 localInertia = btVector3(0,0,0);
|
||||||
|
if(mass)
|
||||||
|
partShape->calculateLocalInertia(mass, localInertia);
|
||||||
|
btDefaultMotionState* partMotionState = new btDefaultMotionState(partTransform);
|
||||||
|
btRigidBody::btRigidBodyConstructionInfo rbInfo(mass, partMotionState, partShape, localInertia);
|
||||||
|
btRigidBody* body = new btRigidBody(rbInfo);
|
||||||
|
body->setUserPointer(partRegistered);
|
||||||
|
|
||||||
|
m_dynamicsWorld->addRigidBody(body);
|
||||||
|
}
|
||||||
|
|
||||||
|
void World::deletePhysicsPart(PartInstance* partDelete)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -0,0 +1,24 @@
|
||||||
|
#include <Helpers/Bullet.hpp>
|
||||||
|
|
||||||
|
namespace RNR
|
||||||
|
{
|
||||||
|
btVector3 Bullet::v3ToBullet(Ogre::Vector3 v)
|
||||||
|
{
|
||||||
|
return btVector3(v.x, v.y, v.z);
|
||||||
|
}
|
||||||
|
|
||||||
|
Ogre::Vector3 Bullet::v3ToOgre(btVector3 v)
|
||||||
|
{
|
||||||
|
return Ogre::Vector3(v.getX(), v.getY(), v.getZ());
|
||||||
|
}
|
||||||
|
|
||||||
|
btQuaternion Bullet::qtToBullet(Ogre::Quaternion q)
|
||||||
|
{
|
||||||
|
return btQuaternion(q.x, q.y, q.z, q.w);
|
||||||
|
}
|
||||||
|
|
||||||
|
Ogre::Quaternion Bullet::qtToOgre(btQuaternion q)
|
||||||
|
{
|
||||||
|
return Ogre::Quaternion(q.getW(), q.getX(), q.getY(), q.getZ());
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue