summaryrefslogtreecommitdiff
path: root/src/game.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/game.cpp')
-rw-r--r--src/game.cpp33
1 files changed, 29 insertions, 4 deletions
diff --git a/src/game.cpp b/src/game.cpp
index 6cde580..3ff3948 100644
--- a/src/game.cpp
+++ b/src/game.cpp
@@ -19,6 +19,7 @@
#include <cstring>
#include <glm/gtc/quaternion.hpp>
#include <iomanip>
+#include <ostream>
const uint64_t consoleBufferCount = 30;
const uint64_t consoleLineLength = 128;
@@ -77,12 +78,14 @@ const char *PKE_FILE_ENTITY_TYPE_IMPORTER_GLTF_ACCESSOR_INDEX_VERTEX = "Importer
const char *PKE_FILE_ENTITY_TYPE_IMPORTER_GLTF_ACCESSOR_INDEX_NORMAL = "Importer_GLTF::AccessorIndexNormal: ";
const char *PKE_FILE_ENTITY_TYPE_IMPORTER_GLTF_ACCESSOR_INDEX_UV = "Importer_GLTF::AccessorIndexUV: ";
const char *PKE_FILE_ENTITY_TYPE_IMPORTER_GLTF_ACCESSOR_INDEX_INDEX = "Importer_GLTF::AccessorIndexIndex: ";
+const char *PKE_FILE_ENTITY_TYPE_PHYSICS_STARTING_MASS = "BT::StartingMass: ";
const char *PKE_FILE_INSTANCE_ENTITY_HANDLE = "EntityHandle: ";
const char *PKE_FILE_INSTANCE_ENTITY_TYPE_CODE = "EntityTypeCode: ";
const char *PKE_FILE_INSTANCE_POS_POS = "InstPos::Pos: ";
const char *PKE_FILE_INSTANCE_POS_ROT = "InstPos::Rot: ";
const char *PKE_FILE_INSTANCE_POS_SCALE = "InstPos::Scale: ";
+const char *PKE_FILE_INSTANCE_MASS = "InstPos::Mass: ";
char consoleBuffer[consoleBufferCount][consoleLineLength];
long consoleBufferIndex = 0;
@@ -117,6 +120,9 @@ void SerializeEntityType(std::ofstream &stream, const EntityType &et) {
stream << PKE_FILE_ENTITY_TYPE_IMPORTER_GLTF_ACCESSOR_INDEX_UV << et.Importer_GLTF.AccessorIndexUV << std::endl;
if (et.Importer_GLTF.AccessorIndexIndex != e.Importer_GLTF.AccessorIndexIndex)
stream << PKE_FILE_ENTITY_TYPE_IMPORTER_GLTF_ACCESSOR_INDEX_INDEX << et.Importer_GLTF.AccessorIndexIndex << std::endl;
+ if (et.bt.startingMass != e.bt.startingMass) {
+ stream << PKE_FILE_ENTITY_TYPE_PHYSICS_STARTING_MASS << et.bt.startingMass << std::endl;
+ }
}
void SerializeInstance(std::ofstream &stream, const CompInstance &comp) {
@@ -142,6 +148,7 @@ void SerializeInstance(std::ofstream &stream, const CompInstance &comp) {
btTransform trans;
comp.bt.motionState->getWorldTransform(trans);
btVector3 scale = comp.bt.rigidBody->getCollisionShape()->getLocalScaling();
+ btScalar mass = comp.bt.rigidBody->getMass();
if (trans != baseInst.posRot) {
btVector3 pos = trans.getOrigin();
btQuaternion rot = trans.getRotation();
@@ -160,6 +167,9 @@ void SerializeInstance(std::ofstream &stream, const CompInstance &comp) {
<< std::setw(10) << scale[0] << ","
<< std::setw(10) << scale[1] << ","
<< std::setw(10) << scale[2] << "]" << std::endl;
+ if (mass != baseInst.mass) {
+ stream << PKE_FILE_INSTANCE_MASS << mass << std::endl;
+ }
}
void ParseEntityType(std::ifstream &stream) {
@@ -240,6 +250,12 @@ void ParseEntityType(std::ifstream &stream) {
assert(result == STR2NUM_ERROR::SUCCESS);
continue;
}
+ if (strstr(readLine, PKE_FILE_ENTITY_TYPE_PHYSICS_STARTING_MASS)) {
+ uint64_t prefixLen = strlen(PKE_FILE_ENTITY_TYPE_PHYSICS_STARTING_MASS);
+ STR2NUM_ERROR result = str2num(et.bt.startingMass, readLine + prefixLen);
+ assert(result == STR2NUM_ERROR::SUCCESS);
+ continue;
+ }
}
}
@@ -249,6 +265,7 @@ void ParseInstance(std::ifstream &stream) {
instPos.posRot = btTransform{};
instPos.posRot.setIdentity();
instPos.scale = btVector3(1, 1, 1);
+ instPos.mass = 1.f;
char entTypeCode[21];
memset(reinterpret_cast<void *>(entTypeCode), '\0', 21);
while (stream.getline(readLine, readLineLength)) {
@@ -267,11 +284,11 @@ void ParseInstance(std::ifstream &stream) {
auto &compInst = ECS_CreateInstance(entityHandle, et.entityHandle);
btVector3 localInertia(0, 0, 0);
- et.bt.shape->calculateLocalInertia(btScalar(1.f), localInertia);
+ et.bt.shape->calculateLocalInertia(instPos.mass, localInertia);
compInst.bt.motionState = Pke_New<btDefaultMotionState>(MemBkt_Bullet);
new (compInst.bt.motionState) btDefaultMotionState(instPos.posRot);
compInst.bt.rigidBody = Pke_New<btRigidBody>(MemBkt_Bullet);
- new (compInst.bt.rigidBody) btRigidBody(btScalar(1.f), compInst.bt.motionState, et.bt.shape, localInertia);
+ new (compInst.bt.rigidBody) btRigidBody(instPos.mass, compInst.bt.motionState, et.bt.shape, localInertia);
compInst.bt.rigidBody->setLinearVelocity(btVector3(0,0,0));
compInst.bt.rigidBody->setAngularVelocity(btVector3(0,0,0));
compInst.bt.rigidBody->getCollisionShape()->setLocalScaling(instPos.scale);
@@ -342,6 +359,12 @@ void ParseInstance(std::ifstream &stream) {
} while (*pEnd != ']');
continue;
}
+ if (strstr(readLine, PKE_FILE_INSTANCE_MASS)) {
+ uint64_t prefixLen = strlen(PKE_FILE_INSTANCE_MASS);
+ STR2NUM_ERROR result = str2num(instPos.mass, readLine + prefixLen);
+ assert(result == STR2NUM_ERROR::SUCCESS);
+ continue;
+ }
}
}
@@ -459,13 +482,13 @@ void Game_Tick(double delta) {
auto &compInst = ECS_CreateInstance(newEntity, createInfo.entityTypeEntityHandle);
btVector3 localInertia(0, 0, 0);
- et.bt.shape->calculateLocalInertia(btScalar(1.f), localInertia);
+ et.bt.shape->calculateLocalInertia(et.bt.startingMass, localInertia);
btTransform posRot{};
posRot.setIdentity();
compInst.bt.motionState = Pke_New<btDefaultMotionState>(MemBkt_Bullet);
new (compInst.bt.motionState) btDefaultMotionState(posRot);
compInst.bt.rigidBody = Pke_New<btRigidBody>(MemBkt_Bullet);
- new (compInst.bt.rigidBody) btRigidBody(btScalar(1.f), compInst.bt.motionState, et.bt.shape, localInertia);
+ new (compInst.bt.rigidBody) btRigidBody(et.bt.startingMass, compInst.bt.motionState, et.bt.shape, localInertia);
compInst.bt.rigidBody->setLinearVelocity(btVector3(0,0,0));
compInst.bt.rigidBody->setAngularVelocity(btVector3(0,0,0));
compInst.bt.rigidBody->getCollisionShape()->setLocalScaling(btVector3(1, 1, 1));
@@ -758,6 +781,7 @@ void RecordImGuiModalCreateEntityType() {
ImGui::InputScalar("GLTF Import Index - Normal", ImGuiDataType_S16, &entityTypeToCreate->Importer_GLTF.AccessorIndexNormal);
ImGui::InputScalar("GLTF Import Index - UV", ImGuiDataType_S16, &entityTypeToCreate->Importer_GLTF.AccessorIndexUV);
ImGui::InputScalar("GLTF Import Index - Index", ImGuiDataType_S16, &entityTypeToCreate->Importer_GLTF.AccessorIndexIndex);
+ ImGui::InputFloat("Physics - Mass", &entityTypeToCreate->bt.startingMass);
ImGui::Separator();
@@ -871,6 +895,7 @@ void RecordImGui_CompInstPos(bool readonly, CompInstance *component) {
changed = ImGui::InputScalarN("pos", ImGuiDataType_Float, &pos, 3, nullptr, nullptr, nullptr, inputTextFlags) || changed;
changed = ImGui::InputScalarN("rot", ImGuiDataType_Float, &rot, 4, nullptr, nullptr, nullptr, inputTextFlags) || changed;
changed = ImGui::InputScalarN("scale", ImGuiDataType_Float, &instPos.scale, 3, nullptr, nullptr, nullptr, inputTextFlags) || changed;
+ changed = ImGui::InputFloat("mass", &instPos.mass, 0.0, 0.0, "%.3f", inputTextFlags) || changed;
if (changed) {
instPos.posRot.setOrigin(pos);