void BinaryConverter::SaveMaterials(Serializer::Writer& wr, Model* model) { //Look for the .model definition and parse it //for material definitions const ModelDefinition &modelDef = FindModelDefinition(model->GetName()); wr.Int32(modelDef.matDefs.size()); for (const auto& m : modelDef.matDefs) { wr.String(m.name); wr.String(m.tex_diff); wr.String(m.tex_spec); wr.String(m.tex_glow); wr.String(m.tex_ambi); wr.String(m.tex_norm); wr.Color4UB(m.diffuse); wr.Color4UB(m.specular); wr.Color4UB(m.ambient); wr.Color4UB(m.emissive); wr.Int16(m.shininess); wr.Int16(m.opacity); wr.Bool(m.alpha_test); wr.Bool(m.unlit); wr.Bool(m.use_pattern); } }
void BinaryConverter::SaveAnimations(Serializer::Writer &wr, Model *m) { const auto& anims = m->GetAnimations(); wr.Int32(anims.size()); for (const auto& anim : anims) { wr.String(anim->GetName()); wr.Double(anim->GetDuration()); wr.Int32(anim->GetChannels().size()); for (const auto &chan : anim->GetChannels()) { wr.String(chan.node->GetName()); //write pos/rot/scale keys wr.Int32(chan.positionKeys.size()); for (const auto &pkey : chan.positionKeys) { wr.Double(pkey.time); wr.Vector3f(pkey.position); } wr.Int32(chan.rotationKeys.size()); for (const auto &rkey : chan.rotationKeys) { wr.Double(rkey.time); wr.WrQuaternionf(rkey.rotation); } wr.Int32(chan.scaleKeys.size()); for (const auto &skey : chan.scaleKeys) { wr.Double(skey.time); wr.Vector3f(skey.scale); } } } }
void SpaceStation::Save(Serializer::Writer &wr, Space *space) { ModelBody::Save(wr, space); MarketAgent::Save(wr); wr.Int32(Equip::TYPE_MAX); for (int i=0; i<Equip::TYPE_MAX; i++) { wr.Int32(int(m_equipmentStock[i])); } // save shipyard wr.Int32(m_shipsOnSale.size()); for (std::vector<ShipOnSale>::iterator i = m_shipsOnSale.begin(); i != m_shipsOnSale.end(); ++i) { wr.String((*i).id); wr.String((*i).regId); (*i).skin.Save(wr); } for (int i=0; i<MAX_DOCKING_PORTS; i++) { wr.Int32(space->GetIndexForBody(m_shipDocking[i].ship)); wr.Int32(m_shipDocking[i].stage); wr.Float(float(m_shipDocking[i].stagePos)); wr.Vector3d(m_shipDocking[i].fromPos); wr.WrQuaternionf(m_shipDocking[i].fromRot); } wr.Bool(m_dockingLock); wr.Bool(m_bbCreated); wr.Double(m_lastUpdatedShipyard); wr.Int32(space->GetIndexForSystemBody(m_sbody)); wr.Int32(m_numPoliceDocked); m_navLights->Save(wr); }
void ShipFlavour::Save(Serializer::Writer &wr) { wr.String(id); wr.Int32(price); wr.String(regid); SaveLmrMaterial(wr, &primaryColor); SaveLmrMaterial(wr, &secondaryColor); }
void ModelSkin::Save(Serializer::Writer &wr) const { for (unsigned int i = 0; i < 3; i++) { wr.Byte(m_colors[i].r); wr.Byte(m_colors[i].g); wr.Byte(m_colors[i].b); } for (unsigned int i = 0; i < MAX_DECAL_MATERIALS; i++) wr.String(m_decals[i]); wr.String(m_label); }
void Serialize(Serializer::Writer &wr) { for(std::list<std::string>::const_iterator i = s_modules.begin(); i!=s_modules.end(); ++i) { ModCall((*i).c_str(), "Serialize", 1); // string can have nulls in it so must get length std::string str; OOLUA::pull2cpp(L, str); wr.String(*i); wr.String(str); } wr.String(""); }
void Body::Save(Serializer::Writer &wr, Space *space) { wr.Int32(space->GetIndexForFrame(m_frame)); wr.String(m_label); wr.Bool(m_dead); wr.Bool(m_hasDoubleFrame); }
void SpaceStation::Save(Serializer::Writer &wr, Space *space) { ModelBody::Save(wr, space); MarketAgent::Save(wr); wr.Int32(Equip::TYPE_MAX); for (int i=0; i<Equip::TYPE_MAX; i++) { wr.Int32(int(m_equipmentStock[i])); } // save shipyard wr.Int32(m_shipsOnSale.size()); for (std::vector<ShipOnSale>::iterator i = m_shipsOnSale.begin(); i != m_shipsOnSale.end(); ++i) { wr.String((*i).id); wr.String((*i).regId); (*i).skin.Save(wr); } wr.Int32(m_shipDocking.size()); for (uint32_t i=0; i<m_shipDocking.size(); i++) { wr.Int32(space->GetIndexForBody(m_shipDocking[i].ship)); wr.Int32(m_shipDocking[i].stage); wr.Float(float(m_shipDocking[i].stagePos)); wr.Vector3d(m_shipDocking[i].fromPos); wr.WrQuaternionf(m_shipDocking[i].fromRot); } // store each of the bay groupings wr.Int32(mBayGroups.size()); for (uint32_t i=0; i<mBayGroups.size(); i++) { wr.Int32(mBayGroups[i].minShipSize); wr.Int32(mBayGroups[i].maxShipSize); wr.Bool(mBayGroups[i].inUse); wr.Int32(mBayGroups[i].bayIDs.size()); for (uint32_t j=0; j<mBayGroups[i].bayIDs.size(); j++) { wr.Int32(mBayGroups[i].bayIDs[j]); } } wr.Bool(m_bbCreated); wr.Double(m_lastUpdatedShipyard); wr.Int32(space->GetIndexForSystemBody(m_sbody)); wr.Int32(m_numPoliceDocked); wr.Double(m_doorAnimationStep); wr.Double(m_doorAnimationState); m_navLights->Save(wr); }
void ModelBody::Save(Serializer::Writer &wr, Space *space) { Body::Save(wr, space); wr.Bool(m_isStatic); wr.Bool(m_colliding); wr.String(m_modelName); m_model->Save(wr); }
void Body::Save(Serializer::Writer &wr) { wr.Int32(Serializer::LookupFrame(m_frame)); wr.String(m_label); wr.Bool(m_onscreen); wr.Vector3d(m_projectedPos); wr.Bool(m_dead); wr.Bool(m_hasDoubleFrame); }
void Body::Save(Serializer::Writer &wr, Space *space) { wr.Int32(space->GetIndexForFrame(m_frame)); wr.String(m_label); wr.Bool(m_dead); wr.Vector3d(m_pos); for (int i=0; i<9; i++) wr.Double(m_orient[i]); wr.Double(m_physRadius); wr.Double(m_clipRadius); }
void Shields::Save(Serializer::Writer &wr) { wr.Bool(m_enabled); wr.Int32(m_shields.size()); for (ShieldIterator it = m_shields.begin(); it != m_shields.end(); ++it) { wr.Byte(it->m_colour.r); wr.Byte(it->m_colour.g); wr.Byte(it->m_colour.b); wr.String(it->m_mesh->GetName()); } }
void Frame::Serialize(Serializer::Writer &wr, Frame *f, Space *space) { wr.Int32(f->m_flags); wr.Double(f->m_radius); wr.String(f->m_label); wr.Vector3d(f->m_pos); for (int i=0; i<9; i++) wr.Double(f->m_orient[i]); wr.Double(f->m_angSpeed); wr.Int32(space->GetIndexForSystemBody(f->m_sbody)); wr.Int32(space->GetIndexForBody(f->m_astroBody)); wr.Int32(f->m_children.size()); for (ChildIterator it = f->BeginChildren(); it != f->EndChildren(); ++it) Serialize(wr, *it, space); Sfx::Serialize(wr, f); }
void Frame::Serialize(Serializer::Writer &wr, Frame *f, Space *space) { wr.Int32(f->m_flags); wr.Double(f->m_radius); wr.String(f->m_label); wr.Vector3d(f->m_pos); wr.Double(f->m_angSpeed); for (int i=0; i<9; i++) wr.Double(f->m_initialOrient[i]); wr.Int32(space->GetIndexForSystemBody(f->m_sbody)); wr.Int32(space->GetIndexForBody(f->m_astroBody)); wr.Int32(f->m_children.size()); for (Frame* kid : f->GetChildren()) Serialize(wr, kid, space); Sfx::Serialize(wr, f); }
void LuaSerializer::Serialize(Serializer::Writer &wr) { lua_State *l = Lua::manager->GetLuaState(); LUA_DEBUG_START(l); lua_newtable(l); int savetable = lua_gettop(l); lua_getfield(l, LUA_REGISTRYINDEX, "PiSerializerCallbacks"); if (lua_isnil(l, -1)) { lua_pop(l, 1); lua_newtable(l); lua_pushvalue(l, -1); lua_setfield(l, LUA_REGISTRYINDEX, "PiSerializerCallbacks"); } lua_pushnil(l); while (lua_next(l, -2) != 0) { lua_pushinteger(l, 1); lua_gettable(l, -2); pi_lua_protected_call(l, 0, 1); lua_pushvalue(l, -3); lua_insert(l, -2); lua_settable(l, savetable); lua_pop(l, 1); } lua_pop(l, 1); lua_newtable(l); lua_setfield(l, LUA_REGISTRYINDEX, "PiSerializerTableRefs"); std::string pickled; pickle(l, savetable, pickled); wr.String(pickled); lua_pop(l, 1); lua_pushnil(l); lua_setfield(l, LUA_REGISTRYINDEX, "PiSerializerTableRefs"); LUA_DEBUG_END(l, 0); }
void BBAdvert::Save(Serializer::Writer &wr) { wr.String(m_luaMod); wr.Int32(m_luaRef); wr.String(m_description); }
void ShipFlavour::Save(Serializer::Writer &wr) { wr.String(id); wr.Int32(price); wr.String(regid); }
void BinaryConverter::Save(const std::string& filename, const std::string& savepath, Model* m, const bool bInPlace) { printf("Saving file (%s)\n", filename.c_str()); FILE *f = nullptr; FileSystem::FileSourceFS newFS(FileSystem::GetDataDir()); if (!bInPlace) { if (!FileSystem::userFiles.MakeDirectory(SAVE_TARGET_DIR)) throw CouldNotOpenFileException(); std::string newpath = savepath.substr(0, savepath.size()-filename.size()); size_t pos = newpath.find_first_of("/", 0); while(pos<savepath.size()-filename.size()) { newpath = savepath.substr(0, pos); pos = savepath.find_first_of("/", pos+1); if (!FileSystem::userFiles.MakeDirectory(FileSystem::JoinPathBelow(SAVE_TARGET_DIR,newpath))) throw CouldNotOpenFileException(); printf("Made directory (%s)\n", FileSystem::JoinPathBelow(SAVE_TARGET_DIR,newpath).c_str()); } f = FileSystem::userFiles.OpenWriteStream( FileSystem::JoinPathBelow(SAVE_TARGET_DIR, savepath + SGM_EXTENSION)); printf("Save file (%s)\n", FileSystem::JoinPathBelow(SAVE_TARGET_DIR, savepath + SGM_EXTENSION).c_str()); if (!f) throw CouldNotOpenFileException(); } else { f = newFS.OpenWriteStream(savepath + SGM_EXTENSION); if (!f) throw CouldNotOpenFileException(); } Serializer::Writer wr; wr.Int32(SGM_STRING_ID.value); wr.Int32(SGM_VERSION); wr.String(m->GetName().c_str()); SaveMaterials(wr, m); SaveHelperVisitor sv(&wr, m); m->GetRoot()->Accept(sv); m->GetCollisionMesh()->Save(wr); wr.Float(m->GetDrawClipRadius()); SaveAnimations(wr, m); //save tags wr.Int32(m->GetNumTags()); for (unsigned int i = 0; i < m->GetNumTags(); i++) wr.String(m->GetTagByIndex(i)->GetName().c_str()); // compress in memory, write to open file size_t outSize = 0; size_t nwritten = 0; const std::string& data = wr.GetData(); void *pCompressedData = tdefl_compress_mem_to_heap(data.data(), data.length(), &outSize, 128); if (pCompressedData) { nwritten = fwrite(pCompressedData, outSize, 1, f); mz_free(pCompressedData); } fclose(f); if (nwritten != 1) throw CouldNotWriteToFileException(); }
void Game::Serialize(Serializer::Writer &wr) { // preparing the lua serializer Pi::luaSerializer->InitTableRefs(); // leading signature for (Uint32 i = 0; i < strlen(s_saveStart)+1; i++) wr.Byte(s_saveStart[i]); // version wr.Int32(s_saveVersion); Serializer::Writer section; // galaxy generator section.String(Pi::GetGalaxy()->GetGeneratorName()); section.Int32(Pi::GetGalaxy()->GetGeneratorVersion()); wr.WrSection("GalaxyGen", section.GetData()); // game state section = Serializer::Writer(); section.Double(m_time); section.Int32(Uint32(m_state)); section.Bool(m_wantHyperspace); section.Double(m_hyperspaceProgress); section.Double(m_hyperspaceDuration); section.Double(m_hyperspaceEndTime); wr.WrSection("Game", section.GetData()); // space, all the bodies and things section = Serializer::Writer(); m_space->Serialize(section); section.Int32(m_space->GetIndexForBody(m_player.get())); wr.WrSection("Space", section.GetData()); // space transition state section = Serializer::Writer(); // hyperspace clouds being brought over from the previous system section.Int32(m_hyperspaceClouds.size()); for (std::list<HyperspaceCloud*>::const_iterator i = m_hyperspaceClouds.begin(); i != m_hyperspaceClouds.end(); ++i) (*i)->Serialize(section, m_space.get()); wr.WrSection("HyperspaceClouds", section.GetData()); // system political data (crime etc) section = Serializer::Writer(); Polit::Serialize(section); wr.WrSection("Polit", section.GetData()); // views. must be saved in init order section = Serializer::Writer(); Pi::cpan->Save(section); wr.WrSection("ShipCpanel", section.GetData()); section = Serializer::Writer(); Pi::sectorView->Save(section); wr.WrSection("SectorView", section.GetData()); section = Serializer::Writer(); Pi::worldView->Save(section); wr.WrSection("WorldView", section.GetData()); // lua section = Serializer::Writer(); Pi::luaSerializer->Serialize(section); wr.WrSection("LuaModules", section.GetData()); // trailing signature for (Uint32 i = 0; i < strlen(s_saveEnd)+1; i++) wr.Byte(s_saveEnd[i]); Pi::luaSerializer->UninitTableRefs(); }