diff --git a/SuperScriptMaterializer/SuperScriptMaterializer.def b/SuperScriptMaterializer/SuperScriptMaterializer.def index 04c09d8..9804125 100644 --- a/SuperScriptMaterializer/SuperScriptMaterializer.def +++ b/SuperScriptMaterializer/SuperScriptMaterializer.def @@ -1,5 +1,4 @@ LIBRARY "SuperScriptMaterializer" -DESCRIPTION 'Fuck Virtools' EXPORTS GetVirtoolsPluginInfoCount diff --git a/SuperScriptMaterializer/SuperScriptMaterializer.vcxproj b/SuperScriptMaterializer/SuperScriptMaterializer.vcxproj index 6244eab..05c798f 100644 --- a/SuperScriptMaterializer/SuperScriptMaterializer.vcxproj +++ b/SuperScriptMaterializer/SuperScriptMaterializer.vcxproj @@ -114,8 +114,9 @@ - + + diff --git a/SuperScriptMaterializer/SuperScriptMaterializer.vcxproj.filters b/SuperScriptMaterializer/SuperScriptMaterializer.vcxproj.filters index 5c2d901..40f1228 100644 --- a/SuperScriptMaterializer/SuperScriptMaterializer.vcxproj.filters +++ b/SuperScriptMaterializer/SuperScriptMaterializer.vcxproj.filters @@ -30,7 +30,7 @@ 头文件 - + 头文件 @@ -39,6 +39,9 @@ 头文件 + + 头文件 + diff --git a/SuperScriptMaterializer/database.cpp b/SuperScriptMaterializer/database.cpp index 6952c06..692d80d 100644 --- a/SuperScriptMaterializer/database.cpp +++ b/SuperScriptMaterializer/database.cpp @@ -84,14 +84,23 @@ namespace SSMaterializer { // append new one mStmtCache.push_back(stmt); + return stmt; + } + + BOOL SSMaterializerDatabase::Init() { + return TRUE; + } + + BOOL SSMaterializerDatabase::Finalize() { + return TRUE; } #pragma endregion -#pragma region sub-database constructor and deconstructor +#pragma region sub-database constructor, deconstructor and help functions DocumentDatabase::DocumentDatabase(const char* file, CKParameterManager* paramManager) : - SSMaterializerDatabase(file), m_pAttrUniqueEnsurance(), mDbHelper(paramManager) { + SSMaterializerDatabase(file), mUniqueAttr(), mUniqueObj(), mDbHelper(paramManager) { ; } @@ -108,6 +117,30 @@ namespace SSMaterializer { ; } + BOOL DocumentDatabase::is_attr_duplicated(DataStruct::EXPAND_CK_ID parents) { + // check duplication + if (mUniqueAttr.find(parents) != mUniqueAttr.end()) { + //existing item. skip it to make sure unique + return TRUE; + } else { + //add this item + mUniqueAttr.insert(parents); + return FALSE; + } + } + + BOOL DocumentDatabase::is_obj_duplicated(DataStruct::EXPAND_CK_ID parents) { + // check duplication + if (mUniqueObj.find(parents) != mUniqueObj.end()) { + //existing item. skip it to make sure unique + return TRUE; + } else { + //add this item + mUniqueObj.insert(parents); + return FALSE; + } + } + #pragma endregion #pragma region table, index creation functions @@ -116,6 +149,9 @@ namespace SSMaterializer { if (result != SQLITE_OK) { return FALSE; } BOOL DocumentDatabase::Init() { + // execute parent first + if (!SSMaterializerDatabase::Init()) return FALSE; + int result; //Init table @@ -149,6 +185,9 @@ if (result != SQLITE_OK) { return FALSE; } } BOOL DocumentDatabase::Finalize() { + // execute parent first + if (!SSMaterializerDatabase::Finalize()) return FALSE; + //create index for quick select in SuperScriptDecorator int result; @@ -165,14 +204,16 @@ if (result != SQLITE_OK) { return FALSE; } SafeSqlExec("CREATE INDEX [quick_where10] ON [script_bLink] ([parent])"); SafeSqlExec("CREATE INDEX [quick_where11] ON [script_elink] ([parent])"); SafeSqlExec("CREATE INDEX [quick_where12] ON [script_pAttr] ([thisobj])"); - SafeSqlExec("CREATE INDEX [quick_where13] ON [array_cell] ([parent])"); - SafeSqlExec("CREATE INDEX [quick_where14] ON [data] ([parent])"); + SafeSqlExec("CREATE INDEX [quick_where13] ON [data] ([parent])"); SafeSqlExec("commit;"); return TRUE; } BOOL EnvironmentDatabase::Init() { + // execute parent first + if (!SSMaterializerDatabase::Init()) return FALSE; + int result; //init table @@ -190,6 +231,9 @@ if (result != SQLITE_OK) { return FALSE; } } BOOL EnvironmentDatabase::Finalize() { + // execute parent first + if (!SSMaterializerDatabase::Finalize()) return FALSE; + return TRUE; } @@ -393,18 +437,7 @@ if (stmt == NULL) { \ sqlite3_step(stmt); } - void DocumentDatabase::write_script_pAttr(DataStruct::dbdoc_script_pAttr& data, BOOL* already_exist) { - // check duplication first - if (m_pAttrUniqueEnsurance.find(data.thisobj) != m_pAttrUniqueEnsurance.end()) { - //existing item. skip it to make sure unique - *already_exist = TRUE; - return; - } else { - //add this item - m_pAttrUniqueEnsurance.insert(data.thisobj); - *already_exist = FALSE; - } - + void DocumentDatabase::write_script_pAttr(DataStruct::dbdoc_script_pAttr& data) { // then check database validation if (mDb == NULL) return; diff --git a/SuperScriptMaterializer/database.hpp b/SuperScriptMaterializer/database.hpp index 89a6502..8edc670 100644 --- a/SuperScriptMaterializer/database.hpp +++ b/SuperScriptMaterializer/database.hpp @@ -311,8 +311,8 @@ namespace SSMaterializer { protected: sqlite3_stmt* CreateStmt(const char* stmt); - virtual BOOL Init() = 0; - virtual BOOL Finalize() = 0; + virtual BOOL Init(); + virtual BOOL Finalize(); sqlite3* mDb; std::vector mStmtCache; @@ -336,7 +336,7 @@ namespace SSMaterializer { void write_script_pLink(DataStruct::dbdoc_script_pLink& data); void write_script_pOper(DataStruct::dbdoc_script_pOper& data); void write_script_eLink(DataStruct::dbdoc_script_eLink& data); - void write_script_pAttr(DataStruct::dbdoc_script_pAttr& data, BOOL* already_exist); + void write_script_pAttr(DataStruct::dbdoc_script_pAttr& data); void write_msg(DataStruct::dbdoc_msg& data); @@ -346,11 +346,15 @@ namespace SSMaterializer { void write_data(DataStruct::dbdoc_data& data); + BOOL is_attr_duplicated(DataStruct::EXPAND_CK_ID parents); + BOOL is_obj_duplicated(DataStruct::EXPAND_CK_ID parents); + protected: BOOL Init() override; BOOL Finalize() override; - std::set m_pAttrUniqueEnsurance; + std::set mUniqueAttr; + std::set mUniqueObj; }; class EnvironmentDatabase : public SSMaterializerDatabase { diff --git a/SuperScriptMaterializer/doc_export.cpp b/SuperScriptMaterializer/doc_export.cpp index 51fd8bb..7833bce 100644 --- a/SuperScriptMaterializer/doc_export.cpp +++ b/SuperScriptMaterializer/doc_export.cpp @@ -337,21 +337,23 @@ namespace SSMaterializer { * we need check possible duplication here. */ void Proc_pAttr(CKContext* ctx, Database::DocumentDatabase* mDb, CKParameter* cache) { + // check duplication + if (mDb->is_attr_duplicated(cache->GetID())) return; + // write self first to detect conflict mDb->mDbHelper.script_pAttr.thisobj = cache->GetID(); CopyCKString(mDb->mDbHelper.script_pAttr.name, cache->GetName()); CopyCKParamTypeStr(mDb->mDbHelper.script_pAttr.type, cache->GetType(), mDb->mDbHelper.param_manager); CopyGuid(mDb->mDbHelper.script_pAttr.type_guid, cache->GetGUID()); - BOOL already_exist = FALSE; - mDb->write_script_pAttr(mDb->mDbHelper.script_pAttr, &already_exist); - if (!already_exist) { - // not duplicated, continue write some properties to indicate the host of this attribute - CKObject* host = cache->GetOwner(); - DataDictWritter("attr.host_id", (long)host->GetID(), mDb, cache->GetID()); - DataDictWritter("attr.host_name", host->GetName(), mDb, cache->GetID()); - } + mDb->write_script_pAttr(mDb->mDbHelper.script_pAttr); + // continue write some properties to indicate the host of this attribute + CKObject* host = cache->GetOwner(); + // write owner id + DataDictWritter("attr.owner", (long)host->GetID(), mDb, cache->GetID()); + // write data for owner + DigObjectData(host, mDb, host->GetID()); } void Proc_Behavior(CKContext* ctx, CKBehavior* bhv, Database::DocumentDatabase* mDb, DataStruct::EXPAND_CK_ID parents) { @@ -506,8 +508,8 @@ namespace SSMaterializer { mDb->mDbHelper.array_cell.column = col; mDb->mDbHelper.array_cell.row = row; mDb->mDbHelper.array_cell.parent = parents; - - Utils::StdstringPrintf(mDb->mDbHelper.array_cell.showcase, "%d", &((int*)cache->GetElement(row, col))); + + Utils::StdstringPrintf(mDb->mDbHelper.array_cell.showcase, "%d", *((int*)cache->GetElement(row, col))); mDb->mDbHelper.array_cell.inner_param = -1; mDb->write_array_cell(mDb->mDbHelper.array_cell); @@ -519,7 +521,7 @@ namespace SSMaterializer { mDb->mDbHelper.array_cell.row = row; mDb->mDbHelper.array_cell.parent = parents; - Utils::StdstringPrintf(mDb->mDbHelper.array_cell.showcase, "%f", &((float*)cache->GetElement(row, col))); + Utils::StdstringPrintf(mDb->mDbHelper.array_cell.showcase, "%f", *((float*)cache->GetElement(row, col))); mDb->mDbHelper.array_cell.inner_param = -1; mDb->write_array_cell(mDb->mDbHelper.array_cell); @@ -585,13 +587,21 @@ namespace SSMaterializer { #pragma region data process void DigObjectData(CKObject* o, Database::DocumentDatabase* mDb, DataStruct::EXPAND_CK_ID parents) { + // check duplication + // we use `parents` not o->GetID() because in some call they are not equal. + if (mDb->is_obj_duplicated(parents)) return; + DataDictWritter("obj.id", (long)o->GetID(), mDb, parents); + DataDictWritter("obj.name", o->GetName() ? o->GetName() : "", mDb, parents); + DataDictWritter("obj.classid", (long)o->GetClassID(), mDb, parents); + DataDictWritter("obj.type", o->GetClassNameA(), mDb, parents); } void DigParameterData(CKParameter* p, Database::DocumentDatabase* mDb, DataStruct::EXPAND_CK_ID parents) { + // due to our algorithm, parameter can not be duplicated + // so we don't need to check its duplication. CKGUID t = p->GetGUID(); CKParameterType pt = p->GetType(); - BOOL unknowType = FALSE; // export guid and type name corresponding with guid static std::string str_guid; @@ -601,15 +611,13 @@ namespace SSMaterializer { CopyCKParamTypeStr(str_typename, pt, mDb->mDbHelper.param_manager); DataDictWritter("typename", str_typename.c_str(), mDb, parents); - if (!(t.d1 & t.d2)) unknowType = TRUE; - // value object if (p->GetParameterClassID() && p->GetValueObject(false)) { CKObject* vobj = p->GetValueObject(false); - DataDictWritter("vobj.id", (long)vobj->GetID(), mDb, parents); - DataDictWritter("vobj.name", vobj->GetName() ? vobj->GetName() : "", mDb, parents); - DataDictWritter("vobj.classid", (long)vobj->GetClassID(), mDb, parents); - DataDictWritter("vobj.type", vobj->GetClassNameA(), mDb, parents); + // write its id + DataDictWritter("vobj", (long)vobj->GetID(), mDb, parents); + // write more data for its id + DigObjectData(vobj, mDb, vobj->GetID()); return; } @@ -656,7 +664,6 @@ namespace SSMaterializer { } if (t == CKPGUID_MATRIX) { VxMatrix mat; - char position[128]; memcpy(&mat, p->GetReadDataPtr(false), sizeof(mat)); static std::string str_matrix; @@ -738,10 +745,9 @@ namespace SSMaterializer { return; } - unknowType = TRUE; //if it gets here, we have no idea what it really is. so simply dump it. //buffer-like - if (unknowType || t == CKPGUID_VOIDBUF + if (t == CKPGUID_VOIDBUF #if defined(VIRTOOLS_50) || defined(VIRTOOLS_40) || defined(VIRTOOLS_35) || t == CKPGUID_SHADER || t == CKPGUID_TECHNIQUE || t == CKPGUID_PASS #endif diff --git a/SuperScriptMaterializer/main.cpp b/SuperScriptMaterializer/main.cpp index dfc5ff3..26d91dc 100644 --- a/SuperScriptMaterializer/main.cpp +++ b/SuperScriptMaterializer/main.cpp @@ -1,6 +1,6 @@ #include "stdafx.h" -#include "vt_menu.h" -#include "vt_player.h" +#include "vt_menu.hpp" +#include "vt_player.hpp" #if defined(VIRTOOLS_PLUGIN) PluginInterface* s_Plugininterface = NULL; @@ -29,7 +29,7 @@ SuperScriptMaterializer theApp; BOOL SuperScriptMaterializer::InitInstance() { CWinApp::InitInstance(); - strcpy(g_PluginInfo0.m_Name, "Super Script Materializer"); + strcpy(g_PluginInfo0.m_Name, "SSMaterializer"); g_PluginInfo0.m_PluginType = PluginInfo::PT_EDITOR; g_PluginInfo0.m_PluginType = (PluginInfo::PLUGIN_TYPE)(g_PluginInfo0.m_PluginType | PluginInfo::PTF_RECEIVENOTIFICATION); g_PluginInfo0.m_PluginCallback = PluginCallback; diff --git a/SuperScriptMaterializer/stdafx.h b/SuperScriptMaterializer/stdafx.h index c2e5d17..ce4135f 100644 --- a/SuperScriptMaterializer/stdafx.h +++ b/SuperScriptMaterializer/stdafx.h @@ -4,6 +4,8 @@ // #pragma once +#define _WIN32_WINNT 0x0A00 + #define VC_EXTRALEAN // Exclude rarely-used stuff from Windows headers #include // MFC core and standard components diff --git a/SuperScriptMaterializer/virtools_compatible.cpp b/SuperScriptMaterializer/virtools_compatible.cpp index 7c0d55a..38d68e5 100644 --- a/SuperScriptMaterializer/virtools_compatible.cpp +++ b/SuperScriptMaterializer/virtools_compatible.cpp @@ -1,4 +1,4 @@ -#include "virtools_compatible.h" +#include "virtools_compatible.hpp" #if defined(VIRTOOLS_50) && defined(VIRTOOLS_STANDALONE) diff --git a/SuperScriptMaterializer/vt_menu.cpp b/SuperScriptMaterializer/vt_menu.cpp index 4e2cacf..a80433c 100644 --- a/SuperScriptMaterializer/vt_menu.cpp +++ b/SuperScriptMaterializer/vt_menu.cpp @@ -1,7 +1,7 @@ -#include "vt_menu.h" -#include "database.h" -#include "script_export.h" -#include "env_export.h" +#include "vt_menu.hpp" +#include "database.hpp" +#include "doc_export.hpp" +#include "env_export.hpp" #if defined(VIRTOOLS_PLUGIN) @@ -34,7 +34,7 @@ void InitMenu() { if (!s_Plugininterface) return; - s_MainMenu = s_Plugininterface->AddPluginMenu("Super Script Materializer", 20, NULL, (VoidFunc1Param)PluginMenuCallback); + s_MainMenu = s_Plugininterface->AddPluginMenu("SSMaterializer", 20, NULL, (VoidFunc1Param)PluginMenuCallback); } void RemoveMenu() { @@ -47,23 +47,12 @@ void RemoveMenu() { void UpdateMenu() { s_Plugininterface->ClearPluginMenu(s_MainMenu); //clear menu - s_Plugininterface->AddPluginMenuItem(s_MainMenu, 0, "Export all scripts"); + s_Plugininterface->AddPluginMenuItem(s_MainMenu, 0, "Export document"); s_Plugininterface->AddPluginMenuItem(s_MainMenu, 1, "Export environment"); s_Plugininterface->AddPluginMenuItem(s_MainMenu, -1, NULL, TRUE); s_Plugininterface->AddPluginMenuItem(s_MainMenu, 2, "Report bug"); s_Plugininterface->AddPluginMenuItem(s_MainMenu, 3, "Plugin homepage"); - //===========================freeze chirs241097 code for future expand - //s_Plugininterface->AddPluginMenuItem(s_MainMenu, -1, NULL, TRUE); - - ////note : sub menu must have independent command ids that must be >=0 - //CMenu* sub0 = s_Plugininterface->AddPluginMenuItem(s_MainMenu, 0, "Fsck /dev/sdb", FALSE, TRUE);//bb manipulation - - //s_Plugininterface->AddPluginMenuItem(sub0, 1, "Fsck /dev/sdb1");//modify bb proto - //s_Plugininterface->AddPluginMenuItem(sub0, 2, "Fsck /dev/sdb2");//not implemented - - //s_Plugininterface->AddPluginMenuItem(s_MainMenu, -1, NULL, TRUE); - //s_Plugininterface->AddPluginMenuItem(s_MainMenu, 10, "Exit Fsck"); s_Plugininterface->UpdatePluginMenu(s_MainMenu); //update menu,always needed when you finished to update the menu //unless you want the menu not to have Virtools Dev main menu color scheme. @@ -88,21 +77,18 @@ void PluginMenuCallback(int commandID) { DeleteFile(file.c_str()); //Init resources - DocumentDatabase* _db = new DocumentDatabase(); - dbDocDataStructHelper* _helper = new dbDocDataStructHelper(); - _db->Open(file.c_str()); - _helper->Init(ctx->GetParameterManager()); + SSMaterializer::Database::DocumentDatabase* db = + new SSMaterializer::Database::DocumentDatabase(file.c_str(), ctx->GetParameterManager()); //iterate item - IterateScript(ctx, _db, _helper); + SSMaterializer::DocumentExporter::IterateScript(ctx, db); + SSMaterializer::DocumentExporter::IterateMessage(ctx, db); + SSMaterializer::DocumentExporter::IterateArray(ctx, db); //Close all resources - _helper->dispose(); - _db->Close(); - delete _helper; - delete _db; + delete db; - ctx->OutputToConsole("[Super Script Materializer] Done"); + ctx->OutputToConsole("[SSMaterializer] Done"); } break; case 1: @@ -115,28 +101,22 @@ void PluginMenuCallback(int commandID) { DeleteFile(file.c_str()); //Init - EnvironmentDatabase* _db = new EnvironmentDatabase(); - dbEnvDataStructHelper* _helper = new dbEnvDataStructHelper(); - _db->Open(file.c_str()); - _helper->Init(); + SSMaterializer::Database::EnvironmentDatabase* db = + new SSMaterializer::Database::EnvironmentDatabase(file.c_str()); //iterate parameter operation/param - IterateParameterOperation(ctx->GetParameterManager(), _db, _helper); - IterateParameter(ctx->GetParameterManager(), _db, _helper); - IterateMessage(ctx->GetMessageManager(), _db, _helper); - IterateAttribute(ctx->GetAttributeManager(), _db, _helper); - IteratePlugin(CKGetPluginManager(), _db, _helper); + SSMaterializer::EnvironmentExporter::IterateParameterOperation(ctx->GetParameterManager(), db); + SSMaterializer::EnvironmentExporter::IterateParameter(ctx->GetParameterManager(), db); + SSMaterializer::EnvironmentExporter::IterateAttribute(ctx->GetAttributeManager(), db); + SSMaterializer::EnvironmentExporter::IteratePlugin(CKGetPluginManager(), db); #if !defined(VIRTOOLS_21) - IterateVariable(ctx->GetVariableManager(), _db, _helper); + SSMaterializer::EnvironmentExporter::IterateVariable(ctx->GetVariableManager(), db); #endif //release all - _helper->dispose(); - _db->Close(); - delete _helper; - delete _db; + delete db; - ctx->OutputToConsole("[Super Script Materializer] Done"); + ctx->OutputToConsole("[SSMaterializer] Done"); } break; case 2: diff --git a/SuperScriptMaterializer/vt_menu.h b/SuperScriptMaterializer/vt_menu.hpp similarity index 73% rename from SuperScriptMaterializer/vt_menu.h rename to SuperScriptMaterializer/vt_menu.hpp index 74cff14..3d8bd43 100644 --- a/SuperScriptMaterializer/vt_menu.h +++ b/SuperScriptMaterializer/vt_menu.hpp @@ -1,9 +1,8 @@ -#if !defined(_YYCDLL_VT_MENU_H__IMPORTED_) -#define _YYCDLL_VT_MENU_H__IMPORTED_ +#pragma once #if defined(VIRTOOLS_PLUGIN) #include "stdafx.h" -#include "database.h" +#include "database.hpp" void PluginCallback(PluginInfo::CALLBACK_REASON reason, PluginInterface* plugininterface); @@ -14,5 +13,3 @@ void PluginMenuCallback(int commandID); BOOL OpenFileDialog(std::string* returned_file); #endif - -#endif \ No newline at end of file diff --git a/SuperScriptMaterializer/vt_player.cpp b/SuperScriptMaterializer/vt_player.cpp index aece227..89eb149 100644 --- a/SuperScriptMaterializer/vt_player.cpp +++ b/SuperScriptMaterializer/vt_player.cpp @@ -1,6 +1,6 @@ -#include "vt_player.h" -#include "script_export.h" -#include "env_export.h" +#include "vt_player.hpp" +#include "doc_export.hpp" +#include "env_export.hpp" #if defined(VIRTOOLS_STANDALONE) diff --git a/SuperScriptMaterializer/vt_player.h b/SuperScriptMaterializer/vt_player.hpp similarity index 66% rename from SuperScriptMaterializer/vt_player.h rename to SuperScriptMaterializer/vt_player.hpp index 76a5ddb..7589036 100644 --- a/SuperScriptMaterializer/vt_player.h +++ b/SuperScriptMaterializer/vt_player.hpp @@ -1,13 +1,10 @@ -#if !defined(_YYCDLL_VT_PLAYER_H__IMPORTED_) -#define _YYCDLL_VT_PLAYER_H__IMPORTED_ +#pragma once #if defined(VIRTOOLS_STANDALONE) #include "stdafx.h" -#include "database.h" +#include "database.hpp" void PlayerMain(const char* virtools_composition, const char* script_db_path, const char* env_db_path); void CommonAssert(BOOL condition, const char* desc); #endif - -#endif \ No newline at end of file