Skip to content
This repository has been archived by the owner on Feb 14, 2025. It is now read-only.

Commit

Permalink
Collisions: Batch import, minor fixes included
Browse files Browse the repository at this point in the history
  • Loading branch information
Greavesy1899 committed Aug 7, 2024
1 parent 3df7532 commit 3849ff1
Show file tree
Hide file tree
Showing 12 changed files with 147 additions and 75 deletions.
28 changes: 14 additions & 14 deletions M2FBX/M2FBX/Source/Fbx_Wrangler.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ bool Fbx_Wrangler::ConstructScene()
DocInfo->mTitle = "FBX Model";
DocInfo->mSubject = "FBX Created by M2FBX - Used by MafiaToolkit.";
DocInfo->mAuthor = "Greavesy";
DocInfo->mRevision = "rev. 0.50";
DocInfo->mRevision = "rev. 0.75";
DocInfo->mKeywords = "";
DocInfo->mComment = "";

Expand Down Expand Up @@ -131,11 +131,11 @@ bool Fbx_Wrangler::ConvertBundleToFbx()
return false;
}

const std::vector<MT_Object>& Objects = Bundle->GetObjects();
for (auto& Object : Objects)
const std::vector<MT_Object*>& Objects = Bundle->GetObjects();
for (const MT_Object* Object : Objects)
{
FbxNode* ObjectNode = nullptr;
ConvertObjectToNode(Object, ObjectNode);
ConvertObjectToNode(*Object, ObjectNode);
}

SaveDocument();
Expand All @@ -162,7 +162,7 @@ bool Fbx_Wrangler::ConvertObjectToNode(const MT_Object& Object, FbxNode*& RootNo
RootNode->LclScaling = { Transform.Scale.x, Transform.Scale.y , Transform.Scale.z };

FbxSkin* Skin = nullptr;
if (Object.HasObjectFlag(HasSkinning))
if (Object.HasObjectFlag(MT_ObjectFlags::HasSkinning))
{
const MT_Skeleton* Skeleton = Object.GetSkeleton();
Skin = FbxSkin::Create(SdkManager, "Skin");
Expand All @@ -171,40 +171,40 @@ bool Fbx_Wrangler::ConvertObjectToNode(const MT_Object& Object, FbxNode*& RootNo
RootNode->AddChild(Joint);
}

if (Object.HasObjectFlag(HasLODs))
if (Object.HasObjectFlag(MT_ObjectFlags::HasLODs))
{
const std::vector<MT_Lod>& ModelLods = Object.GetLods();
const std::vector<MT_Lod*>& ModelLods = Object.GetLods();
for (size_t i = 0; i < 1; i++)
{
// Setup name and get lod
std::string NodeName = "LOD";
NodeName += std::to_string(i);
const MT_Lod& Lod = ModelLods[i];
const MT_Lod* Lod = ModelLods[i];

// Create lod and convert to object
FbxNode* NewLodNode = FbxNode::Create(SdkManager, NodeName.data());
bool bResult = ConvertLodToNode(Lod, NewLodNode);
bool bResult = ConvertLodToNode(*Lod, NewLodNode);
RootNode->AddChild(NewLodNode);

if (Object.HasObjectFlag(HasSkinning))
{
bResult = ApplySkinToMesh(Lod, Skin, NewLodNode);
bResult = ApplySkinToMesh(*Lod, Skin, NewLodNode);
}

Logger->Printf(ELogType::eInfo, "Added LODIndex [%i]", i);
}
}

if (Object.HasObjectFlag(HasChildren))
if (Object.HasObjectFlag(MT_ObjectFlags::HasChildren))
{
const std::vector<MT_Object>& Children = Object.GetChildren();
const std::vector<MT_Object*>& Children = Object.GetChildren();
Logger->Printf(ELogType::eInfo, "Detected %i children for object [%s]", Children.size(), ObjectName.data());

for (size_t i = 0; i < Children.size(); i++)
{
// Convert Node
FbxNode* ChildNode = nullptr;
ConvertObjectToNode(Children[i], ChildNode);
ConvertObjectToNode(*Children[i], ChildNode);

// Add Child to the RootNode
if (ChildNode)
Expand All @@ -215,7 +215,7 @@ bool Fbx_Wrangler::ConvertObjectToNode(const MT_Object& Object, FbxNode*& RootNo
}
}

if (Object.HasObjectFlag(HasCollisions))
if (Object.HasObjectFlag(MT_ObjectFlags::HasCollisions))
{
if (const MT_Collision* Collision = Object.GetCollision())
{
Expand Down
63 changes: 49 additions & 14 deletions M2FBX/M2FBX/Source/MTObject/MT_Object.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,29 @@
#include "MT_Skeleton.h"
#include "Utilities/FileUtils.h"

MT_Object::~MT_Object()
{
for (MT_Lod* CurLod : LodObjects)
{
CurLod->Cleanup();

delete CurLod;
CurLod = nullptr;
}

LodObjects.clear();

for (MT_Object* CurObj : Children)
{
CurObj->Cleanup();

delete CurObj;
CurObj = nullptr;
}

Children.clear();
}

bool MT_Object::HasObjectFlag(const MT_ObjectFlags FlagToCheck) const
{
return (ObjectFlags & FlagToCheck);
Expand All @@ -21,17 +44,19 @@ void MT_Object::Cleanup()
ObjectName = "";

// Empty LodObjects
for (auto& LodObject : LodObjects)
for (MT_Lod* LodObject : LodObjects)
{
LodObject.Cleanup();
LodObject->Cleanup();
delete LodObject;
}

LodObjects.clear();

// Empty Children
for (auto& ChildObject : Children)
for (MT_Object* ChildObject : Children)
{
ChildObject.Cleanup();
ChildObject->Cleanup();
delete ChildObject;
}

Children.clear();
Expand All @@ -40,13 +65,15 @@ void MT_Object::Cleanup()
if (CollisionObject)
{
CollisionObject->Cleanup();
delete CollisionObject;
CollisionObject = nullptr;
}

// Cleanup Skeleton
if (SkeletonObject)
{
// TODO: Maybe do cleanup?
delete SkeletonObject;
SkeletonObject = nullptr;
}
}
Expand Down Expand Up @@ -79,8 +106,8 @@ bool MT_Object::ReadFromFile(FILE* InStream)
for (uint i = 0; i < NumLODs; i++)
{
// Begin to read LOD
MT_Lod LodObject = {};
LodObject.ReadFromFile(InStream);
MT_Lod* LodObject = new MT_Lod();
LodObject->ReadFromFile(InStream);
LodObjects[i] = LodObject;
}
}
Expand All @@ -95,8 +122,8 @@ bool MT_Object::ReadFromFile(FILE* InStream)

for (uint i = 0; i < NumChildren; i++)
{
MT_Object ChildObject = {};
ChildObject.ReadFromFile(InStream);
MT_Object* ChildObject = new MT_Object();
ChildObject->ReadFromFile(InStream);
Children[i] = ChildObject;
}
}
Expand Down Expand Up @@ -137,8 +164,8 @@ void MT_Object::WriteToFile(FILE* OutStream) const

for (int i = 0; i < LodObjects.size(); i++)
{
const MT_Lod& LodInfo = LodObjects[i];
LodInfo.WriteToFile(OutStream);
const MT_Lod* LodInfo = LodObjects[i];
LodInfo->WriteToFile(OutStream);
}
}

Expand All @@ -147,8 +174,8 @@ void MT_Object::WriteToFile(FILE* OutStream) const
FileUtils::Write(OutStream, (uint)Children.size());
for (size_t i = 0; i < Children.size(); i++)
{
const MT_Object& ChildObject = Children[i];
ChildObject.WriteToFile(OutStream);
const MT_Object* ChildObject = Children[i];
ChildObject->WriteToFile(OutStream);
}
}

Expand Down Expand Up @@ -176,10 +203,18 @@ bool MT_Object::ValidateHeader(const int Magic) const
return false;
}

