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));

	}
}
Beispiel #4
0
///////////////////////////////////////////////////////////////////////////////
// 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);
		}
	}
}