void FileHandler::SaveMeshes(int nrMeshes, vector<Transform*> &allMeshTransforms) { for (int i = 0; i < nrMeshes; i++) { //headerSTART**** char* transformName = allMeshTransforms[i]->mesh->transformName; //hade nog egentligen kunnat använda transformnamnet då det är samma, men consistency u know char* meshName = allMeshTransforms[i]->mesh->name; int transformNameSize = CorrectName(transformName); int meshNameSize = CorrectName(meshName); //biter av vid nullterminator och returnerar längden på texten ofs.write((char*)&transformNameSize, sizeof(int)); ofs.write((char*)&meshNameSize, sizeof(int)); ofs.write(transformName, sizeof(char) * transformNameSize); ofs.write(meshName, sizeof(char) * meshNameSize); if (transformNameSize > 0) //den är dynamiskt allokerad! { delete(transformName); } if (meshNameSize > 0) //den är dynamiskt allokerad! { delete(meshName); } /*ofs.write((char*)&allMeshTransforms[i]->mesh->nrVertices, sizeof(int)); ofs.write((char*)&allMeshTransforms[i]->mesh->nrIndecies, sizeof(int)); */ char* materialName = allMeshTransforms[i]->mesh->materialName; int materialNameSize = CorrectName(materialName); ofs.write((char*)&materialNameSize, sizeof(int)); ofs.write(materialName, sizeof(char) * materialNameSize); if (materialNameSize > 0) //den är dynamiskt allokerad! { delete(materialName); } //headerEND**** //messageSTART**** ofs.write((char*)&allMeshTransforms[i]->mesh->meshID, sizeof(int)); ofs.write((char*)&allMeshTransforms[i]->mesh->meshData->nrPos, sizeof(int)); ofs.write((char*)&allMeshTransforms[i]->mesh->meshData->nrNor, sizeof(int)); ofs.write((char*)&allMeshTransforms[i]->mesh->meshData->nrUV, sizeof(int)); ofs.write((char*)&allMeshTransforms[i]->mesh->meshData->nrI, sizeof(int)); ofs.write((char*)&allMeshTransforms[i]->mesh->meshData->triangleCount, sizeof(int)); ofs.write((char*)allMeshTransforms[i]->mesh->meshData->positions, sizeof(Float3) * allMeshTransforms[i]->mesh->meshData->nrPos); //?? pekare till float3s ofs.write((char*)allMeshTransforms[i]->mesh->meshData->normals, sizeof(Float3) * allMeshTransforms[i]->mesh->meshData->nrNor); ofs.write((char*)allMeshTransforms[i]->mesh->meshData->uvs, sizeof(Float2) * allMeshTransforms[i]->mesh->meshData->nrUV); ofs.write((char*)allMeshTransforms[i]->mesh->meshData->indexPositions, sizeof(int) * allMeshTransforms[i]->mesh->meshData->nrI); ofs.write((char*)allMeshTransforms[i]->mesh->meshData->indexNormals, sizeof(int) * allMeshTransforms[i]->mesh->meshData->nrI); ofs.write((char*)allMeshTransforms[i]->mesh->meshData->indexUVs, sizeof(int) * allMeshTransforms[i]->mesh->meshData->nrI); ofs.write((char*)allMeshTransforms[i]->mesh->meshData->trianglesPerFace, sizeof(int) * allMeshTransforms[i]->mesh->meshData->triangleCount); //messageEND**** } }
void FileHandler::SaveTransforms(int nrTransforms, vector<Transform*> &allTransforms) { for (int i = 0; i < nrTransforms; i++) { char* parentName = allTransforms[i]->parentName; char* transformName = allTransforms[i]->name; int parentNameSize = CorrectName(parentName); //biter av vid nullterminator och returnerar längden på texten int transformNameSize = CorrectName(transformName); ofs.write((char*)&parentNameSize, sizeof(int)); ofs.write((char*)&transformNameSize, sizeof(int)); ofs.write(parentName, sizeof(char) * parentNameSize); ofs.write(transformName, sizeof(char) * transformNameSize); if (transformNameSize > 0) //den är dynamiskt allokerad! { delete(transformName); } if (parentNameSize > 0) //den är dynamiskt allokerad! { delete(parentName); } ofs.write((char*)&allTransforms[i]->transformData.pos, sizeof(allTransforms[i]->transformData.pos)); ofs.write((char*)&allTransforms[i]->transformData.rot, sizeof(allTransforms[i]->transformData.rot)); ofs.write((char*)&allTransforms[i]->transformData.scale, sizeof(allTransforms[i]->transformData.scale)); //ofs.write((char*)&allTransforms[i]->transformData.attributes, sizeof(allTransforms[i]->transformData.attributes)); //funkar detta? troor deeettt } }
void FileHandler::SaveLights(int nrLights, vector<Transform*> &allLightTransforms) { for (int i = 0; i < nrLights; i++) { char* transformName = allLightTransforms[i]->name; char* lightName = allLightTransforms[i]->light->name; int transformNameSize = CorrectName(transformName); int lightNameSize = CorrectName(lightName); ofs.write((char*)&transformNameSize, sizeof(int)); ofs.write((char*)&lightNameSize, sizeof(int)); ofs.write(transformName, sizeof(char) * transformNameSize); ofs.write(lightName, sizeof(char) * lightNameSize); if (transformNameSize > 0) //den är dynamiskt allokerad! { delete(transformName); } if (lightNameSize > 0) //den är dynamiskt allokerad! { delete(lightName); } //lightdata!! ofs.write((char*)&allLightTransforms[i]->light->lightData, sizeof(LightData)); } }
/////////////////////////////////////////////////////////////////////////////// // Hinzufügen eines Attributes einer Objektklasse HRESULT CArcViewAttributes::AddAttribute ( INT_PTR lIdent, INT_PTR lMCode, LPCSTR pcAttrName, int iTyp, int iLen) { if (S_OK == GetAttribute(lIdent, lMCode)) return E_FAIL; // diese Kombination existiert bereits // in Map nach Attributen für den Layer suchen CArcViewLayerAttributes *pAttrMap = NULL; if (S_OK != GetAttributes (lIdent, &pAttrMap)) { pair<iterator, bool> p = insert(value_type (lIdent, CArcViewLayerAttributes())); if (!p.second) return E_OUTOFMEMORY; pAttrMap = &(*p.first).second; } _ASSERTE(NULL != pAttrMap); // in layerspezifischer Map nach dem Feld suchen CArcViewLayerAttributes::iterator it = pAttrMap -> find (lMCode); if (it == pAttrMap -> end()) { os_string strName (CorrectName(pcAttrName)); pair<CArcViewLayerAttributes::iterator, bool> p = pAttrMap -> insert ( CArcViewLayerAttributes::value_type (lMCode, CArcViewAttribute(strName.c_str(), iTyp, iLen))); if (!p.second) return E_OUTOFMEMORY; } return S_OK; }
void FileHandler::SaveScene(int maxNameSize, char* sceneName, vector<Material*> &materials, vector<Transform*> &allTransforms, vector<Transform*> &allMeshTransforms, vector<Transform*> &allLightTransforms) { //max_Name_Size = maxNameSize; int sceneNameSize = CorrectName(sceneName); int nrMats = materials.size(); int nrTransforms = allTransforms.size(); int nrMeshes = allMeshTransforms.size(); int nrLights = allLightTransforms.size(); std::string fileName(sceneName, sceneNameSize-1); //-1 så att inte \0 kommer med fileName.append(".drm"); lastLoadedFileName = fileName; ofs.open(fileName, ofstream::out | ofstream::binary); if (ofs.is_open() == true) { ofs.clear(); SaveMainHeader(sceneNameSize, sceneName, nrMats, nrTransforms, nrMeshes, nrLights); SaveMaterials(nrMats, materials); //måste vara först! SaveTransforms(nrTransforms, allTransforms); SaveMeshes(nrMeshes, allMeshTransforms); SaveLights(nrLights, allLightTransforms); ofs.close(); //LoadScene(); //test bara } }
void FileHandler::SaveMaterials(int nrMats, vector<Material*> &materials) { for (int i = 1; i < nrMats; i++) { //läs inte default materialet! char* materialName = materials[i]->name; int materialNameSize = CorrectName(materialName); ofs.write((char*)&materialNameSize, sizeof(int)); ofs.write(materialName, sizeof(char) * materialNameSize); if (materialNameSize > 0) //den är dynamiskt allokerad! { delete(materialName); } ofs.write((char*)&materials[i]->materialData, sizeof(MaterialData)); //textures!! char *diffuseTextureName = materials[i]->textureName; //int diffuseTextureSize = CorrectName(diffuseTextureName); int diffuseTextureSize = CutOffFilePath(diffuseTextureName); ofs.write((char*)&diffuseTextureSize, sizeof(int)); ofs.write(diffuseTextureName, sizeof(char) * diffuseTextureSize); if (diffuseTextureSize > 0) //den är dynamiskt allokerad! { delete(diffuseTextureName); } } }