Added: #1440 Initial tool to fix asset paths

--HG--
branch : build_pipeline_v3
hg/feature/build_pipeline_v3
kaetemi 13 years ago
parent dd50972c0c
commit 80e17db602

@ -1,6 +1,7 @@
SUBDIRS(
max
max_dump
max_rewrite_assets
plugin_library
plugin_nel
plugin_max

@ -222,13 +222,15 @@ void CClassDirectory3::build(uint16 version, uint filter)
// Parallel to CDllDirectory
void CClassDirectory3::disown()
{
CStorageContainer::disown();
m_ChunkCache.clear();
m_Entries.clear();
m_ClassIdToIndex.clear();
// Ownership goes back to m_Chunks
m_ChunksOwnsPointers = true;
// Disown child chunks
CStorageContainer::disown();
}
// Parallel to CDllDirectory

@ -221,13 +221,15 @@ void CDllDirectory::build(uint16 version, uint filter)
// Parallel to CClassDirectory3
void CDllDirectory::disown()
{
CStorageContainer::disown();
m_ChunkCache.clear();
m_Entries.clear();
m_InternalNameToIndex.clear();
// Ownership goes back to m_Chunks
m_ChunksOwnsPointers = true;
// Disown child chunks
CStorageContainer::disown();
}
// Parallel to CClassDirectory3

@ -59,7 +59,10 @@ CStorageStream::CStorageStream(GsfOutput *output) : NLMISC::IStream(false), m_In
CStorageStream::~CStorageStream()
{
if (m_Output)
{
gsf_output_seek(m_Output, 0, G_SEEK_END);
}
}
bool CStorageStream::seek(sint32 offset, NLMISC::IStream::TSeekOrigin origin) const
@ -131,9 +134,7 @@ void CStorageStream::serialBuffer(uint8 *buf, uint len)
{
if (!gsf_output_write(m_Output, len, buf))
{
#ifdef NL_DEBUG_STORAGE
nldebug("Cannot write to output, throw exception");
#endif
nlwarning("Cannot write %i bytes to output at pos %i, throw exception", len, getPos());
throw NLMISC::EStream();
}
}

@ -1173,7 +1173,7 @@ bitfield
01 00 00 00 05 00 00 00 02 00 00 00 00 00 00 00 01 00 00 00 04 00 00 00 03 00 00 00 21 00 01 00 01 00 01 00 00 00 03 00 00 00 00 00 00 00 03 00 00 00 // selected
01 00 00 00 05 00 00 00 02 00 00 00 00 00 00 00 01 00 00 00 04 00 00 00 03 00 00 00 21 00 00 00 01 00 01 00 00 00 03 00 00 00 00 00 00 00 03 00 00 00 // unselected - no difference
01 00 00 00 05 00 00 00 02 00 00 00 00 00 00 00 01 00 00 00 04 00 00 00 03 00 00 00 21 00 00 00 01 00 01 00 00 00 03 00 00 00 00 00 00 00 03 00 00 00 // unselected - no difference *** byte changed from 1 to 0 ???
01 00 00 00 05 00 00 00 02 00 00 00 00 00 00 00 01 00 00 00 04 00 00 00 03 00 00 00 29 00 01 00 01 00 04 00 01 00 00 00 03 00 00 00 00 00 00 00 03 00 00 00 // material id changed to '5', 08 00
01 00 00 00 05 00 00 00 02 00 00 00 00 00 00 00 01 00 00 00 04 00 00 00 03 00 00 00 29 00 01 00 01 00 04 00 01 00 00 00 03 00 00 00 00 00 00 00 03 00 00 00 // clear selection unselected -- no diff
01 00 00 00 05 00 00 00 02 00 00 00 00 00 00 00 01 00 00 00 04 00 00 00 03 00 00 00 29 00 01 00 01 00 04 00 01 00 00 00 03 00 00 00 00 00 00 00 03 00 00 00 // use subdiv -- no diff

@ -0,0 +1,172 @@
Scene Graph
Version R3
<ptr=0x0000000002563570> Root Node [8] {
0: <ptr=0x000000000274fc00> TR_HOF_civil01_armpad [0] {
Object: <ptr=0x000000000272a560> OSM Derived }
1: <ptr=0x000000000277ed40> TR_HOF_civil01_gilet [0] {
Object: <ptr=0x0000000002765250> OSM Derived }
2: <ptr=0x00000000027aaa60> TR_HOF_Civil01_bottes [0] {
Object: <ptr=0x000000000278da90> OSM Derived }
3: <ptr=0x00000000027e4cc0> TR_HOF_civil01_pantabottes [0] {
Object: <ptr=0x00000000027c2900> OSM Derived }
4: <ptr=0x00000000027f29b0> Bip01 [3] {
Object: <ptr=0x00000000027f2710> Biped Object
0: <ptr=0x00000000027f37a0> Bip01 Footsteps [0] {
Object: <ptr=0x00000000027f3500> Biped Object }
1: <ptr=0x00000000027f4710> Bip01 Pelvis [3] {
Object: <ptr=0x00000000027f4470> Biped Object
0: <ptr=0x00000000027f5620> Bip01 Spine [1] {
Object: <ptr=0x00000000027f5380> Biped Object
0: <ptr=0x00000000027f6530> Bip01 Spine1 [1] {
Object: <ptr=0x00000000027f6290> Biped Object
0: <ptr=0x00000000027f7440> Bip01 Spine2 [1] {
Object: <ptr=0x00000000027f71a0> Biped Object
0: <ptr=0x00000000027f8350> Bip01 Neck [3] {
Object: <ptr=0x00000000027f80b0> Biped Object
0: <ptr=0x00000000027f9260> Bip01 Head [2] {
Object: <ptr=0x00000000027f8fc0> Biped Object
0: <ptr=0x00000000027fa1c0> Bip01 Head [0] {
Object: <ptr=0x00000000027f9ed0> Dummy }
1: <ptr=0x00000000027fb0d0> Bip01 hair1 [1] {
Object: <ptr=0x00000000027fae30> Biped Object
0: <ptr=0x00000000027fbfe0> Bip01 hair11 [1] {
Object: <ptr=0x00000000027fbd40> Biped Object
0: <ptr=0x00000000027fcf40> Bip01 hair1 [0] {
Object: <ptr=0x00000000027fcc50> Dummy } } } }
1: <ptr=0x00000000027fde50> Bip01 L Clavicle [1] {
Object: <ptr=0x00000000027fdbb0> Biped Object
0: <ptr=0x00000000027fed70> Bip01 L UpperArm [1] {
Object: <ptr=0x00000000027fead0> Biped Object
0: <ptr=0x00000000027ffc90> Bip01 L Forearm [2] {
Object: <ptr=0x00000000027ff9f0> Biped Object
0: <ptr=0x0000000002800ba0> Bip01 L Hand [6] {
Object: <ptr=0x0000000002800900> Biped Object
0: <ptr=0x0000000002801ab0> Bip01 L Finger0 [1] {
Object: <ptr=0x0000000002801810> Biped Object
0: <ptr=0x00000000028029c0> Bip01 L Finger01 [1] {
Object: <ptr=0x0000000002802720> Biped Object
0: <ptr=0x00000000028038e0> Bip01 L Finger02 [1] {
Object: <ptr=0x0000000002803640> Biped Object
0: <ptr=0x0000000002804850> Bip01 L Finger0 [0] {
Object: <ptr=0x0000000002804560> Dummy } } } }
1: <ptr=0x0000000002805760> Bip01 L Finger1 [1] {
Object: <ptr=0x00000000028054c0> Biped Object
0: <ptr=0x0000000002806670> Bip01 L Finger11 [1] {
Object: <ptr=0x00000000028063d0> Biped Object
0: <ptr=0x0000000002807590> Bip01 L Finger12 [1] {
Object: <ptr=0x00000000028072f0> Biped Object
0: <ptr=0x0000000002808500> Bip01 L Finger1 [0] {
Object: <ptr=0x0000000002808210> Dummy } } } }
2: <ptr=0x0000000002809410> Bip01 L Finger2 [1] {
Object: <ptr=0x0000000002809170> Biped Object
0: <ptr=0x000000000280a320> Bip01 L Finger21 [1] {
Object: <ptr=0x000000000280a080> Biped Object
0: <ptr=0x000000000280b240> Bip01 L Finger22 [1] {
Object: <ptr=0x000000000280afa0> Biped Object
0: <ptr=0x000000000280c1b0> Bip01 L Finger2 [0] {
Object: <ptr=0x000000000280bec0> Dummy } } } }
3: <ptr=0x000000000280d0c0> Bip01 L Finger3 [1] {
Object: <ptr=0x000000000280ce20> Biped Object
0: <ptr=0x000000000280dfd0> Bip01 L Finger31 [1] {
Object: <ptr=0x000000000280dd30> Biped Object
0: <ptr=0x000000000280eef0> Bip01 L Finger32 [1] {
Object: <ptr=0x000000000280ec50> Biped Object
0: <ptr=0x000000000280fe60> Bip01 L Finger3 [0] {
Object: <ptr=0x000000000280fb70> Dummy } } } }
4: <ptr=0x0000000002810d70> Bip01 L Finger4 [1] {
Object: <ptr=0x0000000002810ad0> Biped Object
0: <ptr=0x0000000002811c80> Bip01 L Finger41 [1] {
Object: <ptr=0x00000000028119e0> Biped Object
0: <ptr=0x0000000002812ba0> Bip01 L Finger42 [1] {
Object: <ptr=0x0000000002812900> Biped Object
0: <ptr=0x0000000002813b10> Bip01 L Finger4 [0] {
Object: <ptr=0x0000000002813820> Dummy } } } }
5: <ptr=0x0000000002816dc0> box_arme_gauche [0] {
Object: <ptr=0x00000000028155b0> Editable Mesh } }
1: <ptr=0x0000000002819ff0> Box_bouclier [0] {
Object: <ptr=0x00000000028188c0> Editable Mesh } } } }
2: <ptr=0x000000000281af60> Bip01 R Clavicle [1] {
Object: <ptr=0x000000000281acc0> Biped Object
0: <ptr=0x000000000281be80> Bip01 R UpperArm [1] {
Object: <ptr=0x000000000281bbe0> Biped Object
0: <ptr=0x000000000281cda0> Bip01 R Forearm [1] {
Object: <ptr=0x000000000281cb00> Biped Object
0: <ptr=0x000000000281dcb0> Bip01 R Hand [6] {
Object: <ptr=0x000000000281da10> Biped Object
0: <ptr=0x000000000281ebc0> Bip01 R Finger0 [1] {
Object: <ptr=0x000000000281e920> Biped Object
0: <ptr=0x000000000281fad0> Bip01 R Finger01 [1] {
Object: <ptr=0x000000000281f830> Biped Object
0: <ptr=0x00000000028209f0> Bip01 R Finger02 [1] {
Object: <ptr=0x0000000002820750> Biped Object
0: <ptr=0x0000000002821960> Bip01 R Finger0R [0] {
Object: <ptr=0x0000000002821670> Dummy } } } }
1: <ptr=0x0000000002822880> Bip01 R Finger1 [1] {
Object: <ptr=0x00000000028225e0> Biped Object
0: <ptr=0x0000000002823790> Bip01 R Finger11 [1] {
Object: <ptr=0x00000000028234f0> Biped Object
0: <ptr=0x00000000028246b0> Bip01 R Finger12 [1] {
Object: <ptr=0x0000000002824410> Biped Object
0: <ptr=0x0000000002825620> Bip01 R Finger1R [0] {
Object: <ptr=0x0000000002825330> Dummy } } } }
2: <ptr=0x0000000002826540> Bip01 R Finger2 [1] {
Object: <ptr=0x00000000028262a0> Biped Object
0: <ptr=0x0000000002827450> Bip01 R Finger21 [1] {
Object: <ptr=0x00000000028271b0> Biped Object
0: <ptr=0x0000000002828370> Bip01 R Finger22 [1] {
Object: <ptr=0x00000000028280d0> Biped Object
0: <ptr=0x00000000028292e0> Bip01 R Finger2R [0] {
Object: <ptr=0x0000000002828ff0> Dummy } } } }
3: <ptr=0x000000000282a200> Bip01 R Finger3 [1] {
Object: <ptr=0x0000000002829f60> Biped Object
0: <ptr=0x000000000282b110> Bip01 R Finger31 [1] {
Object: <ptr=0x000000000282ae70> Biped Object
0: <ptr=0x000000000282c030> Bip01 R Finger32 [1] {
Object: <ptr=0x000000000282bd90> Biped Object
0: <ptr=0x000000000282cfa0> Bip01 R Finger3R [0] {
Object: <ptr=0x000000000282ccb0> Dummy } } } }
4: <ptr=0x000000000282dec0> Bip01 R Finger4 [1] {
Object: <ptr=0x000000000282dc20> Biped Object
0: <ptr=0x000000000282edd0> Bip01 R Finger41 [1] {
Object: <ptr=0x000000000282eb30> Biped Object
0: <ptr=0x000000000282fcf0> Bip01 R Finger42 [1] {
Object: <ptr=0x000000000282fa50> Biped Object
0: <ptr=0x0000000002830c60> Bip01 R Finger4R [0] {
Object: <ptr=0x0000000002830970> Dummy } } } }
5: <ptr=0x0000000002833e40> box_arme [0] {
Object: <ptr=0x0000000002832710> Editable Mesh } } } } } } } } }
1: <ptr=0x0000000002834d50> Bip01 L Thigh [1] {
Object: <ptr=0x0000000002834ab0> Biped Object
0: <ptr=0x0000000002835c60> Bip01 L Calf [1] {
Object: <ptr=0x00000000028359c0> Biped Object
0: <ptr=0x0000000002836b70> Bip01 L Foot [1] {
Object: <ptr=0x00000000028368d0> Biped Object
0: <ptr=0x0000000002837a80> Bip01 L Toe0 [1] {
Object: <ptr=0x00000000028377e0> Biped Object
0: <ptr=0x00000000028389e0> Bip01 L Toe0 [0] {
Object: <ptr=0x00000000028386f0> Dummy } } } } }
2: <ptr=0x00000000028398f0> Bip01 R Thigh [1] {
Object: <ptr=0x0000000002839650> Biped Object
0: <ptr=0x000000000283a800> Bip01 R Calf [1] {
Object: <ptr=0x000000000283a560> Biped Object
0: <ptr=0x000000000283b770> Bip01 R Foot [1] {
Object: <ptr=0x000000000283b4d0> Biped Object
0: <ptr=0x000000000283c680> Bip01 R Toe0 [1] {
Object: <ptr=0x000000000283c3e0> Biped Object
0: <ptr=0x000000000283d5e0> Bip01 R Toe0 [0] {
Object: <ptr=0x000000000283d2f0> Dummy } } } } } }
2: <ptr=0x000000000283f190> name [0] {
Object: <ptr=0x000000000283eea0> Dummy } }
5: <ptr=0x0000000002a232a0> visage01 [0] {
Object: <ptr=0x00000000029ffaf0> OSM Derived }
6: <ptr=0x0000000002a51950> Object02 [0] {
Object: <ptr=0x0000000002a31c90> OSM Derived }
7: <ptr=0x0000000002c11910> TR_HOF_underwear_hand [0] {
Object: <ptr=0x0000000002bf4fa0> OSM Derived } }
------------------
(program exited with code: 0)
Press return to continue

@ -0,0 +1,36 @@
FIND_PACKAGE(LIBGSF)
IF (NOT (LIBGSF_INCLUDE_DIR AND LIBGSF_LIBRARIES))
MESSAGE(FATAL_ERROR "LIBGSF not found!")
ENDIF (NOT (LIBGSF_INCLUDE_DIR AND LIBGSF_LIBRARIES))
FIND_PACKAGE(GLIB2)
if (NOT GLIB2_FOUND)
MESSAGE(FATAL_ERROR "GLIB2 not found!")
ENDIF (NOT GLIB2_FOUND)
INCLUDE_DIRECTORIES(${GLIB2_INCLUDE_DIRS})
INCLUDE_DIRECTORIES(${LIBGSF_INCLUDE_DIR})
FILE(GLOB SRCS *.cpp)
FILE(GLOB HDRS *.h)
ADD_EXECUTABLE(pipeline_max_rewrite_assets
${SRCS}
${HDRS}
)
TARGET_LINK_LIBRARIES(pipeline_max_rewrite_assets
${LIBGSF_LIBRARIES}
${GLIB2_LIBRARIES}
pipeline_max
nelmisc
)
NL_DEFAULT_PROPS(pipeline_max_dump "NeL, Tools, Pipeline: Max Rewrite Assets")
NL_ADD_RUNTIME_FLAGS(pipeline_max_rewrite_assets)
INSTALL(TARGETS pipeline_max_rewrite_assets RUNTIME DESTINATION bin COMPONENT toolsmisc)

@ -0,0 +1,248 @@
#include <nel/misc/types_nl.h>
#include <nel/misc/common.h>
#include <gsf/gsf-outfile-msole.h>
#include <gsf/gsf-outfile.h>
#include <gsf/gsf-output-stdio.h>
#include <gsf/gsf-infile-msole.h>
#include <gsf/gsf-infile.h>
#include <gsf/gsf-input-stdio.h>
#include <gsf/gsf-utils.h>
#include <gsf/gsf-doc-meta-data.h>
#include <gsf/gsf-msole-utils.h>
#include <glib/gi18n.h>
#include <string.h>
#include <cstdio>
#include <iostream>
#include <fstream>
#include <vector>
#include <utility>
#include <nel/misc/file.h>
#include <nel/misc/vector.h>
#include "../max/storage_stream.h"
#include "../max/storage_object.h"
#include "../max/dll_directory.h"
#include "../max/class_directory_3.h"
#include "../max/class_data.h"
#include "../max/config.h"
#include "../max/scene.h"
#include "../max/scene_class_registry.h"
// Testing
#include "../max/builtin/builtin.h"
#include "../max/update1/update1.h"
#include "../max/epoly/epoly.h"
#include "../max/builtin/storage/app_data.h"
#include "../max/builtin/storage/geom_buffers.h"
#include "../max/builtin/scene_impl.h"
#include "../max/builtin/i_node.h"
#include "../max/update1/editable_mesh.h"
#include "../max/epoly/editable_poly.h"
using namespace PIPELINE::MAX;
using namespace PIPELINE::MAX::BUILTIN;
using namespace PIPELINE::MAX::BUILTIN::STORAGE;
using namespace PIPELINE::MAX::UPDATE1;
using namespace PIPELINE::MAX::EPOLY;
CSceneClassRegistry SceneClassRegistry;
bool DisplayStream = false;
bool WriteModified = false;
bool WriteDummy = true;
void serializeStorageContainer(PIPELINE::MAX::CStorageContainer *storageContainer, GsfInfile *infile, const char *streamName)
{
GsfInput *input = gsf_infile_child_by_name(infile, streamName);
if (!input)
{
nlerror("GSF Could not read stream %s", streamName);
return;
}
{
PIPELINE::MAX::CStorageStream instream(input);
storageContainer->serial(instream);
}
g_object_unref(input);
}
void serializeStorageContainer(PIPELINE::MAX::CStorageContainer *storageContainer, GsfOutfile *outfile, const char *streamName)
{
//nldebug("write");
GsfOutput *output = GSF_OUTPUT(gsf_outfile_new_child(outfile, streamName, false));
if (!output)
{
nlerror("GSF Could not write stream %s", streamName);
return;
}
{
PIPELINE::MAX::CStorageStream outstream(output);
storageContainer->serial(outstream);
}
gsf_output_close(output);
g_object_unref(G_OBJECT(output));
}
void serializeRaw(std::vector<uint8> &rawOutput, GsfInfile *infile, const char *streamName)
{
GsfInput *input = gsf_infile_child_by_name(infile, streamName);
if (!input)
{
nlerror("GSF Could not read stream %s", streamName);
return;
}
{
PIPELINE::MAX::CStorageStream instream(input);
rawOutput.resize(instream.size());
instream.serialBuffer(&rawOutput[0], rawOutput.size());
}
g_object_unref(input);
}
void serializeRaw(std::vector<uint8> &rawOutput, GsfOutfile *outfile, const char *streamName)
{
GsfOutput *output = GSF_OUTPUT(gsf_outfile_new_child(outfile, streamName, false));
if (!output)
{
nlerror("GSF Could not write stream %s", streamName);
return;
}
{
PIPELINE::MAX::CStorageStream outstream(output);
outstream.serialBuffer(&rawOutput[0], rawOutput.size());
}
gsf_output_close(output);
g_object_unref(G_OBJECT(output));
}
void handleFile(const std::string &path)
{
GError *err = NULL;
GsfDocMetaData *metadata = gsf_doc_meta_data_new();
nlassert(metadata);
GsfInput *src = gsf_input_stdio_new(path.c_str(), &err);
if (err) { nlerror("GSF Failed to open %s", path.c_str()); return; }
GsfInfile *infile = gsf_infile_msole_new(src, NULL);
if (!infile) { nlerror("GSF Failed to recognize %s", path.c_str()); return; }
g_object_unref(src);
uint8 classId[16];
if (!gsf_infile_msole_get_class_id((GsfInfileMSOle *)infile, classId))
nlerror("GSF Did not find classId");
PIPELINE::MAX::CStorageContainer videoPostQueue;
serializeStorageContainer(&videoPostQueue, infile, "VideoPostQueue");
PIPELINE::MAX::CStorageContainer config;
serializeStorageContainer(&config, infile, "Config");
PIPELINE::MAX::CStorageContainer classData;
serializeStorageContainer(&classData, infile, "ClassData");
std::vector<uint8> summaryInformation;
serializeRaw(summaryInformation, infile, "\05SummaryInformation");
std::vector<uint8> documentSummaryInformation;
serializeRaw(documentSummaryInformation, infile, "\05DocumentSummaryInformation"); // Can't read this, don't care.
PIPELINE::MAX::CDllDirectory dllDirectory;
serializeStorageContainer(&dllDirectory, infile, "DllDirectory");
dllDirectory.parse(VersionUnknown);
PIPELINE::MAX::CClassDirectory3 classDirectory3(&dllDirectory);
serializeStorageContainer(&classDirectory3, infile, "ClassDirectory3");
classDirectory3.parse(VersionUnknown);
PIPELINE::MAX::CScene scene(&SceneClassRegistry, &dllDirectory, &classDirectory3);
serializeStorageContainer(&scene, infile, "Scene");
/*
// Not parsing the scene for this function.
scene.parse(VersionUnknown);
scene.clean();
scene.build(VersionUnknown);
scene.disown();
*/
/*
PIPELINE::MAX::CStorageContainer dllDirectory;
serializeStorageContainer(&dllDirectory, infile, "DllDirectory");
PIPELINE::MAX::CStorageContainer classDirectory3;
serializeStorageContainer(&classDirectory3, infile, "ClassDirectory3");
PIPELINE::MAX::CStorageContainer scene;
serializeStorageContainer(&scene, infile, "Scene");
*/
if (DisplayStream)
{
videoPostQueue.toString(std::cout);
config.toString(std::cout);
classData.toString(std::cout);
dllDirectory.toString(std::cout);
classDirectory3.toString(std::cout);
scene.toString(std::cout);
}
g_object_unref(infile);
dllDirectory.disown();
classDirectory3.disown();
if (WriteModified)
{
const char *outpath = (WriteDummy ? "testdummy.max" : path.c_str());
GsfOutput *output;
GsfOutfile *outfile;
output = gsf_output_stdio_new(outpath, &err);
if (err) { nlerror("GSF Failed to create %s", outpath); return; }
outfile = gsf_outfile_msole_new(output);
g_object_unref(G_OBJECT(output));
serializeStorageContainer(&videoPostQueue, outfile, "VideoPostQueue");
serializeStorageContainer(&scene, outfile, "Scene");
serializeStorageContainer(&dllDirectory, outfile, "DllDirectory");
serializeStorageContainer(&config, outfile, "Config");
serializeStorageContainer(&classDirectory3, outfile, "ClassDirectory3");
serializeStorageContainer(&classData, outfile, "ClassData");
serializeRaw(summaryInformation, outfile, "\05SummaryInformation");
serializeRaw(documentSummaryInformation, outfile, "\05DocumentSummaryInformation");
if (!gsf_outfile_msole_set_class_id((GsfOutfileMSOle *)outfile, classId))
nlerror("GSF Cannot write class id");
gsf_output_close(GSF_OUTPUT(outfile));
g_object_unref(G_OBJECT(outfile));
}
g_object_unref(metadata);
}
// int __stdcall WinMain(void *, void *, void *, int)
int main(int argc, char **argv)
{
// Initialise gsf
printf("Pipeline Max Rewrite Assets\n");
char const *me = (argv[0] ? argv[0] : "pipeline_max_rewrite_assets");
g_set_prgname(me);
gsf_init();
// Register all plugin classes
CBuiltin::registerClasses(&SceneClassRegistry);
CUpdate1::registerClasses(&SceneClassRegistry);
CEPoly::registerClasses(&SceneClassRegistry);
handleFile("/srv/work/database/interfaces/anims_max/cp_fy_hof_species.max");
gsf_shutdown();
return 0;
}
Loading…
Cancel
Save