From 1ffa486edd70406627f3e329351184dafebc1aea Mon Sep 17 00:00:00 2001 From: Jonathan Bradley Date: Wed, 3 Jan 2024 16:35:09 -0500 Subject: checkpoint - EntityTypeDetails array --- editor/editor.cpp | 89 ++++++++++++++++++++++++++++++++----------------------- 1 file changed, 52 insertions(+), 37 deletions(-) (limited to 'editor') diff --git a/editor/editor.cpp b/editor/editor.cpp index ada13bf..40f187a 100644 --- a/editor/editor.cpp +++ b/editor/editor.cpp @@ -267,28 +267,33 @@ void PkeEditor_Tick(double delta) { while (entityInstancesToCreate.Count() > 0) { auto createInfo = entityInstancesToCreate.Pop(); // TODO needs to be more elegant - int64_t etIndex = EntityType_FindByEntityHandle(createInfo.entityTypeEntityHandle); + int64_t detailIndex = 0; + int64_t etIndex = EntityType_FindByEntityHandle(createInfo.entityTypeEntityHandle, detailIndex); auto &et = GlobalEntityTypes[etIndex]; - EntityHandle newEntity = ECS_CreateEntity(); - auto &compInst = ECS_CreateInstance(newEntity, createInfo.entityTypeEntityHandle); - - compInst.physicsLayer = et.bt.startingCollisionLayer; - compInst.physicsMask = et.bt.startingCollisionMask; - btVector3 localInertia(0, 0, 0); - et.bt.shape->calculateLocalInertia(et.bt.startingMass, localInertia); - btTransform posRot{}; - posRot.setIdentity(); - compInst.bt.motionState = Pke_New(MemBkt_Bullet); - new (compInst.bt.motionState) btDefaultMotionState(posRot); - compInst.bt.rigidBody = Pke_New(MemBkt_Bullet); - 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)); - BtDynamicsWorld->addRigidBody(compInst.bt.rigidBody); - compInst.bt.rigidBody->getBroadphaseProxy()->m_collisionFilterGroup = static_cast(et.bt.startingCollisionLayer); - compInst.bt.rigidBody->getBroadphaseProxy()->m_collisionFilterMask = static_cast(et.bt.startingCollisionMask); - compInst.bt.rigidBody->setUserPointer(reinterpret_cast(compInst.entHandle.hash)); + EntityHandle parentEntity = ECS_CreateEntity(); + + for (size_t i = 0; i < et.detailsCount; ++i) { + auto &etd = et.details[i]; + EntityHandle newEntity = ECS_CreateEntity(parentEntity); + auto &compInst = ECS_CreateInstance(newEntity, etd.entityHandle); + compInst.physicsLayer = etd.bt.startingCollisionLayer; + compInst.physicsMask = etd.bt.startingCollisionMask; + btVector3 localInertia(0, 0, 0); + etd.bt.shape->calculateLocalInertia(etd.bt.startingMass, localInertia); + btTransform posRot{}; + posRot.setIdentity(); + compInst.bt.motionState = Pke_New(MemBkt_Bullet); + new (compInst.bt.motionState) btDefaultMotionState(posRot); + compInst.bt.rigidBody = Pke_New(MemBkt_Bullet); + new (compInst.bt.rigidBody) btRigidBody(etd.bt.startingMass, compInst.bt.motionState, etd.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)); + BtDynamicsWorld->addRigidBody(compInst.bt.rigidBody); + compInst.bt.rigidBody->getBroadphaseProxy()->m_collisionFilterGroup = static_cast(etd.bt.startingCollisionLayer); + compInst.bt.rigidBody->getBroadphaseProxy()->m_collisionFilterMask = static_cast(etd.bt.startingCollisionMask); + compInst.bt.rigidBody->setUserPointer(reinterpret_cast(compInst.entHandle.hash)); + } } PkeInputEventHolder holder = PkeInput_Query(dbgCtrl_CameraButtonMask); @@ -870,22 +875,31 @@ void RecordImGuiModalCreateEntityType() { } ImGui::SameLine(); ImGui::Text("%s", apssModel.safeKey); - RecordImGui_AssetPicker(apssModel); - if (ImGui::Button("Texture Key")) { - ImGui::OpenPopup(apssTexture.source); - } - ImGui::SameLine(); - ImGui::Text("%s", apssTexture.safeKey); - RecordImGui_AssetPicker(apssTexture); ImGui::InputText("Entity Type Code", entityTypeCode, 31); - ImGui::InputScalar("Starting Instance Count", ImGuiDataType_U32, &entityTypeToCreate.startingInstanceCount); - ImGui::InputScalar("GLTF Import Index - Vertex", ImGuiDataType_S16, &entityTypeToCreate.Importer_GLTF.AccessorIndexVertex); - 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::InputScalar("Physics - Collision Layer", ImGuiDataType_U16, &entityTypeToCreate.bt.startingCollisionLayer); - ImGui::InputScalar("Physics - Collision Mask", ImGuiDataType_U16, &entityTypeToCreate.bt.startingCollisionMask); + + ImGui::BeginDisabled(); + ImGui::InputScalar("Sub-Types", ImGuiDataType_S64, &entityTypeToCreate.detailsCount); + ImGui::SameLine(); + if (ImGui::Button("-")) entityTypeToCreate.detailsCount -= 1; + ImGui::SameLine(); + if (ImGui::Button("+")) entityTypeToCreate.detailsCount += 1; + ImGui::EndDisabled(); + + for (int64_t i = 0; i < entityTypeToCreate.detailsCount; ++i) { + auto &etd = entityTypeToCreate.details[i]; + ImGui::Separator(); + RecordImGui_AssetPicker(apssModel); + if (ImGui::Button("Texture Key")) { + ImGui::OpenPopup(apssTexture.source); + } + ImGui::SameLine(); + ImGui::Text("%s", apssTexture.safeKey); + RecordImGui_AssetPicker(apssTexture); + ImGui::InputScalar("Starting Instance Count", ImGuiDataType_U32, &etd.startingInstanceCount); + ImGui::InputFloat("Physics - Mass", &etd.bt.startingMass); + ImGui::InputScalar("Physics - Collision Layer", ImGuiDataType_U16, &etd.bt.startingCollisionLayer); + ImGui::InputScalar("Physics - Collision Mask", ImGuiDataType_U16, &etd.bt.startingCollisionMask); + } ImGui::Separator(); @@ -893,7 +907,8 @@ void RecordImGuiModalCreateEntityType() { // TODO some type of validation strncpy(entityTypeToCreate.modelAssetKey, apssModel.safeKey, AssetKeyLength); - strncpy(entityTypeToCreate.textureAssetKey, apssTexture.safeKey, AssetKeyLength); + // TODO this needs to be an array + strncpy(entityTypeToCreate.details[0].textureAssetKey, apssTexture.safeKey, AssetKeyLength); char *sEntityTypeCode = Pke_New(strlen(entityTypeCode) + 1); strncpy(sEntityTypeCode, entityTypeCode, 31); -- cgit v1.2.3