@@ -353,6 +353,23 @@ void GpuEasyMeshData::SetupVertexData(uint16_t vflags, EasyMesh* src_mesh) | |||||
COPY_VBO; | COPY_VBO; | ||||
} | } | ||||
else if (has_position && has_color && has_texcoord && has_texcoordExt && flagnb == 4) | |||||
{ | |||||
new_vdecl = new VertexDeclaration(VertexStream<vec3,vec4,vec4>(VertexUsage::Position, VertexUsage::Color, VertexUsage::TexCoord)); | |||||
Array<vec3, vec4, vec4> vertexlist; | |||||
for (int i = 0; i < src_mesh->m_vert.Count(); i++) | |||||
vertexlist.Push(src_mesh->m_vert[i].m_coord, src_mesh->m_vert[i].m_color, src_mesh->m_vert[i].m_texcoord); | |||||
vbo_data = &vertexlist[0]; | |||||
vbo_bytes = vertexlist.Bytes(); | |||||
m_vertexcount = vertexlist.Count(); | |||||
COPY_VBO; | |||||
} | |||||
else | |||||
ASSERT(!saveflags, "Vertex Declaration combination is not implemented for %s, feel free to do so.", | |||||
VertexUsage::GetNameList(vflags).C()); | |||||
m_vdatas.Push(vflags, new_vdecl, new_vbo); | m_vdatas.Push(vflags, new_vdecl, new_vbo); | ||||
} | } | ||||
@@ -98,7 +98,7 @@ | |||||
<Import Project="$(SolutionDir)\Lol.Core.Rules.props" /> | <Import Project="$(SolutionDir)\Lol.Core.Rules.props" /> | ||||
<ItemDefinitionGroup> | <ItemDefinitionGroup> | ||||
<ClCompile> | <ClCompile> | ||||
<PreprocessorDefinitions>_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions> | |||||
<PreprocessorDefinitions>_LIB;%(PreprocessorDefinitions);LOL_INPUT_V2</PreprocessorDefinitions> | |||||
</ClCompile> | </ClCompile> | ||||
</ItemDefinitionGroup> | </ItemDefinitionGroup> | ||||
<ItemGroup> | <ItemGroup> | ||||
@@ -20,28 +20,51 @@ using namespace lol; | |||||
#include "physics/lolphysics.h" | #include "physics/lolphysics.h" | ||||
#include "physics/easyphysics.h" | #include "physics/easyphysics.h" | ||||
#define CAT_MODE 0 | |||||
#define OBJ_SIZE 2.f | |||||
#include "physicobject.h" | #include "physicobject.h" | ||||
#include "btphystest.h" | #include "btphystest.h" | ||||
using namespace lol::phys; | using namespace lol::phys; | ||||
#define CUBE_HALF_EXTENTS .5f | #define CUBE_HALF_EXTENTS .5f | ||||
#define EXTRA_HEIGHT 1.f | #define EXTRA_HEIGHT 1.f | ||||
#define BASE_TIME 2.f | |||||
#define ZERO_TIME (BASE_TIME + rand(-BASE_TIME * .4f, BASE_TIME * .4f)) | |||||
#define ZERO_SPEED 3.5f | |||||
#define JUMP_HEIGHT 30.f | |||||
#define JUMP_STRAFE .5f | |||||
int gNumObjects = 64; | int gNumObjects = 64; | ||||
#if CAT_MODE | |||||
#define USE_WALL 1 | |||||
#define USE_BODIES 1 | |||||
#else | |||||
#define USE_WALL 1 | #define USE_WALL 1 | ||||
#define USE_PLATFORM 1 | #define USE_PLATFORM 1 | ||||
#define USE_ROPE 0 | #define USE_ROPE 0 | ||||
#define USE_BODIES 1 | #define USE_BODIES 1 | ||||
#define USE_ROTATION 0 | #define USE_ROTATION 0 | ||||
#define USE_CHARACTER 1 | |||||
#define USE_STAIRS 1 | |||||
#define USE_CHARACTER 0 | |||||
#define USE_STAIRS 0 | |||||
#endif | |||||
LOLFX_RESOURCE_DECLARE(front_camera_sprite); | |||||
BtPhysTest::BtPhysTest(bool editor) | BtPhysTest::BtPhysTest(bool editor) | ||||
{ | { | ||||
m_loop_value = .0f; | m_loop_value = .0f; | ||||
g_renderer->SetAlphaFunc(AlphaFunc::Greater, 0.0); | |||||
#if CAT_MODE | |||||
/* cat datas setup */ | |||||
m_cat_texture = Tiler::Register("data/CatsSheet.png", ivec2(0), ivec2(0,1)); | |||||
#endif //CAT_MODE | |||||
/* Register an input controller for the keyboard */ | /* Register an input controller for the keyboard */ | ||||
m_controller = new Controller(KEY_MAX, 0); | m_controller = new Controller(KEY_MAX, 0); | ||||
m_controller->GetKey(KEY_MOVE_FORWARD).Bind("Keyboard", "Up"); | m_controller->GetKey(KEY_MOVE_FORWARD).Bind("Keyboard", "Up"); | ||||
@@ -55,10 +78,17 @@ BtPhysTest::BtPhysTest(bool editor) | |||||
/* Create a camera that matches the settings of XNA BtPhysTest */ | /* Create a camera that matches the settings of XNA BtPhysTest */ | ||||
m_camera = new Camera(); | m_camera = new Camera(); | ||||
#if CAT_MODE | |||||
m_camera->SetView(vec3(70.f, 50.f, 0.f), | |||||
vec3(0.f, 0.f, 0.f), | |||||
vec3(0, 1, 0)); | |||||
m_camera->SetProjection(mat4::perspective(60.f, 1280.f, 960.f, .1f, 1000.f)); | |||||
#else | |||||
m_camera->SetView(vec3(50.f, 50.f, 0.f), | m_camera->SetView(vec3(50.f, 50.f, 0.f), | ||||
vec3(0.f, 0.f, 0.f), | vec3(0.f, 0.f, 0.f), | ||||
vec3(0, 1, 0)); | vec3(0, 1, 0)); | ||||
m_camera->SetProjection(mat4::perspective(45.f, 1280.f, 960.f, .1f, 1000.f)); | m_camera->SetProjection(mat4::perspective(45.f, 1280.f, 960.f, .1f, 1000.f)); | ||||
#endif | |||||
g_scene->PushCamera(m_camera); | g_scene->PushCamera(m_camera); | ||||
m_ready = false; | m_ready = false; | ||||
@@ -86,7 +116,7 @@ BtPhysTest::BtPhysTest(bool editor) | |||||
float offset = 29.5f; | float offset = 29.5f; | ||||
vec3 pos_offset = vec3(.0f, 30.f, .0f); | vec3 pos_offset = vec3(.0f, 30.f, .0f); | ||||
if (USE_STAIRS) | |||||
#if USE_STAIRS | |||||
{ | { | ||||
vec3 new_offset = vec3(1.0f, .125f, .0f); | vec3 new_offset = vec3(1.0f, .125f, .0f); | ||||
quat NewRotation = quat::fromeuler_xyz(0.f, 0.f, 0.f); | quat NewRotation = quat::fromeuler_xyz(0.f, 0.f, 0.f); | ||||
@@ -118,8 +148,9 @@ BtPhysTest::BtPhysTest(bool editor) | |||||
m_stairs_list << NewPhyobj; | m_stairs_list << NewPhyobj; | ||||
} | } | ||||
} | } | ||||
#endif //USE_STAIRS | |||||
if (USE_WALL) | |||||
#if USE_WALL | |||||
{ | { | ||||
for (int i=0; i < 6; i++) | for (int i=0; i < 6; i++) | ||||
{ | { | ||||
@@ -145,9 +176,10 @@ BtPhysTest::BtPhysTest(bool editor) | |||||
m_ground_list << NewPhyobj; | m_ground_list << NewPhyobj; | ||||
} | } | ||||
} | } | ||||
#endif //USE_WALL | |||||
PhysicsObject* BasePhyobj = NULL; | PhysicsObject* BasePhyobj = NULL; | ||||
if (USE_PLATFORM) | |||||
#if USE_PLATFORM | |||||
{ | { | ||||
quat NewRotation = quat::fromeuler_xyz(0.f, 0.f, 0.f); | quat NewRotation = quat::fromeuler_xyz(0.f, 0.f, 0.f); | ||||
vec3 NewPosition = pos_offset + vec3(5.0f, -25.0f, -15.0f); | vec3 NewPosition = pos_offset + vec3(5.0f, -25.0f, -15.0f); | ||||
@@ -188,8 +220,9 @@ BtPhysTest::BtPhysTest(bool editor) | |||||
//m_platform_list << NewPhyobj; | //m_platform_list << NewPhyobj; | ||||
//Ticker::Ref(NewPhyobj); | //Ticker::Ref(NewPhyobj); | ||||
} | } | ||||
#endif //USE_PLATFORM | |||||
if (USE_CHARACTER) | |||||
#if USE_CHARACTER | |||||
{ | { | ||||
quat NewRotation = quat::fromeuler_xyz(0.f, 0.f, 0.f); | quat NewRotation = quat::fromeuler_xyz(0.f, 0.f, 0.f); | ||||
vec3 NewPosition = pos_offset + vec3(-5.0f, -10.0f, 15.0f); | vec3 NewPosition = pos_offset + vec3(-5.0f, -10.0f, 15.0f); | ||||
@@ -201,26 +234,28 @@ BtPhysTest::BtPhysTest(bool editor) | |||||
//NewPhyobj->GetCharacter()->AttachTo(BasePhyobj->GetPhysic(), true, true); | //NewPhyobj->GetCharacter()->AttachTo(BasePhyobj->GetPhysic(), true, true); | ||||
} | } | ||||
#endif //USE_CHARACTER | |||||
if (USE_BODIES) | |||||
#if USE_BODIES | |||||
{ | { | ||||
for (int x=0; x < 6; x++) | for (int x=0; x < 6; x++) | ||||
{ | { | ||||
for (int y=0; y < 6; y++) | |||||
for (int y=0; y < 2; y++) | |||||
{ | { | ||||
for (int z=0; z < 5; z++) | for (int z=0; z < 5; z++) | ||||
{ | { | ||||
PhysicsObject* new_physobj = new PhysicsObject(m_simulation, 1000.f, | PhysicsObject* new_physobj = new PhysicsObject(m_simulation, 1000.f, | ||||
vec3(-20.f, 15.f, -20.f) + | vec3(-20.f, 15.f, -20.f) + | ||||
vec3(8.f * (float)x, 8.f * (float)y, 8.f * (float)z)); | vec3(8.f * (float)x, 8.f * (float)y, 8.f * (float)z)); | ||||
m_physobj_list << new_physobj; | |||||
m_physobj_list.Push(new_physobj, ZERO_TIME); | |||||
Ticker::Ref(new_physobj); | Ticker::Ref(new_physobj); | ||||
} | } | ||||
} | } | ||||
} | } | ||||
} | } | ||||
#endif //USE_BODIES | |||||
if (USE_ROPE) | |||||
#if USE_ROPE | |||||
{ | { | ||||
Array<PhysicsObject*> RopeElements; | Array<PhysicsObject*> RopeElements; | ||||
for (int i = 0; i < 14; i++) | for (int i = 0; i < 14; i++) | ||||
@@ -229,7 +264,7 @@ BtPhysTest::BtPhysTest(bool editor) | |||||
vec3(0.f, 15.f, -20.f) + | vec3(0.f, 15.f, -20.f) + | ||||
vec3(0.f, 0.f, 2.f * (float)i), 1); | vec3(0.f, 0.f, 2.f * (float)i), 1); | ||||
RopeElements << new_physobj; | RopeElements << new_physobj; | ||||
m_physobj_list << new_physobj; | |||||
m_physobj_list.Push(new_physobj, ZERO_TIME); | |||||
Ticker::Ref(new_physobj); | Ticker::Ref(new_physobj); | ||||
if (RopeElements.Count() > 1) | if (RopeElements.Count() > 1) | ||||
{ | { | ||||
@@ -246,6 +281,7 @@ BtPhysTest::BtPhysTest(bool editor) | |||||
} | } | ||||
} | } | ||||
} | } | ||||
#endif //USE_ROPE | |||||
} | } | ||||
void BtPhysTest::TickGame(float seconds) | void BtPhysTest::TickGame(float seconds) | ||||
@@ -262,8 +298,66 @@ void BtPhysTest::TickGame(float seconds) | |||||
vec3 GroundBarycenter = vec3(.0f); | vec3 GroundBarycenter = vec3(.0f); | ||||
vec3 PhysObjBarycenter = vec3(.0f); | vec3 PhysObjBarycenter = vec3(.0f); | ||||
float factor = .0f; | float factor = .0f; | ||||
#if CAT_MODE | |||||
#if USE_BODIES | |||||
vec3 cam_center(0.f); | |||||
float cam_factor = .0f; | |||||
vec2 screen_min_max[2] = { vec2(FLT_MAX), vec2(-FLT_MAX) }; | |||||
vec3 cam_min_max[2] = { vec3(FLT_MAX), vec3(-FLT_MAX) }; | |||||
mat4 world_cam = g_scene->GetCamera()->GetView(); | |||||
mat4 cam_screen = g_scene->GetCamera()->GetProjection(); | |||||
for (int i = 0; i < m_physobj_list.Count(); i++) | |||||
{ | |||||
PhysicsObject* PhysObj = m_physobj_list[i].m1; | |||||
float &Timer = m_physobj_list[i].m2; | |||||
vec3 obj_loc = PhysObj->GetPhysic()->GetTransform().v3.xyz; | |||||
cam_center += obj_loc; | |||||
cam_factor += 1.f; | |||||
mat4 LocalPos = mat4::translate(obj_loc); | |||||
vec3 vpos; | |||||
LocalPos = world_cam * LocalPos; | |||||
vpos = LocalPos.v3.xyz; | |||||
cam_min_max[0] = min(vpos.xyz, cam_min_max[0]); | |||||
cam_min_max[1] = max(vpos.xyz, cam_min_max[1]); | |||||
LocalPos = cam_screen * LocalPos; | |||||
vpos = (LocalPos.v3 / LocalPos.v3.w).xyz; | |||||
screen_min_max[0] = min(vpos.xy, screen_min_max[0]); | |||||
screen_min_max[1] = max(vpos.xy, screen_min_max[1]); | |||||
//if (length(PhysObj->GetPhysic()->GetLinearVelocity()) < ZERO_SPEED) | |||||
if (lol::abs(PhysObj->GetPhysic()->GetLinearVelocity().y) < ZERO_SPEED) | |||||
Timer -= seconds; | |||||
if (Timer < .0f) | |||||
{ | |||||
PhysObj->GetPhysic()->AddImpulse(JUMP_HEIGHT * | |||||
vec3(JUMP_STRAFE, 1.f, JUMP_STRAFE) * | |||||
vec3(rand(-1.f, 1.f), 1.0f, rand(-1.f, 1.f)) * | |||||
PhysObj->GetPhysic()->GetMass()); | |||||
Timer = ZERO_TIME; | |||||
} | |||||
} | |||||
if (USE_WALL) | |||||
vec3 min_max_diff = (cam_min_max[1] - cam_min_max[0]); | |||||
float screen_size = max(max(lol::abs(min_max_diff.x), lol::abs(min_max_diff.y)), | |||||
max( lol::abs(min_max_diff.x), lol::abs(min_max_diff.y))); | |||||
float fov_ratio = max(max(lol::abs(screen_min_max[0].x), lol::abs(screen_min_max[0].y)), | |||||
max(lol::abs(screen_min_max[1].x), lol::abs(screen_min_max[1].y))); | |||||
//m_camera->SetProjection(mat4::perspective(30.f * fov_ratio * 1.1f, 1280.f, 960.f, .1f, 1000.f)); | |||||
m_camera->SetView((mat4::rotate(10.f * seconds, vec3(.0f, 1.f, .0f)) * vec4(m_camera->GetPosition(), 1.0f)).xyz, | |||||
//vec3(70.f, 30.f, 0.f), | |||||
cam_center / cam_factor, vec3(0, 1, 0)); | |||||
#endif //USE_BODIES | |||||
#endif //CAT_MODE | |||||
#if USE_WALL | |||||
{ | { | ||||
for (int i = 0; i < m_ground_list.Count(); i++) | for (int i = 0; i < m_ground_list.Count(); i++) | ||||
{ | { | ||||
@@ -291,8 +385,9 @@ void BtPhysTest::TickGame(float seconds) | |||||
PhysObj->SetRender(true); | PhysObj->SetRender(true); | ||||
} | } | ||||
} | } | ||||
#endif //USE_WALL | |||||
if (USE_ROTATION) | |||||
#if USE_ROTATION | |||||
{ | { | ||||
for (int i = 0; i < m_ground_list.Count(); i++) | for (int i = 0; i < m_ground_list.Count(); i++) | ||||
{ | { | ||||
@@ -307,8 +402,9 @@ void BtPhysTest::TickGame(float seconds) | |||||
PhysObj->SetTransform(GroundMat.v3.xyz, quat(GroundMat)); | PhysObj->SetTransform(GroundMat.v3.xyz, quat(GroundMat)); | ||||
} | } | ||||
} | } | ||||
#endif //USE_ROTATION | |||||
if (USE_PLATFORM) | |||||
#if USE_PLATFORM | |||||
{ | { | ||||
for (int i = 0; i < m_platform_list.Count(); i++) | for (int i = 0; i < m_platform_list.Count(); i++) | ||||
{ | { | ||||
@@ -329,8 +425,9 @@ void BtPhysTest::TickGame(float seconds) | |||||
} | } | ||||
} | } | ||||
} | } | ||||
#endif //USE_PLATFORM | |||||
if (USE_CHARACTER) | |||||
#if USE_CHARACTER | |||||
{ | { | ||||
for (int i = 0; i < m_character_list.Count(); i++) | for (int i = 0; i < m_character_list.Count(); i++) | ||||
{ | { | ||||
@@ -358,8 +455,9 @@ void BtPhysTest::TickGame(float seconds) | |||||
Character->AttachTo(NULL); | Character->AttachTo(NULL); | ||||
} | } | ||||
} | } | ||||
#endif //USE_CHARACTER | |||||
if (USE_CHARACTER) | |||||
#if USE_CHARACTER | |||||
{ | { | ||||
PhysObjBarycenter = vec3(.0f); | PhysObjBarycenter = vec3(.0f); | ||||
factor = .0f; | factor = .0f; | ||||
@@ -381,12 +479,12 @@ void BtPhysTest::TickGame(float seconds) | |||||
m_camera->SetPosition(CamPosCenter + normalize(m_camera->GetPosition() - CamPosCenter) * 20.0f); | m_camera->SetPosition(CamPosCenter + normalize(m_camera->GetPosition() - CamPosCenter) * 20.0f); | ||||
#endif | #endif | ||||
} | } | ||||
else | |||||
#else | |||||
{ | { | ||||
PhysObjBarycenter = vec3(.0f); | PhysObjBarycenter = vec3(.0f); | ||||
for (int i = 0; i < m_physobj_list.Count(); i++) | for (int i = 0; i < m_physobj_list.Count(); i++) | ||||
{ | { | ||||
PhysicsObject* PhysObj = m_physobj_list[i]; | |||||
PhysicsObject* PhysObj = m_physobj_list[i].m1; | |||||
mat4 GroundMat = PhysObj->GetTransform(); | mat4 GroundMat = PhysObj->GetTransform(); | ||||
PhysObjBarycenter += GroundMat.v3.xyz; | PhysObjBarycenter += GroundMat.v3.xyz; | ||||
@@ -400,7 +498,7 @@ void BtPhysTest::TickGame(float seconds) | |||||
m_camera->SetPosition(GroundBarycenter + normalize(GroundBarycenter - PhysObjBarycenter) * 60.0f); | m_camera->SetPosition(GroundBarycenter + normalize(GroundBarycenter - PhysObjBarycenter) * 60.0f); | ||||
#endif | #endif | ||||
} | } | ||||
#endif //USE_CHARACTER | |||||
} | } | ||||
void BtPhysTest::TickDraw(float seconds) | void BtPhysTest::TickDraw(float seconds) | ||||
@@ -409,6 +507,26 @@ void BtPhysTest::TickDraw(float seconds) | |||||
if (!m_ready) | if (!m_ready) | ||||
{ | { | ||||
#if CAT_MODE | |||||
/* cat datas setup */ | |||||
m_cat_shader = Shader::Create(LOLFX_RESOURCE_NAME(front_camera_sprite)); | |||||
#if USE_BODIES | |||||
for (int i = 0; i < m_physobj_list.Count(); i++) | |||||
{ | |||||
PhysicsObject* PhysObj = m_physobj_list[i].m1; | |||||
m_cat_sdata = new CatShaderData(((1 << VertexUsage::Position) | | |||||
(1 << VertexUsage::Color) | | |||||
(1 << VertexUsage::TexCoord) | | |||||
(1 << VertexUsage::TexCoordExt)), | |||||
m_cat_shader); | |||||
m_cat_sdata->m_shader_texture = m_cat_texture->GetTexture(); | |||||
PhysObj->SetCustomShaderData(m_cat_sdata); | |||||
} | |||||
#endif //USE_BODIES | |||||
#endif //CAT_MODE | |||||
/* FIXME: this object never cleans up */ | /* FIXME: this object never cleans up */ | ||||
m_ready = true; | m_ready = true; | ||||
} | } | ||||
@@ -423,6 +541,13 @@ BtPhysTest::~BtPhysTest() | |||||
Ticker::Unref(m_light1); | Ticker::Unref(m_light1); | ||||
Ticker::Unref(m_light2); | Ticker::Unref(m_light2); | ||||
#if CAT_MODE | |||||
/* cat datas setup */ | |||||
delete(m_cat_sdata); | |||||
Shader::Destroy(m_cat_shader); | |||||
Tiler::Deregister(m_cat_texture); | |||||
#endif //CAT_MODE | |||||
while (m_constraint_list.Count()) | while (m_constraint_list.Count()) | ||||
{ | { | ||||
EasyConstraint* CurPop = m_constraint_list.Last(); | EasyConstraint* CurPop = m_constraint_list.Last(); | ||||
@@ -460,7 +585,7 @@ BtPhysTest::~BtPhysTest() | |||||
} | } | ||||
while (m_physobj_list.Count()) | while (m_physobj_list.Count()) | ||||
{ | { | ||||
PhysicsObject* CurPop = m_physobj_list.Last(); | |||||
PhysicsObject* CurPop = m_physobj_list.Last().m1; | |||||
m_physobj_list.Pop(); | m_physobj_list.Pop(); | ||||
CurPop->GetPhysic()->RemoveFromSimulation(m_simulation); | CurPop->GetPhysic()->RemoveFromSimulation(m_simulation); | ||||
Ticker::Unref(CurPop); | Ticker::Unref(CurPop); | ||||
@@ -469,11 +594,43 @@ BtPhysTest::~BtPhysTest() | |||||
} | } | ||||
//----------------------------------------------------------------------------- | |||||
// CShaderData | |||||
//----------------------------------------------------------------------------- | |||||
CatShaderData::CatShaderData(uint32_t vert_decl_flags, Shader* shader) | |||||
: GpuShaderData(vert_decl_flags, shader, DebugRenderMode::Default) | |||||
{ | |||||
SetupDefaultData(); | |||||
} | |||||
//----------------------------------------------------------------------------- | |||||
void CatShaderData::SetupDefaultData() | |||||
{ | |||||
AddUniform("in_model_view"); | |||||
AddUniform("in_normal_mat"); | |||||
AddUniform("in_proj"); | |||||
AddUniform("in_texture"); | |||||
} | |||||
//----------------------------------------------------------------------------- | |||||
void CatShaderData::SetupShaderDatas(mat4 const &model) | |||||
{ | |||||
mat4 proj = g_scene->GetCamera()->GetProjection(); | |||||
mat4 view = g_scene->GetCamera()->GetView(); | |||||
mat4 modelview = view * model; | |||||
mat3 normalmat = transpose(inverse(mat3(view))); | |||||
m_shader->SetUniform(*GetUniform("in_model_view"), modelview); | |||||
m_shader->SetUniform(*GetUniform("in_normal_mat"), normalmat); | |||||
m_shader->SetUniform(*GetUniform("in_proj"), proj); | |||||
} | |||||
int main(int argc, char **argv) | int main(int argc, char **argv) | ||||
{ | { | ||||
System::Init(argc, argv); | System::Init(argc, argv); | ||||
Application app("BtPhysTest", ivec2(1280, 720), 60.0f); | |||||
Application app("BtPhysTest", ivec2(1280, 960), 60.0f); | |||||
new BtPhysTest(argc > 1); | new BtPhysTest(argc > 1); | ||||
app.ShowPointer(false); | app.ShowPointer(false); | ||||
@@ -8,6 +8,25 @@ | |||||
#if !defined __BTPHYSTEST_H__ | #if !defined __BTPHYSTEST_H__ | ||||
#define __BTPHYSTEST_H__ | #define __BTPHYSTEST_H__ | ||||
class CatShaderData : public GpuShaderData | |||||
{ | |||||
friend class CRenderer; | |||||
public: | |||||
//--- | |||||
CatShaderData(uint32_t vert_decl_flags, Shader* shader); | |||||
//--- | |||||
void SetupDefaultData(); | |||||
virtual void SetupShaderDatas(mat4 const &model); | |||||
//-- | |||||
virtual lol::String GetInVertexName() { return lol::String("in_vertex"); } | |||||
virtual lol::String GetInNormalName() { return lol::String("in_normal"); } | |||||
virtual lol::String GetInColorName() { return lol::String("in_color"); } | |||||
virtual lol::String GetInTexCoordName() { return lol::String("in_texcoord"); } | |||||
ShaderTexture m_shader_texture; | |||||
}; | |||||
class BtPhysTest : public WorldEntity | class BtPhysTest : public WorldEntity | ||||
{ | { | ||||
public: | public: | ||||
@@ -34,21 +53,24 @@ private: | |||||
KEY_MAX, | KEY_MAX, | ||||
}; | }; | ||||
Camera* m_camera; | |||||
Controller * m_controller; | |||||
Light * m_light1; | |||||
Light * m_light2; | |||||
bool m_ready; | |||||
lol::phys::Simulation* m_simulation; | |||||
Array<EasyConstraint*> m_constraint_list; | |||||
Array<PhysicsObject*> m_physobj_list; | |||||
Array<PhysicsObject*> m_ground_list; | |||||
Array<PhysicsObject*> m_platform_list; | |||||
Array<PhysicsObject*> m_character_list; | |||||
Array<PhysicsObject*> m_stairs_list; | |||||
float m_loop_value; | |||||
TileSet* m_cat_texture; | |||||
Shader* m_cat_shader; | |||||
CatShaderData* m_cat_sdata; | |||||
Camera* m_camera; | |||||
Controller * m_controller; | |||||
Light * m_light1; | |||||
Light * m_light2; | |||||
bool m_ready; | |||||
lol::phys::Simulation* m_simulation; | |||||
Array<EasyConstraint*> m_constraint_list; | |||||
Array<PhysicsObject*, float> m_physobj_list; | |||||
Array<PhysicsObject*> m_ground_list; | |||||
Array<PhysicsObject*> m_platform_list; | |||||
Array<PhysicsObject*> m_character_list; | |||||
Array<PhysicsObject*> m_stairs_list; | |||||
float m_loop_value; | |||||
}; | }; | ||||
#endif // __BTPHYSTEST_H__ | #endif // __BTPHYSTEST_H__ | ||||
@@ -75,6 +75,9 @@ | |||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild> | <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild> | ||||
</None> | </None> | ||||
</ItemGroup> | </ItemGroup> | ||||
<ItemGroup> | |||||
<LolFxCompile Include="front_camera_sprite.lolfx" /> | |||||
</ItemGroup> | |||||
<PropertyGroup Label="Globals"> | <PropertyGroup Label="Globals"> | ||||
<ProjectGuid>{ee203b88-44cf-4859-9d42-7a1f43fecb52}</ProjectGuid> | <ProjectGuid>{ee203b88-44cf-4859-9d42-7a1f43fecb52}</ProjectGuid> | ||||
<ConfigurationType>Application</ConfigurationType> | <ConfigurationType>Application</ConfigurationType> | ||||
@@ -95,4 +98,4 @@ | |||||
<ImportGroup Label="ExtensionTargets"> | <ImportGroup Label="ExtensionTargets"> | ||||
<Import Project="$(SolutionDir)\Lol.Fx.targets" /> | <Import Project="$(SolutionDir)\Lol.Fx.targets" /> | ||||
</ImportGroup> | </ImportGroup> | ||||
</Project> | |||||
</Project> |
@@ -48,4 +48,7 @@ | |||||
<ItemGroup> | <ItemGroup> | ||||
<None Include="Makefile.am" /> | <None Include="Makefile.am" /> | ||||
</ItemGroup> | </ItemGroup> | ||||
</Project> | |||||
<ItemGroup> | |||||
<LolFxCompile Include="front_camera_sprite.lolfx" /> | |||||
</ItemGroup> | |||||
</Project> |
@@ -20,12 +20,25 @@ | |||||
using namespace lol; | using namespace lol; | ||||
using namespace lol::phys; | using namespace lol::phys; | ||||
#if CAT_MODE | |||||
#define USE_SPHERE 1 | |||||
#else | |||||
#define USE_BOX 1 | |||||
#define USE_SPHERE 1 | |||||
#define USE_CONE 1 | |||||
#define USE_CYLINDER 1 | |||||
#define USE_CAPSULE 1 | |||||
#endif | |||||
class PhysicsObject : public WorldEntity | class PhysicsObject : public WorldEntity | ||||
{ | { | ||||
public: | public: | ||||
PhysicsObject(Simulation* new_sim, const vec3 &base_location, const quat &base_rotation) | PhysicsObject(Simulation* new_sim, const vec3 &base_location, const quat &base_rotation) | ||||
: m_ready(false), m_should_render(true), m_is_character(false) | |||||
: m_ready(false), m_should_render(true), m_is_character(false), m_custom_shader(0) | |||||
{ | { | ||||
#if CAT_MODE | |||||
m_is_phys = false; | |||||
#endif //CAT_MODE | |||||
m_physics = new EasyPhysic(this); | m_physics = new EasyPhysic(this); | ||||
m_mesh.Compile("[sc#ddd afcb 60 1 60 -.1]"); | m_mesh.Compile("[sc#ddd afcb 60 1 60 -.1]"); | ||||
@@ -39,8 +52,11 @@ public: | |||||
} | } | ||||
PhysicsObject(Simulation* new_sim, const vec3 &base_location, const quat &base_rotation, int dummy) | PhysicsObject(Simulation* new_sim, const vec3 &base_location, const quat &base_rotation, int dummy) | ||||
: m_ready(false), m_should_render(true), m_is_character(false) | |||||
: m_ready(false), m_should_render(true), m_is_character(false), m_custom_shader(0) | |||||
{ | { | ||||
#if CAT_MODE | |||||
m_is_phys = false; | |||||
#endif //CAT_MODE | |||||
if (dummy == 1) //for platform purpose | if (dummy == 1) //for platform purpose | ||||
{ | { | ||||
m_physics = new EasyPhysic(this); | m_physics = new EasyPhysic(this); | ||||
@@ -106,10 +122,19 @@ public: | |||||
} | } | ||||
PhysicsObject(Simulation* new_sim, float base_mass, const vec3 &base_location, int RandValue = -1) | PhysicsObject(Simulation* new_sim, float base_mass, const vec3 &base_location, int RandValue = -1) | ||||
: m_ready(false), m_should_render(true), m_is_character(false) | |||||
: m_ready(false), m_should_render(true), m_is_character(false), m_custom_shader(0) | |||||
{ | { | ||||
Array<char const *> MeshRand; | Array<char const *> MeshRand; | ||||
Array<int> MeshLimit; | |||||
Array<int> MeshType; | |||||
#if CAT_MODE | |||||
m_is_phys = true; | |||||
#endif //CAT_MODE | |||||
MeshLimit << 0; | |||||
#if USE_BOX | |||||
MeshRand << "[sc#add afcb1.7 1.7 1.7 0.4][sc#000 tsw afcb1.9 1.9 1.9 0.4 sx-1 sy-1 sz-1]"; | MeshRand << "[sc#add afcb1.7 1.7 1.7 0.4][sc#000 tsw afcb1.9 1.9 1.9 0.4 sx-1 sy-1 sz-1]"; | ||||
MeshRand << "[sc#dad afcb1.7 1.7 1.7 0.4][sc#000 tsw afcb1.9 1.9 1.9 0.4 sx-1 sy-1 sz-1]"; | MeshRand << "[sc#dad afcb1.7 1.7 1.7 0.4][sc#000 tsw afcb1.9 1.9 1.9 0.4 sx-1 sy-1 sz-1]"; | ||||
MeshRand << "[sc#dda afcb1.7 1.7 1.7 0.4][sc#000 tsw afcb1.9 1.9 1.9 0.4 sx-1 sy-1 sz-1]"; | MeshRand << "[sc#dda afcb1.7 1.7 1.7 0.4][sc#000 tsw afcb1.9 1.9 1.9 0.4 sx-1 sy-1 sz-1]"; | ||||
@@ -117,17 +142,41 @@ public: | |||||
MeshRand << "[sc#ada afcb1.7 1.7 1.7 0.4][sc#000 tsw afcb1.9 1.9 1.9 0.4 sx-1 sy-1 sz-1]"; | MeshRand << "[sc#ada afcb1.7 1.7 1.7 0.4][sc#000 tsw afcb1.9 1.9 1.9 0.4 sx-1 sy-1 sz-1]"; | ||||
MeshRand << "[sc#aad afcb1.7 1.7 1.7 0.4][sc#000 tsw afcb1.9 1.9 1.9 0.4 sx-1 sy-1 sz-1]"; | MeshRand << "[sc#aad afcb1.7 1.7 1.7 0.4][sc#000 tsw afcb1.9 1.9 1.9 0.4 sx-1 sy-1 sz-1]"; | ||||
int SphereLimit = MeshRand.Count(); | |||||
MeshLimit << MeshRand.Count(); | |||||
MeshType << 0; | |||||
#endif //USE_BOX | |||||
#if USE_SPHERE | |||||
#if CAT_MODE | |||||
int nb_sprite = 4; | |||||
//SPRITE | |||||
vec2 start_point = vec2((float)rand(nb_sprite), (float)rand(nb_sprite)) / vec2((float)nb_sprite); | |||||
vec2 size = vec2(1.f) / vec2((float)nb_sprite); | |||||
m_mesh.BD()->SetTexCoordCustomBuild(MeshType::Quad, MeshFaceType::QuadDefault, | |||||
start_point, start_point + size); | |||||
m_mesh.BD()->SetTexCoordCustomBuild2(MeshType::Quad, MeshFaceType::QuadDefault, | |||||
vec2(-4.f), vec2(4.f)); | |||||
MeshRand << "[sc#ffff aq 0 0]"; | |||||
MeshRand << "[sc#ffff aq 0 0]"; | |||||
MeshRand << "[sc#ffff aq 0 0]"; | |||||
MeshRand << "[sc#fbbf aq 0 0]"; | |||||
MeshRand << "[sc#bbff aq 0 0]"; | |||||
MeshRand << "[sc#bfbf aq 0 0]"; | |||||
#else | |||||
MeshRand << "[sc#add asph1 2]"; | MeshRand << "[sc#add asph1 2]"; | ||||
MeshRand << "[sc#dad asph1 2]"; | MeshRand << "[sc#dad asph1 2]"; | ||||
MeshRand << "[sc#dda asph1 2]"; | MeshRand << "[sc#dda asph1 2]"; | ||||
MeshRand << "[sc#daa asph1 2]"; | MeshRand << "[sc#daa asph1 2]"; | ||||
MeshRand << "[sc#ada asph1 2]"; | MeshRand << "[sc#ada asph1 2]"; | ||||
MeshRand << "[sc#aad asph1 2]"; | MeshRand << "[sc#aad asph1 2]"; | ||||
#endif | |||||
int ConeLimit = MeshRand.Count(); | |||||
MeshLimit << MeshRand.Count(); | |||||
MeshType << 1; | |||||
#endif //USE_SPHERE | |||||
#if USE_CONE | |||||
MeshRand << "[sc#add scb#add ad8 2 0 rx180 ty-1 ac8 2 2 0 0 0]"; | MeshRand << "[sc#add scb#add ad8 2 0 rx180 ty-1 ac8 2 2 0 0 0]"; | ||||
MeshRand << "[sc#dad scb#dad ad8 2 0 rx180 ty-1 ac8 2 2 0 0 0]"; | MeshRand << "[sc#dad scb#dad ad8 2 0 rx180 ty-1 ac8 2 2 0 0 0]"; | ||||
MeshRand << "[sc#dda scb#dda ad8 2 0 rx180 ty-1 ac8 2 2 0 0 0]"; | MeshRand << "[sc#dda scb#dda ad8 2 0 rx180 ty-1 ac8 2 2 0 0 0]"; | ||||
@@ -135,8 +184,11 @@ public: | |||||
MeshRand << "[sc#ada scb#ada ad8 2 0 rx180 ty-1 ac8 2 2 0 0 0]"; | MeshRand << "[sc#ada scb#ada ad8 2 0 rx180 ty-1 ac8 2 2 0 0 0]"; | ||||
MeshRand << "[sc#aad scb#aad ad8 2 0 rx180 ty-1 ac8 2 2 0 0 0]"; | MeshRand << "[sc#aad scb#aad ad8 2 0 rx180 ty-1 ac8 2 2 0 0 0]"; | ||||
int CylLimit = MeshRand.Count(); | |||||
MeshLimit << MeshRand.Count(); | |||||
MeshType << 2; | |||||
#endif //USE_CONE | |||||
#if USE_CYLINDER | |||||
MeshRand << "[sc#add scb#add ad8 2 0 rx180 ty-1 my ac8 2 2 2 0 0]"; | MeshRand << "[sc#add scb#add ad8 2 0 rx180 ty-1 my ac8 2 2 2 0 0]"; | ||||
MeshRand << "[sc#dad scb#dad ad8 2 0 rx180 ty-1 my ac8 2 2 2 0 0]"; | MeshRand << "[sc#dad scb#dad ad8 2 0 rx180 ty-1 my ac8 2 2 2 0 0]"; | ||||
MeshRand << "[sc#dda scb#dda ad8 2 0 rx180 ty-1 my ac8 2 2 2 0 0]"; | MeshRand << "[sc#dda scb#dda ad8 2 0 rx180 ty-1 my ac8 2 2 2 0 0]"; | ||||
@@ -144,8 +196,11 @@ public: | |||||
MeshRand << "[sc#ada scb#ada ad8 2 0 rx180 ty-1 my ac8 2 2 2 0 0]"; | MeshRand << "[sc#ada scb#ada ad8 2 0 rx180 ty-1 my ac8 2 2 2 0 0]"; | ||||
MeshRand << "[sc#aad scb#aad ad8 2 0 rx180 ty-1 my ac8 2 2 2 0 0]"; | MeshRand << "[sc#aad scb#aad ad8 2 0 rx180 ty-1 my ac8 2 2 2 0 0]"; | ||||
int CapsLimit = MeshRand.Count(); | |||||
MeshLimit << MeshRand.Count(); | |||||
MeshType << 3; | |||||
#endif //USE_CYLINDER | |||||
#if USE_CAPSULE | |||||
MeshRand << "[sc#add scb#add acap1 2 1]"; | MeshRand << "[sc#add scb#add acap1 2 1]"; | ||||
MeshRand << "[sc#dad scb#dad acap1 2 1]"; | MeshRand << "[sc#dad scb#dad acap1 2 1]"; | ||||
MeshRand << "[sc#dda scb#dda acap1 2 1]"; | MeshRand << "[sc#dda scb#dda acap1 2 1]"; | ||||
@@ -153,70 +208,60 @@ public: | |||||
MeshRand << "[sc#ada scb#ada acap1 2 1]"; | MeshRand << "[sc#ada scb#ada acap1 2 1]"; | ||||
MeshRand << "[sc#aad scb#aad acap1 2 1]"; | MeshRand << "[sc#aad scb#aad acap1 2 1]"; | ||||
switch (RandValue) | |||||
MeshLimit << MeshRand.Count(); | |||||
MeshType << 4; | |||||
#endif //USE_CAPSULE | |||||
int RandLimit = RandValue; | |||||
if (MeshLimit.Count() <= RandValue || RandValue < 0) | |||||
RandLimit = rand(MeshLimit.Count() - 1); | |||||
RandValue = rand(MeshLimit[RandLimit], MeshLimit[RandLimit + 1]); | |||||
m_physics = new EasyPhysic(this); | |||||
m_mesh.Compile(MeshRand[RandValue]); | |||||
m_mesh.Scale(vec3(OBJ_SIZE)); | |||||
vec3 BoxSize = vec3(2.0f) * OBJ_SIZE; | |||||
int ColGroup = 1; | |||||
switch (MeshType[RandLimit]) | |||||
{ | { | ||||
case 0: | case 0: | ||||
{ | { | ||||
RandValue = rand(SphereLimit); | |||||
m_physics->SetShapeToBox(BoxSize); | |||||
ColGroup += 0; | |||||
break; | break; | ||||
} | } | ||||
case 1: | case 1: | ||||
{ | { | ||||
RandValue = rand(SphereLimit, ConeLimit); | |||||
m_physics->SetShapeToSphere(BoxSize.x); | |||||
ColGroup += 1; | |||||
break; | break; | ||||
} | } | ||||
case 2: | case 2: | ||||
{ | { | ||||
RandValue = rand(ConeLimit, CylLimit); | |||||
m_physics->SetShapeToCone(BoxSize.x, BoxSize.y); | |||||
ColGroup += 2; | |||||
break; | break; | ||||
} | } | ||||
case 3: | case 3: | ||||
{ | { | ||||
RandValue = rand(CylLimit, CapsLimit); | |||||
m_physics->SetShapeToCylinder(BoxSize); | |||||
ColGroup += 3; | |||||
break; | break; | ||||
} | } | ||||
case 4: | case 4: | ||||
{ | { | ||||
RandValue = rand(CapsLimit, MeshRand.Count()); | |||||
m_physics->SetShapeToCapsule(BoxSize.x, BoxSize.y); | |||||
ColGroup += 4; | |||||
break; | break; | ||||
} | } | ||||
default: | default: | ||||
{ | { | ||||
RandValue = rand(MeshRand.Count()); | |||||
} | } | ||||
} | } | ||||
m_physics = new EasyPhysic(this); | |||||
m_mesh.Compile(MeshRand[RandValue]); | |||||
vec3 BoxSize = vec3(2.0f); | |||||
int ColGroup = 1; | |||||
if (RandValue < SphereLimit) | |||||
{ | |||||
m_physics->SetShapeToBox(BoxSize); | |||||
ColGroup += 0; | |||||
} | |||||
else if (RandValue < ConeLimit) | |||||
{ | |||||
m_physics->SetShapeToSphere(BoxSize.x * 2.f); | |||||
ColGroup += 1; | |||||
} | |||||
else if (RandValue < CylLimit) | |||||
{ | |||||
m_physics->SetShapeToCone(BoxSize.x, BoxSize.y); | |||||
ColGroup += 2; | |||||
} | |||||
else if (RandValue < CapsLimit) | |||||
{ | |||||
m_physics->SetShapeToCylinder(BoxSize); | |||||
ColGroup += 3; | |||||
} | |||||
else | |||||
{ | |||||
m_physics->SetShapeToCapsule(BoxSize.x, BoxSize.y); | |||||
ColGroup += 4; | |||||
} | |||||
m_physics->SetHitRestitution(1.0f); | |||||
m_physics->SetCollisionChannel(0, 0xFF); | m_physics->SetCollisionChannel(0, 0xFF); | ||||
//m_physics->SetCollisionChannel(ColGroup, (1 << ColGroup)|(1)); | //m_physics->SetCollisionChannel(ColGroup, (1 << ColGroup)|(1)); | ||||
m_physics->SetMass(base_mass); | m_physics->SetMass(base_mass); | ||||
@@ -246,6 +291,11 @@ public: | |||||
m_should_render = should_render; | m_should_render = should_render; | ||||
} | } | ||||
void SetCustomShaderData(GpuShaderData* custom_shader) | |||||
{ | |||||
m_custom_shader = custom_shader; | |||||
} | |||||
EasyMesh *GetMesh() { return &m_mesh; } | EasyMesh *GetMesh() { return &m_mesh; } | ||||
EasyPhysic *GetPhysic() { return m_physics; } | EasyPhysic *GetPhysic() { return m_physics; } | ||||
EasyCharacterController *GetCharacter() { return m_character; } | EasyCharacterController *GetCharacter() { return m_character; } | ||||
@@ -266,30 +316,41 @@ protected: | |||||
{ | { | ||||
WorldEntity::TickDraw(seconds); | WorldEntity::TickDraw(seconds); | ||||
if (!m_ready) | |||||
{ | |||||
m_mesh.MeshConvert(); | |||||
m_ready = true; | |||||
} | |||||
if (m_should_render) | |||||
#if CAT_MODE | |||||
if (!m_is_phys || m_custom_shader) | |||||
#endif //CAT_MODE | |||||
{ | { | ||||
if (m_is_character) | |||||
m_mesh.Render(m_character->GetTransform()); | |||||
else | |||||
m_mesh.Render(m_physics->GetTransform()); | |||||
if (!m_ready) | |||||
{ | |||||
if (m_custom_shader) | |||||
m_mesh.MeshConvert(m_custom_shader); | |||||
else | |||||
m_mesh.MeshConvert(); | |||||
m_ready = true; | |||||
} | |||||
else if (m_should_render) | |||||
{ | |||||
if (m_is_character) | |||||
m_mesh.Render(m_character->GetTransform()); | |||||
else | |||||
m_mesh.Render(m_physics->GetTransform()); | |||||
} | |||||
} | } | ||||
} | } | ||||
private: | private: | ||||
//Base datas | //Base datas | ||||
EasyMesh m_mesh; | EasyMesh m_mesh; | ||||
EasyPhysic* m_physics; | |||||
EasyPhysic* m_physics; | |||||
EasyCharacterController* m_character; | EasyCharacterController* m_character; | ||||
GpuShaderData* m_custom_shader; | |||||
bool m_ready; | bool m_ready; | ||||
bool m_should_render; | bool m_should_render; | ||||
bool m_is_character; | bool m_is_character; | ||||
#if CAT_MODE | |||||
bool m_is_phys; | |||||
#endif //CAT_MODE | |||||
}; | }; | ||||
#endif /* __PHYSICOBJECT_H__ */ | #endif /* __PHYSICOBJECT_H__ */ | ||||
@@ -38,6 +38,7 @@ EasyPhysic::EasyPhysic(WorldEntity* NewOwnerEntity) : | |||||
m_convex_shape(NULL), | m_convex_shape(NULL), | ||||
m_motion_state(NULL), | m_motion_state(NULL), | ||||
m_mass(.0f), | m_mass(.0f), | ||||
m_hit_restitution(.0f), | |||||
m_collision_group(1), | m_collision_group(1), | ||||
m_collision_mask(1), | m_collision_mask(1), | ||||
m_owner_entity(NewOwnerEntity), | m_owner_entity(NewOwnerEntity), | ||||
@@ -174,7 +175,7 @@ void EasyPhysic::BaseTransformChanged(const lol::mat4& PreviousMatrix, const lol | |||||
//------------------------------------------------------------------------- | //------------------------------------------------------------------------- | ||||
//Mass related functions | //Mass related functions | ||||
//-- | //-- | ||||
//Set Shape functions | |||||
//Set Mass functions | |||||
void EasyPhysic::SetMass(float mass) | void EasyPhysic::SetMass(float mass) | ||||
{ | { | ||||
m_mass = mass; | m_mass = mass; | ||||
@@ -182,12 +183,26 @@ void EasyPhysic::SetMass(float mass) | |||||
if (m_rigid_body) | if (m_rigid_body) | ||||
{ | { | ||||
SetLocalInertia(m_mass); | SetLocalInertia(m_mass); | ||||
m_rigid_body->setMassProps(mass, m_local_inertia); | |||||
m_rigid_body->setMassProps(m_mass, m_local_inertia); | |||||
} | |||||
} | |||||
//------------------------------------------------------------------------- | |||||
//Hit restitution functions | |||||
//-- | |||||
//Set Hit Restitution functions | |||||
void EasyPhysic::SetHitRestitution(float hit_restitution) | |||||
{ | |||||
m_hit_restitution = hit_restitution; | |||||
if (m_rigid_body) | |||||
{ | |||||
m_rigid_body->setRestitution(m_hit_restitution); | |||||
} | } | ||||
} | } | ||||
//------------------------------------------------------------------------- | //------------------------------------------------------------------------- | ||||
//Final conversion pass functons : Body related | |||||
//Final conversion pass functions : Body related | |||||
//-- | //-- | ||||
//Init to rigid body | //Init to rigid body | ||||
@@ -200,6 +215,7 @@ void EasyPhysic::InitBodyToRigid(bool SetToKinematic) | |||||
SetTransform(vec3(.0f)); | SetTransform(vec3(.0f)); | ||||
btRigidBody::btRigidBodyConstructionInfo NewInfos(m_mass, m_motion_state, m_collision_shape, m_local_inertia); | btRigidBody::btRigidBodyConstructionInfo NewInfos(m_mass, m_motion_state, m_collision_shape, m_local_inertia); | ||||
NewInfos.m_restitution = m_hit_restitution; | |||||
m_rigid_body = new btRigidBody(NewInfos); | m_rigid_body = new btRigidBody(NewInfos); | ||||
m_collision_object = m_rigid_body; | m_collision_object = m_rigid_body; | ||||
m_collision_object->setUserPointer(this); | m_collision_object->setUserPointer(this); | ||||
@@ -329,6 +345,77 @@ void EasyPhysic::RemoveFromSimulation(class Simulation* current_simulation) | |||||
} | } | ||||
} | } | ||||
//------------------------------------------------------------------------- | |||||
//Force/Impulse functions | |||||
//-- | |||||
void EasyPhysic::AddImpulse(const lol::vec3& impulse) | |||||
{ | |||||
if (m_rigid_body) | |||||
m_rigid_body->applyCentralImpulse(LOL2BT_VEC3(impulse)); | |||||
} | |||||
void EasyPhysic::AddImpulse(const lol::vec3& impulse, const lol::vec3& rel_pos) | |||||
{ | |||||
if (m_rigid_body) | |||||
m_rigid_body->applyImpulse(LOL2BT_VEC3(impulse), LOL2BTU_VEC3(rel_pos)); | |||||
} | |||||
void EasyPhysic::AddImpulseTorque(const lol::vec3& torque) | |||||
{ | |||||
if (m_rigid_body) | |||||
m_rigid_body->applyTorqueImpulse(LOL2BT_VEC3(torque)); | |||||
} | |||||
//-- | |||||
void EasyPhysic::AddForce(const lol::vec3& force) | |||||
{ | |||||
if (m_rigid_body) | |||||
m_rigid_body->applyCentralForce(LOL2BT_VEC3(force)); | |||||
} | |||||
void EasyPhysic::AddForce(const lol::vec3& force, const lol::vec3& rel_pos) | |||||
{ | |||||
if (m_rigid_body) | |||||
m_rigid_body->applyForce(LOL2BT_VEC3(force), LOL2BTU_VEC3(rel_pos)); | |||||
} | |||||
void EasyPhysic::AddForceTorque(const lol::vec3& torque) | |||||
{ | |||||
if (m_rigid_body) | |||||
m_rigid_body->applyTorque(LOL2BT_VEC3(torque)); | |||||
} | |||||
//------------------------------------------------------------------------- | |||||
//Movements getter | |||||
//-- | |||||
lol::vec3 EasyPhysic::GetLinearVelocity() const | |||||
{ | |||||
if (m_rigid_body) | |||||
return BT2LOL_VEC3(m_rigid_body->getLinearVelocity()); | |||||
return lol::vec3(.0f); | |||||
} | |||||
lol::vec3 EasyPhysic::GetLinearForce() const | |||||
{ | |||||
if (m_rigid_body) | |||||
return BT2LOL_VEC3(m_rigid_body->getTotalForce()); | |||||
return lol::vec3(.0f); | |||||
} | |||||
lol::vec3 EasyPhysic::GetAngularVelocity() const | |||||
{ | |||||
if (m_rigid_body) | |||||
return BT2LOL_VEC3(m_rigid_body->getAngularVelocity()); | |||||
return lol::vec3(.0f); | |||||
} | |||||
lol::vec3 EasyPhysic::GetAngularForce() const | |||||
{ | |||||
if (m_rigid_body) | |||||
return BT2LOL_VEC3(m_rigid_body->getTotalTorque()); | |||||
return lol::vec3(.0f); | |||||
} | |||||
//Set Local Inertia | //Set Local Inertia | ||||
void EasyPhysic::SetLocalInertia(float mass) | void EasyPhysic::SetLocalInertia(float mass) | ||||
{ | { | ||||
@@ -55,27 +55,43 @@ protected: | |||||
virtual void BaseTransformChanged(const lol::mat4& PreviousMatrix, const lol::mat4& NewMatrix); | virtual void BaseTransformChanged(const lol::mat4& PreviousMatrix, const lol::mat4& NewMatrix); | ||||
public: | public: | ||||
virtual void SetMass(float mass); | virtual void SetMass(float mass); | ||||
virtual float GetMass() { return m_mass; } | |||||
virtual void SetHitRestitution(float hit_restitution); | |||||
virtual void InitBodyToRigid(bool ZeroMassIsKinematic=false); | virtual void InitBodyToRigid(bool ZeroMassIsKinematic=false); | ||||
virtual void InitBodyToGhost(); | virtual void InitBodyToGhost(); | ||||
virtual void AddToSimulation(class Simulation* current_simulation); | virtual void AddToSimulation(class Simulation* current_simulation); | ||||
virtual void RemoveFromSimulation(class Simulation* current_simulation); | virtual void RemoveFromSimulation(class Simulation* current_simulation); | ||||
//Force/Impulse functions | |||||
virtual void AddImpulse(const lol::vec3& impulse); | |||||
virtual void AddImpulse(const lol::vec3& impulse, const lol::vec3& rel_pos); | |||||
virtual void AddImpulseTorque(const lol::vec3& torque); | |||||
virtual void AddForce(const lol::vec3& force); | |||||
virtual void AddForce(const lol::vec3& force, const lol::vec3& rel_pos); | |||||
virtual void AddForceTorque(const lol::vec3& torque); | |||||
//Movements getter | |||||
lol::vec3 GetLinearVelocity() const; | |||||
lol::vec3 GetLinearForce() const; | |||||
lol::vec3 GetAngularVelocity() const; | |||||
lol::vec3 GetAngularForce() const; | |||||
protected: | protected: | ||||
virtual void SetLocalInertia(float mass); | virtual void SetLocalInertia(float mass); | ||||
virtual void SetShapeTo(btCollisionShape* collision_shape); | virtual void SetShapeTo(btCollisionShape* collision_shape); | ||||
virtual btGhostObject* GetGhostObjectInstance(); | virtual btGhostObject* GetGhostObjectInstance(); | ||||
btCollisionObject* m_collision_object; | |||||
btCollisionObject* m_collision_object; | |||||
btGhostObject* m_ghost_object; | |||||
btGhostObject* m_ghost_object; | |||||
btRigidBody* m_rigid_body; | btRigidBody* m_rigid_body; | ||||
btVector3 m_local_inertia; | |||||
btVector3 m_local_inertia; | |||||
btCollisionShape* m_collision_shape; | |||||
btConvexShape* m_convex_shape; | |||||
btMotionState* m_motion_state; | |||||
btCollisionShape* m_collision_shape; | |||||
btConvexShape* m_convex_shape; | |||||
btMotionState* m_motion_state; | |||||
#else // NO PHYSIC IMPLEMENTATION | #else // NO PHYSIC IMPLEMENTATION | ||||
@@ -95,11 +111,27 @@ private: | |||||
virtual void BaseTransformChanged(const lol::mat4& PreviousMatrix, const lol::mat4& NewMatrix) { } | virtual void BaseTransformChanged(const lol::mat4& PreviousMatrix, const lol::mat4& NewMatrix) { } | ||||
public: | public: | ||||
virtual void SetMass(float mass) { } | virtual void SetMass(float mass) { } | ||||
virtual float GetMass() { return .0f; } | |||||
virtual void SetHitRestitution(float hit_restitution) { } | |||||
virtual void InitBodyToRigid() { } | virtual void InitBodyToRigid() { } | ||||
virtual void InitBodyToGhost() { } | virtual void InitBodyToGhost() { } | ||||
virtual void AddToSimulation(class Simulation* current_simulation) { } | virtual void AddToSimulation(class Simulation* current_simulation) { } | ||||
virtual void RemoveFromSimulation(class Simulation* current_simulation) { } | virtual void RemoveFromSimulation(class Simulation* current_simulation) { } | ||||
//Force/Impulse functions | |||||
virtual void AddImpulse(const lol::vec3& impulse) { } | |||||
virtual void AddImpulse(const lol::vec3& impulse, const lol::vec3& rel_pos) { } | |||||
virtual void AddImpulseTorque(const lol::vec3& torque) { } | |||||
virtual void AddForce(const lol::vec3& force) { } | |||||
virtual void AddForce(const lol::vec3& force, const lol::vec3& rel_pos) { } | |||||
virtual void AddForceTorque(const lol::vec3& torque) { } | |||||
//Movements getter | |||||
lol::vec3 GetLinearVelocity() const { return lol::vec3(.0f); } | |||||
lol::vec3 GetLinearForce() const { return lol::vec3(.0f); } | |||||
lol::vec3 GetAngularVelocity() const { return lol::vec3(.0f); } | |||||
lol::vec3 GetAngularForce() const { return lol::vec3(.0f); } | |||||
virtual void InitBodyToGhost() { } | virtual void InitBodyToGhost() { } | ||||
#endif // PHYSIC IMPLEMENTATION | #endif // PHYSIC IMPLEMENTATION | ||||
@@ -148,21 +180,22 @@ public: | |||||
} | } | ||||
protected: | protected: | ||||
lol::mat4 m_local_to_world; | |||||
float m_mass; | |||||
int m_collision_group; | |||||
int m_collision_mask; | |||||
WorldEntity* m_owner_entity; | |||||
Simulation* m_owner_simulation; | |||||
lol::mat4 m_local_to_world; | |||||
float m_mass; | |||||
float m_hit_restitution; | |||||
int m_collision_group; | |||||
int m_collision_mask; | |||||
WorldEntity* m_owner_entity; | |||||
Simulation* m_owner_simulation; | |||||
//Base/Attachment logic | //Base/Attachment logic | ||||
Array<EasyPhysic*> m_based_physic_list; //List of objects based on this : this object moves, its based object MoveStep with it. | |||||
EasyPhysic* m_base_physic; //Base for this object : The base moves, the object moves with it. | |||||
bool m_base_lock_location; //when this is TRUE, location moves with rotation change. | |||||
bool m_base_lock_rotation; //when this is TRUE, rotation moves with rotation change. | |||||
Array<EasyPhysic*> m_based_physic_list; //List of objects based on this : this object moves, its based object MoveStep with it. | |||||
EasyPhysic* m_base_physic; //Base for this object : The base moves, the object moves with it. | |||||
bool m_base_lock_location; //when this is TRUE, location moves with rotation change. | |||||
bool m_base_lock_rotation; //when this is TRUE, rotation moves with rotation change. | |||||
//Touch logic | //Touch logic | ||||
Array<EasyPhysic*> m_touching_physic; //Maintained by ghost objects | |||||
Array<EasyPhysic*> m_touching_physic; //Maintained by ghost objects | |||||
}; | }; | ||||
} /* namespace phys */ | } /* namespace phys */ | ||||