From 8ee499b7bcfc3d99a0a48303913bdbb0a95e3b02 Mon Sep 17 00:00:00 2001 From: jaynus Date: Wed, 13 May 2015 23:24:46 -0700 Subject: [PATCH] World positional and directional transformations based on game data. --- extensions/tests/longrod_dxtk_test.txt | 4 +- extensions/vd/base_vehicle.cpp | 10 ++-- extensions/vd/controller.cpp | 3 +- extensions/vd/debug/penetration_display.cpp | 53 +++++++++++++++++++++ extensions/vd/debug/penetration_display.hpp | 14 +++++- 5 files changed, 76 insertions(+), 8 deletions(-) diff --git a/extensions/tests/longrod_dxtk_test.txt b/extensions/tests/longrod_dxtk_test.txt index ee93010471..40ff7c5d7e 100644 --- a/extensions/tests/longrod_dxtk_test.txt +++ b/extensions/tests/longrod_dxtk_test.txt @@ -2,4 +2,6 @@ init: debug_render: register_vehicle:\A3\Armor_F_EPB\MBT_03\MBT_03_cannon_F.p3d, 1, 4046.21;3902.56;5.075 -#set_animation_state:1,damageHide, 0, Wheel_kolL1, 0, Wheel_koloL1, 0, Wheel_podkoloL1, 1, Wheel_kolP1, 0, Wheel_koloP1, 0, Wheel_podkoloP1, 1, Wheel_kolL2, 0, Wheel_kolP2, 0, Wheel_koloL2, 0, Wheel_koloL3, 0, Wheel_koloL4, 0, Wheel_koloL5, 0, Wheel_koloL6, 0, Wheel_koloL7, 0, Wheel_koloP2, 0, Wheel_koloP3, 0, Wheel_koloP4, 0, Wheel_koloP5, 0, Wheel_koloP6, 0, Wheel_koloP7, 0, Wheel_podkoloL2, 1, Wheel_podkoloL3, 1, Wheel_podkoloL4, 1, Wheel_podkoloL5, 0, Wheel_podkoloL6, 0, Wheel_podkoloP2, 1, Wheel_podkoloP3, 1, Wheel_podkoloP4, 1, Wheel_podkoloP5, 0, Wheel_podkoloP6, 1, podkoloL1_hide_damage, 0, podkoloL2_hide_damage, 0, podkoloL3_hide_damage, 0, podkoloL4_hide_damage, 0, podkoloL5_hide_damage, 0, podkoloL6_hide_damage, 0, podkoloL7_hide_damage, 0, podkoloL8_hide_damage, 0, podkoloP1_hide_damage, 0, podkoloP2_hide_damage, 0, podkoloP3_hide_damage, 0, podkoloP4_hide_damage, 0, podkoloP5_hide_damage, 0, podkoloP6_hide_damage, 0, podkoloP7_hide_damage, 0, podkoloP8_hide_damage, 0, damageVez, 0, MainTurret, -3, MainGun, 0, Recoil, 0, ObsTurret, -0, ObsGun, 0, MainGunOptics, 0, Wheel_podkoloP7, 0, Wheel_podkoloL7, 0, HatchDriver, 0, HatchCommander, 0, HatchGunner, 0, damageVezVelitele, 0, poklop_commander_damage, 0, poklop_gunner_damage, 0, poklop_driver_damage, 0, zaslehROT_HMG, 101, zaslehROT_coax, 16, cannon_muzzle_flash, 0, zaslehROT_cannon, 956, HideHull, 1, HideTurret, 1, LockMuzzle, 0 \ No newline at end of file +#set_animation_state:1,damageHide, 0, Wheel_kolL1, 0, Wheel_koloL1, 0, Wheel_podkoloL1, 1, Wheel_kolP1, 0, Wheel_koloP1, 0, Wheel_podkoloP1, 1, Wheel_kolL2, 0, Wheel_kolP2, 0, Wheel_koloL2, 0, Wheel_koloL3, 0, Wheel_koloL4, 0, Wheel_koloL5, 0, Wheel_koloL6, 0, Wheel_koloL7, 0, Wheel_koloP2, 0, Wheel_koloP3, 0, Wheel_koloP4, 0, Wheel_koloP5, 0, Wheel_koloP6, 0, Wheel_koloP7, 0, Wheel_podkoloL2, 1, Wheel_podkoloL3, 1, Wheel_podkoloL4, 1, Wheel_podkoloL5, 0, Wheel_podkoloL6, 0, Wheel_podkoloP2, 1, Wheel_podkoloP3, 1, Wheel_podkoloP4, 1, Wheel_podkoloP5, 0, Wheel_podkoloP6, 1, podkoloL1_hide_damage, 0, podkoloL2_hide_damage, 0, podkoloL3_hide_damage, 0, podkoloL4_hide_damage, 0, podkoloL5_hide_damage, 0, podkoloL6_hide_damage, 0, podkoloL7_hide_damage, 0, podkoloL8_hide_damage, 0, podkoloP1_hide_damage, 0, podkoloP2_hide_damage, 0, podkoloP3_hide_damage, 0, podkoloP4_hide_damage, 0, podkoloP5_hide_damage, 0, podkoloP6_hide_damage, 0, podkoloP7_hide_damage, 0, podkoloP8_hide_damage, 0, damageVez, 0, MainTurret, -3, MainGun, 0, Recoil, 0, ObsTurret, -0, ObsGun, 0, MainGunOptics, 0, Wheel_podkoloP7, 0, Wheel_podkoloL7, 0, HatchDriver, 0, HatchCommander, 0, HatchGunner, 0, damageVezVelitele, 0, poklop_commander_damage, 0, poklop_gunner_damage, 0, poklop_driver_damage, 0, zaslehROT_HMG, 101, zaslehROT_coax, 16, cannon_muzzle_flash, 0, zaslehROT_cannon, 956, HideHull, 1, HideTurret, 1, LockMuzzle, 0 +#hit:1,1,2,3,4,5,6,7,8,9,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,11,1,1,1,1,1,1 +set_vehicle_state:1,0;-20;0,0;0;0,0;0;0 \ No newline at end of file diff --git a/extensions/vd/base_vehicle.cpp b/extensions/vd/base_vehicle.cpp index 2e660804ca..33605c50e9 100644 --- a/extensions/vd/base_vehicle.cpp +++ b/extensions/vd/base_vehicle.cpp @@ -21,7 +21,7 @@ namespace ace { } if (fire_lod == -1) // @TODO: fallback on geo LOD fire_lod = 0; - fire_lod = 0; + //fire_lod = 0; assert(fire_lod != -1); // Build the mesh from object faces @@ -45,9 +45,11 @@ namespace ace { // @TODO: This is moving it in the bullet world for handling multiple collisions, instead our raytests need to ignore ALL but this type. How do we do that? // For now this only works for single-object collisions then - //btTransform transform = bt_object->getWorldTransform(); - //transform.setOrigin(btVector3(position_.x(), position_.y(), position_.z())); - //bt_object->setWorldTransform(transform); + // Set 3d world bullet position based on game position + + btTransform transform = bt_object->getWorldTransform(); + transform.setOrigin(btVector3(position_.x(), position_.y(), position_.z())); + bt_object->setWorldTransform(transform); controller::get().bt_world->addCollisionObject(bt_object.get()); } diff --git a/extensions/vd/controller.cpp b/extensions/vd/controller.cpp index 479dac3fc7..17b236e149 100644 --- a/extensions/vd/controller.cpp +++ b/extensions/vd/controller.cpp @@ -52,6 +52,7 @@ namespace ace { #if defined(DEVEL) && defined(USE_DIRECTX) _debug_display = std::make_unique(); + bt_world->setDebugDrawer(dynamic_cast(_debug_display.get())); #endif _ready = true; @@ -188,7 +189,7 @@ namespace ace { vehicles[_args[0]]->direction = _args[1]; vehicles[_args[0]]->up = _args[2]; - //vehicles[_args[0]]->transform(); + vehicles[_args[0]]->transform(); return true; } diff --git a/extensions/vd/debug/penetration_display.cpp b/extensions/vd/debug/penetration_display.cpp index 9240e73dcd..eace6655a8 100644 --- a/extensions/vd/debug/penetration_display.cpp +++ b/extensions/vd/debug/penetration_display.cpp @@ -20,6 +20,20 @@ namespace ace { _active_hits.push_back(gamehit::create(args)); + auto _vehicle = controller::get().vehicles.find(args[0]); + if (_vehicle == controller::get().vehicles.end()) + return false; + + btVector3 vectorFrom(5, 20, 0); + btVector3 vectorTo = _vehicle->second->bt_object->getWorldTransform().getOrigin(); + btVector3 direction = vectorTo - vectorFrom; + + XMVECTORF32 eyePos = { vectorFrom.x(), vectorFrom.y(), vectorFrom.z() }; + XMVECTORF32 eyeDir = { direction.x(), direction.y(), direction.z() }; + XMVECTORF32 up = { 0.f, 1.f, 0.f }; + + XMStoreFloat4x4(&_View, XMMatrixLookAtLH(eyePos, eyeDir, up)); + return true; } bool penetration_display::register_vehicle(const arguments &args, std::string &result) { @@ -58,6 +72,7 @@ namespace ace { if (FAILED(hr)) return hr; } + _BatchEffect->SetView(XMLoadFloat4x4(&_View)); _BatchEffect->SetProjection(XMLoadFloat4x4(&_Projection)); @@ -73,6 +88,7 @@ namespace ace { bool penetration_display::step(void) { _BatchEffect->Apply(_pImmediateContext); + _pImmediateContext->IASetInputLayout(_pBatchInputLayout); const XMVECTORF32 xaxis = { 20.f, 0.f, 0.f }; @@ -95,6 +111,14 @@ namespace ace { _Batch->End(); + + // Draw the bullet world + // The BT debug drawing is a single batch + _Batch->Begin(); + ace::vehicledamage::controller::get().bt_world->debugDrawWorld(); + _Batch->End(); + + if (_active_vehicle) { DrawObject(_active_vehicle->fire_lod, *_Batch, *_active_vehicle->object, Colors::Gray); } @@ -246,6 +270,35 @@ namespace ace { batch.End(); } + + // Bullet debug functions + void penetration_display::drawLine(const btVector3& from, const btVector3& to, const btVector3& color) { + + XMVECTORF32 v1 = { from.x(), from.y(), from.z() }; + XMVECTORF32 v2 = { to.x(), to.y(), to.z() }; + _Batch->DrawLine(VertexPositionColor(v1, Colors::LightCoral), VertexPositionColor(v2, Colors::LightCoral)); + } + + void penetration_display::drawContactPoint(const btVector3 &PointOnB, const btVector3 &normalOnB, btScalar distance, int lifeTime, const btVector3 &color) { + + } + + void penetration_display::reportErrorWarning(const char *warningString) { + LOG(WARNING) << "btWarning - {" << warningString << "}"; + } + + void penetration_display::draw3dText(const btVector3 &location, const char *textString) { + + } + + void penetration_display::setDebugMode(int debugMode) { + _bt_debug_mode = debugMode; + } + + int penetration_display::getDebugMode() const { + + return _bt_debug_mode; + } } } } diff --git a/extensions/vd/debug/penetration_display.hpp b/extensions/vd/debug/penetration_display.hpp index 208da58a07..00e6e3cac9 100644 --- a/extensions/vd/debug/penetration_display.hpp +++ b/extensions/vd/debug/penetration_display.hpp @@ -20,6 +20,8 @@ #include "simulation/object.hpp" #include "vehicle.hpp" +#include "LinearMath/btIDebugDraw.h" + #include "game.hpp" using namespace ace::debug; @@ -29,7 +31,7 @@ namespace ace { namespace vehicledamage { namespace debug { __declspec(align(16)) - class penetration_display : public d3d_display, public dispatcher { + class penetration_display : public d3d_display, public dispatcher, public btIDebugDraw { public: penetration_display(); @@ -37,6 +39,14 @@ namespace ace { bool register_vehicle(const arguments &, std::string &); bool show_hit(const arguments &, std::string &); + // bullet debug + virtual void drawLine(const btVector3& from, const btVector3& to, const btVector3& color); + virtual void drawContactPoint(const btVector3& PointOnB, const btVector3& normalOnB, btScalar distance, int lifeTime, const btVector3& color); + virtual void reportErrorWarning(const char* warningString); + virtual void draw3dText(const btVector3& location, const char* textString); + virtual void setDebugMode(int debugMode); + virtual int getDebugMode() const; + int _bt_debug_mode; // End bool init() override; @@ -54,7 +64,7 @@ namespace ace { vehicle_p _active_vehicle; std::vector _active_hits; - + void DrawHits(uint32_t lod, PrimitiveBatch& batch, GXMVECTOR color); void DrawCollisions(const std::vector> & collisions, PrimitiveBatch& batch, GXMVECTOR color); void DrawObject(uint32_t lod, PrimitiveBatch& batch, ace::simulation::object & obj, GXMVECTOR color);