MT_ObjectBundle::~MT_ObjectBundle()
{
Cleanup();
}

void MT_ObjectBundle::Cleanup()
{
for (auto& Object : Objects)
for (MT_Object* Object : Objects)
{
Object.Cleanup();
Object->Cleanup();
delete Object;
}

Objects.clear();
}
23 changes: 14 additions & 9 deletions M2FBX/M2FBX/Source/MTObject/MT_Object.h
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ enum MT_ObjectType : uint
Actor,
ItemDesc,
Dummy,
StaticCollision,
};

struct TransformStruct
Expand All @@ -43,6 +44,8 @@ class MT_Object

public:

virtual ~MT_Object();

bool HasObjectFlag(const MT_ObjectFlags FlagToCheck) const;
void AddObjectFlag(const MT_ObjectFlags FlagToAdd);
void Cleanup();
Expand All @@ -51,8 +54,8 @@ class MT_Object
const std::string& GetName() const { return ObjectName; }
const MT_ObjectFlags GetFlags() const { return ObjectFlags; }
const MT_ObjectType GetType() const { return ObjectType; }
const std::vector<MT_Object> GetChildren() const { return Children; }
const std::vector<MT_Lod> GetLods() const { return LodObjects; }
const std::vector<MT_Object*> GetChildren() const { return Children; }
const std::vector<MT_Lod*> GetLods() const { return LodObjects; }
const TransformStruct& GetTransform() const { return Transform; }
const MT_Collision* GetCollision() const { return CollisionObject; }
const MT_Skeleton* GetSkeleton() const { return SkeletonObject; }
Expand All @@ -64,7 +67,7 @@ class MT_Object
void SetTransform(TransformStruct& InTransform) { Transform = InTransform; }

