void CAssParser::FindTextures( S3DModel* model, const aiScene* scene, const LuaTable& modelTable, const std::string& modelPath, const std::string& modelName ) { // Assign textures // The S3O texture handler uses two textures. // The first contains diffuse color (RGB) and teamcolor (A) // The second contains glow (R), reflectivity (G) and 1-bit Alpha (A). // 1. try to find by name (lowest prioriy) if (model->tex1.empty()) model->tex1 = FindTextureByRegex("unittextures/", modelName); // high priority if (model->tex1.empty()) model->tex1 = FindTextureByRegex("unittextures/", modelName + "1"); if (model->tex2.empty()) model->tex2 = FindTextureByRegex("unittextures/", modelName + "2"); if (model->tex1.empty()) model->tex1 = FindTextureByRegex(modelPath, "tex1"); if (model->tex2.empty()) model->tex2 = FindTextureByRegex(modelPath, "tex2"); if (model->tex1.empty()) model->tex1 = FindTextureByRegex(modelPath, "diffuse"); if (model->tex2.empty()) model->tex2 = FindTextureByRegex(modelPath, "glow"); // low priority // 2. gather model-defined textures of first material (medium priority) if (scene->mNumMaterials > 0) { const unsigned int texTypes[] = { aiTextureType_SPECULAR, aiTextureType_UNKNOWN, aiTextureType_DIFFUSE, /* // TODO: support these too (we need to allow constructing tex1 & tex2 from several sources) aiTextureType_EMISSIVE, aiTextureType_HEIGHT, aiTextureType_NORMALS, aiTextureType_SHININESS, aiTextureType_OPACITY, */ }; for (unsigned int n = 0; n < (sizeof(texTypes) / sizeof(texTypes[0])); n++) { aiString textureFile; if (scene->mMaterials[0]->Get(AI_MATKEY_TEXTURE(texTypes[n], 0), textureFile) != aiReturn_SUCCESS) continue; assert(textureFile.length > 0); model->tex1 = FindTexture(textureFile.data, modelPath, model->tex1); } } // 3. try to load from metafile (highest priority) model->tex1 = FindTexture(modelTable.GetString("tex1", ""), modelPath, model->tex1); model->tex2 = FindTexture(modelTable.GetString("tex2", ""), modelPath, model->tex2); model->invertTexYAxis = modelTable.GetBool("fliptextures", true); // Flip texture upside down model->invertTexAlpha = modelTable.GetBool("invertteamcolor", true); // Reverse teamcolor levels }
void CAssParser::FindTextures( S3DModel* model, const aiScene* scene, const LuaTable& modelTable, const std::string& modelPath, const std::string& modelName ) { // 1. try to find by name (lowest priority) model->texs[0] = FindTextureByRegex("unittextures/", modelName); if (model->texs[0].empty()) model->texs[0] = FindTextureByRegex("unittextures/", modelName + "1"); if (model->texs[1].empty()) model->texs[1] = FindTextureByRegex("unittextures/", modelName + "2"); if (model->texs[0].empty()) model->texs[0] = FindTextureByRegex(modelPath, "tex1"); if (model->texs[1].empty()) model->texs[1] = FindTextureByRegex(modelPath, "tex2"); if (model->texs[0].empty()) model->texs[0] = FindTextureByRegex(modelPath, "diffuse"); if (model->texs[1].empty()) model->texs[1] = FindTextureByRegex(modelPath, "glow"); // lowest-priority name // 2. gather model-defined textures of first material (medium priority) if (scene->mNumMaterials > 0) { constexpr unsigned int texTypes[] = { aiTextureType_SPECULAR, aiTextureType_UNKNOWN, aiTextureType_DIFFUSE, /* // TODO: support these too (we need to allow constructing tex1 & tex2 from several sources) aiTextureType_EMISSIVE, aiTextureType_HEIGHT, aiTextureType_NORMALS, aiTextureType_SHININESS, aiTextureType_OPACITY, */ }; for (unsigned int texType: texTypes) { aiString textureFile; if (scene->mMaterials[0]->Get(AI_MATKEY_TEXTURE(texType, 0), textureFile) != aiReturn_SUCCESS) continue; assert(textureFile.length > 0); model->texs[0] = FindTexture(textureFile.data, modelPath, model->texs[0]); } } // 3. try to load from metafile (highest priority) model->texs[0] = FindTexture(modelTable.GetString("tex1", ""), modelPath, model->texs[0]); model->texs[1] = FindTexture(modelTable.GetString("tex2", ""), modelPath, model->texs[1]); }