CeGuiString XmlHelper::getAttributeValueAsString(DOMElement* element, const char* const name) { XMLCh* attrName = XMLString::transcode(name); CeGuiString rVal(transcodeToString(element->getAttribute(attrName))); XMLString::release(&attrName); return rVal; }
// // 得到应用程序路径 // CString WINAPI GetAppPath(BOOL IsDLL, HINSTANCE instance, BOOL IsFullPathName) { TCHAR sFilename[_MAX_PATH]; TCHAR sDrive[_MAX_DRIVE]; TCHAR sDir[_MAX_DIR]; TCHAR sFname[_MAX_FNAME]; TCHAR sExt[_MAX_EXT]; if(IsDLL) GetModuleFileName(instance, sFilename, _MAX_PATH); else GetModuleFileName(AfxGetInstanceHandle(), sFilename, _MAX_PATH); if(IsFullPathName) return sFilename; _tsplitpath(sFilename, sDrive, sDir, sFname, sExt); CString rVal(CString(sDrive) + CString(sDir)); int nLen = rVal.GetLength(); if (rVal.GetAt(nLen-1) != _T('\\')) rVal += _T("\\"); return rVal; }
TEST(DirectExecTest, SanityTests) { C4AulScript * pScript = new C4AulScript(); ASSERT_TRUE(pScript); C4Value rVal(pScript->DirectExec(nullptr, "5*8", "unit test script", false, nullptr)); EXPECT_EQ(rVal, C4Value(5*8)); delete pScript; }
std::string XmlHelper::transcodeToStdString(const XMLCh* const string16) { if( string16 == NULL ) return ""; char* tmpVal = XMLString::transcode(string16); std::string rVal(tmpVal); XMLString::release(&tmpVal); return rVal; }
CeGuiString XmlHelper::transcodeToString(const XMLCh* const string16) { unsigned int str16len = XMLString::stringLen(string16); if (str16len == 0) { return CeGuiString(); } initializeTranscoder(); utf8* tmpVal = transcodeToUtf8(string16); CeGuiString rVal(tmpVal); delete[] tmpVal; return rVal; }
// // 从完整路径中分离出路径 // CString WINAPI GetPath(TCHAR *sFilename) { TCHAR sDrive[_MAX_DRIVE]; TCHAR sDir[_MAX_DIR]; TCHAR sFname[_MAX_FNAME]; TCHAR sExt[_MAX_EXT]; _tsplitpath(sFilename, sDrive, sDir, sFname, sExt); CString rVal(CString(sDrive) + CString(sDir)); int nLen = rVal.GetLength(); if (rVal.GetAt(nLen-1) != _T('\\')) rVal += _T("\\"); return rVal; }
std::unique_ptr<ModelData> AssimpLoader::LoadData(const std::string& filepath) { std::unique_ptr<ModelData> rVal(std::make_unique<ModelData>()); Assimp::Importer importer; const aiScene* scene = importer.ReadFile(filepath, aiProcess_GenNormals | aiProcess_CalcTangentSpace | aiProcess_JoinIdenticalVertices | //aiProcess_SortByPType | aiProcess_Triangulate | aiProcess_FlipUVs ); if(!scene || scene->mFlags == AI_SCENE_FLAGS_INCOMPLETE || !scene->mRootNode) // if is Not Zero { std::cout << "ERROR::ASSIMP:: " << importer.GetErrorString() << std::endl; return false; } // Put vertices to data for(unsigned int i = 0, offset = 0; i < scene->mNumMeshes; i++) { aiMesh* curMesh = scene->mMeshes[i]; // Create new Mesh Mesh newMesh; // Update its info newMesh.dataOffset = offset; // Update offset offset += curMesh->mNumVertices; // Add Data to rVal->data vector for(unsigned int j = 0; j < curMesh->mNumVertices; j++) { // Vertices rVal->data.push_back(curMesh->mVertices[j].x); rVal->data.push_back(curMesh->mVertices[j].y); rVal->data.push_back(curMesh->mVertices[j].z); // Normals rVal->data.push_back(curMesh->mNormals[j].x); rVal->data.push_back(curMesh->mNormals[j].y); rVal->data.push_back(curMesh->mNormals[j].z); // TexCoords if(curMesh->HasTextureCoords(0)) { rVal->data.push_back(curMesh->mTextureCoords[0][j].x); rVal->data.push_back(curMesh->mTextureCoords[0][j].y); rVal->data.push_back(curMesh->mTextureCoords[0][j].z); } else { // TODO: Handle that case // rVal->data.push_back(0); // rVal->data.push_back(0); // rVal->data.push_back(0); } } // Add Indices to vector for(GLuint h = 0; h < curMesh->mNumFaces; h++) { aiFace* face = &(curMesh->mFaces[h]); for(GLuint j = 0; j < face->mNumIndices; j++) newMesh.indices.push_back(face->mIndices[j] + newMesh.dataOffset); } // Materials if(curMesh->mMaterialIndex >= 0) { aiMaterial* material = scene->mMaterials[curMesh->mMaterialIndex]; // Diffuse maps std::vector<Texture> diffuseMaps = LoadMaterialTextures( material, aiTextureType_DIFFUSE, SHADER_TEXTURE_DIFFUSE_PREFIX, filepath.substr(0, filepath.find_last_of('/'))); newMesh.textures.insert(newMesh.textures.end(), diffuseMaps.begin(), diffuseMaps.end()); // Specular maps std::vector<Texture> specularMaps = LoadMaterialTextures( material, aiTextureType_SPECULAR, SHADER_TEXTURE_SPECULAR_PREFIX, filepath.substr(0, filepath.find_last_of('/'))); newMesh.textures.insert(newMesh.textures.end(), specularMaps.begin(), specularMaps.end()); } // Add new mesh to vector rVal->meshes.push_back(newMesh); } // Load to gpu glGenBuffers(1, &(rVal->vbo)); glGenVertexArrays(1, &(rVal->vao)); glBindVertexArray(rVal->vao); { glBindBuffer(GL_ARRAY_BUFFER, rVal->vbo); { // Bind data glBufferData( GL_ARRAY_BUFFER, rVal->data.size() * sizeof(GLfloat), rVal->data.data(), GL_STATIC_DRAW); // Vertices glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 9 * sizeof(float), (GLvoid*)0); glEnableVertexAttribArray(0); // Normals glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 9 * sizeof(float), (GLvoid*)(3 * sizeof(GLfloat))); glEnableVertexAttribArray(1); // TexCoords glVertexAttribPointer(2, 3, GL_FLOAT, GL_FALSE, 9 * sizeof(float), (GLvoid*)(6 * sizeof(GLfloat))); glEnableVertexAttribArray(2); } glBindBuffer(GL_ARRAY_BUFFER, 0); for(Mesh& mesh : rVal->meshes) { glGenBuffers(1, &mesh.ebo); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, mesh.ebo); glBufferData( GL_ELEMENT_ARRAY_BUFFER, mesh.indices.size() * sizeof(GLuint), mesh.indices.data(), GL_STATIC_DRAW); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); } } glBindVertexArray(0); return std::move(rVal); }
TEST(DirectExecTest, SanityTests) { C4Value rVal(AulExec.DirectExec(nullptr, "5*8", "unit test script", false, nullptr)); EXPECT_EQ(rVal, C4Value(5*8)); }