// TODO: Move all these to cpp file
void SetLods(std::vector<MT_Lod> InLods)
void SetLods(const std::vector<MT_Lod*>& InLods)
{
LodObjects = InLods;
if (InLods.size() > 0)
Expand All @@ -88,7 +91,7 @@ class MT_Object
AddObjectFlag(MT_ObjectFlags::HasSkinning);
}
}
void SetChildren(std::vector<MT_Object> InChildren)
void SetChildren(const std::vector<MT_Object*>& InChildren)
{
Children = InChildren;
if (InChildren.size() > 0)
Expand All @@ -110,8 +113,8 @@ class MT_Object
MT_ObjectType ObjectType;
TransformStruct Transform;

std::vector<MT_Lod> LodObjects;
std::vector<MT_Object> Children;
std::vector<MT_Lod*> LodObjects;
std::vector<MT_Object*> Children;
MT_Collision* CollisionObject = nullptr;
MT_Skeleton* SkeletonObject = nullptr;
};
Expand All @@ -123,15 +126,17 @@ class MT_ObjectBundle

public:

virtual ~MT_ObjectBundle();

void Cleanup();

// Accessor
const std::vector<MT_Object>& GetObjects() const { return Objects; }
const std::vector<MT_Object*>& GetObjects() const { return Objects; }

// Setter
void SetObjects(std::vector<MT_Object> InObjects) { Objects = InObjects; }
void SetObjects(const std::vector<MT_Object*>& InObjects) { Objects = InObjects; }

private:

std::vector<MT_Object> Objects;
std::vector<MT_Object*> Objects;
};
6 changes: 3 additions & 3 deletions M2FBX/M2FBX/Source/MTObject/MT_ObjectHandler.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ MT_ObjectBundle* MT_ObjectHandler::ReadBundleFromFile(const std::string& FileNam
return nullptr;
}

BundleObject->Objects[i] = *NewObject;
BundleObject->Objects[i] = NewObject;
}

return BundleObject;
Expand All @@ -63,9 +63,9 @@ void MT_ObjectHandler::WriteBundleToFile(const std::string& FileName, const MT_O
FileUtils::Write(OutStream, (uint)Bundle.Objects.size());

// Write Objects
for (auto& Object : Bundle.Objects)
for (const MT_Object* Object : Bundle.Objects)
{
WriteObjectToFile(OutStream, Object);
WriteObjectToFile(OutStream, *Object);
}

fclose(OutStream);
Expand Down
21 changes: 15 additions & 6 deletions M2FBX/M2FBX/Source/MTObject/MT_ObjectUtils.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ namespace MT_ObjectUtils_Consts
const char* ConstMesh = "MESH";
const char* ConstRigged = "RIGD";
const char* ConstItemDesc = "ITEM";
const char* ConstStaticCol = "SCOL";
const char* ConstActor = "ACTR";
const char* ConstDummy = "DUMY";
const char* ConstJoint = "JOIT";
Expand Down Expand Up @@ -54,6 +55,10 @@ MT_ObjectType MT_ObjectUtils::GetTypeFromString(const FbxString ObjectName)
{
return MT_ObjectType::Joint;
}
else if (ObjectName.Find(MT_ObjectUtils_Consts::ConstStaticCol) != std::string::npos)
{
return MT_ObjectType::StaticCollision;
}
else if (ObjectName.Find(MT_ObjectUtils_Consts::ConstNull) != std::string::npos)
{
return MT_ObjectType::Null;
Expand All @@ -75,30 +80,34 @@ const char* MT_ObjectUtils::GetTypeAsString(const MT_ObjectType ObjectType)
{
switch (ObjectType)
{
case StaticMesh:
case MT_ObjectType::StaticMesh:
{
return MT_ObjectUtils_Consts::ConstMesh;
}
case RiggedMesh:
case MT_ObjectType::RiggedMesh:
{
return MT_ObjectUtils_Consts::ConstRigged;
}
case ItemDesc:
case MT_ObjectType::ItemDesc:
{
return MT_ObjectUtils_Consts::ConstItemDesc;
}
case Actor:
case MT_ObjectType::Actor:
{
return MT_ObjectUtils_Consts::ConstActor;
}
case Dummy:
case MT_ObjectType::Dummy:
{
return MT_ObjectUtils_Consts::ConstDummy;
}
case Joint:
case MT_ObjectType::Joint:
{
return MT_ObjectUtils_Consts::ConstJoint;
}
case MT_ObjectType::StaticCollision:
{
return MT_ObjectUtils_Consts::ConstStaticCol;
}
}

return MT_ObjectUtils_Consts::ConstNull;
Expand Down
Loading

0 comments on commit 3849ff1

Please sign in to comment.