Non-animated background plane support

This commit is contained in:
Citlali del Rey 2023-11-21 16:11:12 -08:00
parent 0f4f852528
commit b6808eead3
Signed by: nullobsi
GPG Key ID: 933A1F44222C2634
2 changed files with 176 additions and 6 deletions

View File

@ -9,6 +9,7 @@
#include <assimp/XmlParser.h>
#include <assimp/IOSystem.hpp>
#include <assimp/scene.h>
#include <Common/StbCommon.h>
namespace Assimp {
@ -32,6 +33,7 @@ static const ai_real gc_orient[] = {
AI_MATH_PI, -AI_MATH_HALF_PI, 0,AI_MATH_HALF_PI,
};
FezLoader::FezLoader() = default;
FezLoader::~FezLoader() = default;
@ -173,6 +175,88 @@ void FezLoader::InternReadFile(const std::string &pFile, aiScene *pScene, IOSyst
aoRoot->addChildren(1, &aoNode);
}
// Create child for background planes
auto bgpRoot = new aiNode("Background Planes");
pScene->mRootNode->addChildren(1, &bgpRoot);
// For some reason, it needs a positioning adjustment...
aiMatrix4x4::Translation(aiVector3D(-0.5,-0.5, -0.5), bgpRoot->mTransformation);
auto xmlBGPRoot = levelRoot.child("BackgroundPlanes");
for (auto t : xmlBGPRoot.children()) {
auto nodeName = std::string(t.name());
if (nodeName != "Entry") {
ASSIMP_LOG_WARN("BackgroundPlanes child found that isn't Entry");
continue;
}
auto instance = t.child("BackgroundPlane");
auto animated = instance.attribute("animated").as_bool(false);
if (animated) {
ASSIMP_LOG_WARN("Animated BackgroundPlane found, skipping");
continue;
}
auto bgpTexName = std::string(instance.attribute("textureName").as_string());
bool found = true;
auto bgpMesh = GetBackgroundPlaneFromName(bgpTexName, pIOHandler, found);
auto mesh = mMeshes[bgpMesh];
auto mat = mMaterials[mesh->mMaterialIndex];
if (!found) {
auto doubleSided = (int)instance.attribute("doubleSided").as_bool(false);
mat->AddProperty(&doubleSided, 1, AI_MATKEY_TWOSIDED);
auto opacity = instance.attribute("opacity").as_float(1.0);
mat->AddProperty(&opacity, 1, AI_MATKEY_OPACITY);
auto xTexRepeat = (int)(!instance.attribute("xTextureRepeat").as_bool(false));
mat->AddProperty(&xTexRepeat, 1, AI_MATKEY_MAPPINGMODE_U(aiTextureType_BASE_COLOR, 0));
auto yTexRepeat = (int)(!instance.attribute("yTextureRepeat").as_bool(false));
mat->AddProperty(&yTexRepeat, 1, AI_MATKEY_MAPPINGMODE_V(aiTextureType_BASE_COLOR, 0));
// redundant probably? idk
// auto clampTex = instance.attribute("clampTexture").as_bool(false);
}
// Create node, link found mesh
auto bgpNode = new aiNode();
bgpNode->mNumMeshes = 1;
bgpNode->mMeshes = new unsigned int[1];
bgpNode->mMeshes[0] = bgpMesh;
bgpNode->mName = aiString("BGP_" + bgpTexName);
auto pos = GetFezVec3(instance.child("Position"));
auto rotate = GetFezQuat(instance.child("Rotation"));
auto scale = GetFezVec3(instance.child("Scale"));
// Get scale again from texture {
aiString texRef;
mat->Get(AI_MATKEY_TEXTURE(aiTextureType_BASE_COLOR, 0), texRef);
unsigned int texId = atoi(texRef.C_Str()+1);
aiTexture* bgpTex = mTextures[texId];
int width;
int height;
int comp;
stbi_info_from_memory(reinterpret_cast<const stbi_uc *>(bgpTex->pcData), (int)bgpTex->mWidth, &width, &height, &comp);
auto imageScaleVec = aiVector3D(scale.x * (width / 16.0f), scale.y * (height / 16.0f), scale.z * 1);
// Create transformation matrix
aiMatrix4x4 scaling = aiMatrix4x4::Scaling(imageScaleVec, scaling);
auto rmMatrix = aiMatrix4x4 (aiVector3D (1,1,1), rotate, pos);
bgpNode->mTransformation = rmMatrix * scaling;
bgpRoot->addChildren(1, &bgpNode);
}
// Fill in meshes from vector
pScene->mNumMeshes = mMeshes.size();
pScene->mMeshes = new aiMesh *[pScene->mNumMeshes];
@ -211,7 +295,6 @@ aiMesh *FezLoader::CreateMesh(const Assimp::XmlNode &xmlSIIP) {
aiVector3D texCoord;
};
std::vector<vpnti> vertex;
// TODO: check handedness/orientation
for (auto v : xmlVerts.children()) {
auto pos = GetFezVec3(v.child("Position"));
auto normal = v.child("Normal").text().as_int();
@ -256,7 +339,7 @@ aiMesh *FezLoader::CreateMesh(const Assimp::XmlNode &xmlSIIP) {
return mesh;
}
unsigned int FezLoader::GetTrileMeshFromId(const int trileId) {
unsigned int FezLoader::GetTrileMeshFromId(const int trileId, bool &valid) {
if (auto search = mTrileMap.find(trileId); search != mTrileMap.end()) {
return search->second;
}
@ -267,6 +350,10 @@ unsigned int FezLoader::GetTrileMeshFromId(const int trileId) {
// Create mesh
auto mesh = CreateMesh(xmlSIIP);
if (mesh->mNumVertices == 0) {
valid = false;
return 0;
}
mesh->mName = "Trile#" + std::to_string(trileId);
// Only one material for all triles.
@ -276,9 +363,48 @@ unsigned int FezLoader::GetTrileMeshFromId(const int trileId) {
mTrileMap[trileId] = mMeshes.size();
mMeshes.push_back(mesh);
valid = true;
return mTrileMap[trileId];
}
unsigned int FezLoader::GetBackgroundPlaneFromName(const std::string &name, IOSystem *pIOHandler, bool &found) {
if (auto search = mBGPMap.find(name); search != mBGPMap.end()) {
found = true;
return search->second;
}
found = false;
auto BGPTexPath = mFezAssetDir / "background planes" / (ai_tolower(name) + ".png");
// Create material, mesh, and texture
auto myTex = CreateTex(BGPTexPath, pIOHandler);
auto myMesh = NewBGPlaneMesh();
auto myMat = new aiMaterial();
// Put tex ref into material
aiString tName('*' + std::to_string(mMaterials.size()));
myMat->AddProperty(&tName, AI_MATKEY_TEXTURE(aiTextureType_BASE_COLOR, 0));
mTextures.push_back(myTex);
// Put material ref into mesh
myMesh->mMaterialIndex = mMaterials.size();
mMaterials.push_back(myMat);
// Put mesh into vector
auto i = mMeshes.size();
mBGPMap[name] = i;
mMeshes.push_back(myMesh);
// Set parameters for material
int flags = aiTextureFlags_UseAlpha;
myMat->AddProperty(&flags, 1, AI_MATKEY_TEXFLAGS(aiTextureType_BASE_COLOR, 0));
flags = aiBlendMode_Default;
myMat->AddProperty(&flags, 1, AI_MATKEY_BLEND_FUNC);
return i;
}
unsigned int FezLoader::GetArtObjectFromName(const std::string &name, IOSystem *pIOHandler) {
if (auto search = mAOMap.find(name); search != mAOMap.end()) {
return search->second;
@ -299,8 +425,9 @@ unsigned int FezLoader::GetArtObjectFromName(const std::string &name, IOSystem *
XmlNode aoXmlRoot = p.getRootNode().child("ArtObject");
if (std::string(aoXmlRoot.name()) != name) {
ASSIMP_LOG_WARN("Art Object name mismatch! ", name, " != ", aoXmlRoot.name());
std::string myaoname = aoXmlRoot.attribute("name").as_string();
if (myaoname != name) {
ASSIMP_LOG_WARN("Art Object name mismatch! ", name, " != ", myaoname);
}
// Create mesh
@ -363,7 +490,13 @@ void FezLoader::AddTrileInstances(const XmlNode &tis, aiNode *trileRoot) {
continue;
}
auto meshID = GetTrileMeshFromId(trileID);
bool valid = true;
auto meshID = GetTrileMeshFromId(trileID, valid);
if (!valid) {
ASSIMP_LOG_WARN("Trile instance found that's empty!");
continue;
}
// Create node, link found mesh
auto trileNode = new aiNode();
@ -420,6 +553,40 @@ aiQuaternion FezLoader::GetFezQuat(const XmlNode &t, bool direct) {
}
}
static aiFace bgPlaneFaces[4] = {
};
aiMesh *FezLoader::NewBGPlaneMesh() {
auto myMesh = new aiMesh();
// Create plane
// Two tris
myMesh->mNumFaces = 2;
myMesh->mFaces = new aiFace[2];
myMesh->mFaces[0].mNumIndices = 3;
myMesh->mFaces[1].mNumIndices = 3;
myMesh->mFaces[0].mIndices = new unsigned int[3] {0, 2, 1};
myMesh->mFaces[1].mIndices = new unsigned int[3] {2, 0, 3};
// Four verts
myMesh->mNumVertices = 4;
myMesh->mVertices = new aiVector3D[4] {
{-0.5, 0.5, 0},
{ 0.5, 0.5, 0},
{0.5, -0.5, 0},
{-0.5, -0.5, 0},
};
// Texture coords
myMesh->mTextureCoords[0] = new aiVector3D[4] {
{0, 1, 0},
{1, 1, 0},
{1, 0, 0},
{0, 0, 0},
};
return myMesh;
}
}
#endif

View File

@ -22,7 +22,7 @@ protected:
void InternReadFile(const std::string &pFile, aiScene *pScene, IOSystem *pIOHandler) override;
unsigned int GetTrileMeshFromId(const int trileId);
unsigned int GetTrileMeshFromId(const int trileId, bool &valid);
aiVector3D GetFezVec3(const XmlNode &t, bool direct = false);
aiQuaternion GetFezQuat(const XmlNode &t, bool direct = false);
@ -31,6 +31,7 @@ protected:
void AddTrileInstances(const XmlNode &tis, aiNode *trileRoot);
aiMesh *CreateMesh(const XmlNode &xmlSIIP);
aiMesh *NewBGPlaneMesh();
aiTexture *CreateTex(const std::string &path, IOSystem *pIOHandler);
private:
@ -42,10 +43,12 @@ private:
std::map<int, XmlNode> mTriles;
std::map<int, unsigned int> mTrileMap;
std::map<std::string, unsigned int> mAOMap;
std::map<std::string, unsigned int> mBGPMap;
std::vector<aiMesh*> mMeshes;
std::vector<aiMaterial*> mMaterials;
std::vector<aiTexture*> mTextures;
unsigned int GetArtObjectFromName(const std::string &name, IOSystem *pIOHandler);
unsigned int GetBackgroundPlaneFromName(const std::string &name, IOSystem *pIOHandler, bool &found);
};
}