Skip to content

Commit

Permalink
Fix Package/UObject compile error
Browse files Browse the repository at this point in the history
  • Loading branch information
dpjudas committed Jul 2, 2024
1 parent 5851c11 commit 9a3d835
Show file tree
Hide file tree
Showing 3 changed files with 69 additions and 64 deletions.
2 changes: 1 addition & 1 deletion SurrealEngine/Editor/Export.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -340,7 +340,7 @@ MemoryStreamWriter Exporter::ExportBmpIndexed(UTexture* tex)
data << bgra;
}

hdr.pixelOffset = data.Tell();
hdr.pixelOffset = (uint32_t)data.Tell();

uint8_t *pixels = tex->Mipmaps[0].Data.data();
for (int y = vsize; y > 0; y--)
Expand Down
100 changes: 37 additions & 63 deletions SurrealEngine/Package/Package.h
Original file line number Diff line number Diff line change
Expand Up @@ -63,75 +63,15 @@ class Package

std::string GetExportName(int objref);

template<class T> std::vector<T*> GetAllObjects()
{
std::vector<T*> objects;
int objref = 1;
for (ExportTableEntry& e : ExportTable)
{
std::string className;
if (e.ObjClass < 0)
{
className = GetName(GetImportEntry(e.ObjClass)->ObjName).ToString();
}
else if (e.ObjClass != 0)
{
className = GetName(GetExportEntry(e.ObjClass)->ObjName).ToString();
}

// ignore "Groups", they're not real objects
if (className.compare("Package") != 0)
{
T* obj = UObject::TryCast<T>(GetUObject(objref));
if (obj)
{
objects.push_back(obj);
}
}
objref++;
}
return objects;
}
template<class T> std::vector<T*> GetAllObjects();

private:
void ReadTables();
std::unique_ptr<ObjectStream> OpenObjectStream(int index, const NameString& name, UClass* base);
void LoadExportObject(int index);

template<typename T>
void RegisterNativeClass(bool registerInPackage, const NameString& className, const NameString& baseClass = {})
{
NativeClasses[className] = [](const NameString& name, UClass* cls, ObjectFlags flags) -> UObject*
{
return new T(name, cls, flags);
};

if (registerInPackage)
{
int objref = FindObjectReference("Class", className);
if (objref == 0)
{
if (NameHash.find(className) == NameHash.end())
{
NameTableEntry nameentry;
nameentry.Flags = 0;
nameentry.Name = className;
NameTable.push_back(nameentry);
NameHash[className] = (int)NameTable.size() - 1;
}

ExportTableEntry entry;
entry.ObjClass = 0;
entry.ObjBase = baseClass.IsNone() ? 0 : FindObjectReference("Class", baseClass);
entry.ObjPackage = 0;
entry.ObjName = NameHash[className];
entry.ObjFlags = ObjectFlags::Native;
entry.ObjSize = 0;
entry.ObjOffset = 0;
ExportTable.push_back(entry);
}
}
}
void RegisterNativeClass(bool registerInPackage, const NameString& className, const NameString& baseClass = {});

PackageManager* Packages = nullptr;
NameString Name;
Expand All @@ -156,9 +96,43 @@ class Package
friend class UObject;
};


inline ObjectFlags operator|(ObjectFlags a, ObjectFlags b) { return (ObjectFlags)((uint32_t)a | (uint32_t)b); }
inline ObjectFlags operator|=(ObjectFlags& a, ObjectFlags b) { a = (ObjectFlags)((uint32_t)a | (uint32_t)b); return a; }
inline ObjectFlags operator&(ObjectFlags a, ObjectFlags b) { return (ObjectFlags)((uint32_t)a & (uint32_t)b); }
inline bool AllFlags(ObjectFlags value, ObjectFlags flags) { return (value & flags) == flags; }
inline bool AnyFlags(ObjectFlags value, ObjectFlags flags) { return (uint32_t)(value & flags) != 0; }

template<typename T>
void Package::RegisterNativeClass(bool registerInPackage, const NameString& className, const NameString& baseClass)
{
NativeClasses[className] = [](const NameString& name, UClass* cls, ObjectFlags flags) -> UObject*
{
return new T(name, cls, flags);
};

if (registerInPackage)
{
int objref = FindObjectReference("Class", className);
if (objref == 0)
{
if (NameHash.find(className) == NameHash.end())
{
NameTableEntry nameentry;
nameentry.Flags = 0;
nameentry.Name = className;
NameTable.push_back(nameentry);
NameHash[className] = (int)NameTable.size() - 1;
}

ExportTableEntry entry;
entry.ObjClass = 0;
entry.ObjBase = baseClass.IsNone() ? 0 : FindObjectReference("Class", baseClass);
entry.ObjPackage = 0;
entry.ObjName = NameHash[className];
entry.ObjFlags = ObjectFlags::Native;
entry.ObjSize = 0;
entry.ObjOffset = 0;
ExportTable.push_back(entry);
}
}
}
31 changes: 31 additions & 0 deletions SurrealEngine/UObject/UObject.h
Original file line number Diff line number Diff line change
Expand Up @@ -308,3 +308,34 @@ T* ObjectStream::ReadObject()
// Same deal with above, but for non-MSVC compilers
template<> bool& UObject::Value(PropertyDataOffset offset) = delete; // Booleans must use BoolValue
#endif

template<class T>
std::vector<T*> Package::GetAllObjects()
{
std::vector<T*> objects;
int objref = 1;
for (ExportTableEntry& e : ExportTable)
{
std::string className;
if (e.ObjClass < 0)
{
className = GetName(GetImportEntry(e.ObjClass)->ObjName).ToString();
}
else if (e.ObjClass != 0)
{
className = GetName(GetExportEntry(e.ObjClass)->ObjName).ToString();
}

// ignore "Groups", they're not real objects
if (className.compare("Package") != 0)
{
T* obj = UObject::TryCast<T>(GetUObject(objref));
if (obj)
{
objects.push_back(obj);
}
}
objref++;
}
return objects;
}

0 comments on commit 9a3d835

Please sign in to comment.