First blood
This commit is contained in:
1 parent
04f270f322
commit
5720f8322b
250 files changed
+33215
No files matched your search
@@ -0,0 +1,361 @@
|
||||
#include "include/ModelManager/ModelManager.h"
|
||||
|
||||
#include "include/Utils/Utils.h"
|
||||
#include "include/Engine.h"
|
||||
|
||||
namespace SE
|
||||
{
|
||||
|
||||
//===================================================
|
||||
//=========== LITE MODEL RESOURCE ===================
|
||||
//===================================================
|
||||
|
||||
TLiteModelResource::~TLiteModelResource()
|
||||
{
|
||||
FreeModel();
|
||||
*Console<<"ResourceManager::ModelManager::LiteModelResource deleting";
|
||||
}
|
||||
|
||||
bool TLiteModelResource::LoadModel(boost::shared_array<byte> filePointer, cardinal fileSize)
|
||||
{
|
||||
|
||||
FreeModel();
|
||||
|
||||
cardinal triangleShift = *reinterpret_cast<cardinal*>(&filePointer[4]);
|
||||
|
||||
TriangleCount = *reinterpret_cast<cardinal*>(&filePointer[0] + triangleShift - 4);
|
||||
|
||||
int texnamelen = *reinterpret_cast<word*>(&filePointer[0] + 76);
|
||||
|
||||
Texname = std::string(reinterpret_cast<char*>(&filePointer[78]), reinterpret_cast<char*>(&filePointer[78]) + texnamelen);
|
||||
|
||||
int normtexnamelen = *reinterpret_cast<word*>(&filePointer[78]+texnamelen);
|
||||
|
||||
Normtexname = std::string(reinterpret_cast<char*>(&filePointer[80]+texnamelen), reinterpret_cast<char*>(&filePointer[80]+texnamelen) + normtexnamelen);
|
||||
|
||||
ResourceManager->TexList.AddTextureDirectly((PathToResource + std::string(Texname)));
|
||||
if (Normtexname != "")
|
||||
{
|
||||
ResourceManager->TexList.AddTextureDirectly((PathToResource + std::string(Normtexname)));
|
||||
}
|
||||
|
||||
VertexArr.resize(TriangleCount * 3);
|
||||
NormalArr.resize(TriangleCount * 3);
|
||||
TangentArr.resize(TriangleCount * 3);
|
||||
BinormalArr.resize(TriangleCount * 3);
|
||||
TexCoordArr.resize(TriangleCount * 3);
|
||||
|
||||
memcpy(&VertexArr[0], &filePointer[0] + triangleShift, TriangleCount * 36);
|
||||
memcpy(&NormalArr[0], &filePointer[0] + triangleShift + TriangleCount * 36, TriangleCount * 36);
|
||||
memcpy(&TangentArr[0], &filePointer[0] + triangleShift + TriangleCount * 72, TriangleCount * 36);
|
||||
memcpy(&BinormalArr[0], &filePointer[0] + triangleShift + TriangleCount * 108, TriangleCount * 36);
|
||||
memcpy(&TexCoordArr[0], &filePointer[0] + triangleShift + TriangleCount * 144, TriangleCount * 24);
|
||||
|
||||
return true;
|
||||
|
||||
}
|
||||
|
||||
void TLiteModelResource::FreeModel()
|
||||
{
|
||||
|
||||
if (Texname != "")
|
||||
{
|
||||
ResourceManager->TexList.DeleteTexture(GetFileName(Texname));
|
||||
Texname = "";
|
||||
}
|
||||
|
||||
if (Normtexname != "")
|
||||
{
|
||||
ResourceManager->TexList.DeleteTexture(GetFileName(Normtexname));
|
||||
Normtexname = "";
|
||||
}
|
||||
|
||||
VertexArr.clear();
|
||||
NormalArr.clear();
|
||||
TangentArr.clear();
|
||||
BinormalArr.clear();
|
||||
TexCoordArr.clear();
|
||||
|
||||
}
|
||||
|
||||
void TLiteModelResource::SetPathToResource(const std::string& pathToResource)
|
||||
{
|
||||
PathToResource = pathToResource;
|
||||
}
|
||||
|
||||
|
||||
|
||||
//===================================================
|
||||
//============= LITE MODEL REF ======================
|
||||
//===================================================
|
||||
TLiteModel::~TLiteModel()
|
||||
{
|
||||
FreeModel();
|
||||
*Console<<"Render::LiteModel model deleting: " + Modelname;
|
||||
}
|
||||
|
||||
bool TLiteModel::LoadModel(const std::string& s)
|
||||
{
|
||||
|
||||
TLiteModelResource& res = ResourceManager->ModelManager[s];
|
||||
|
||||
FreeModel();
|
||||
|
||||
Modelname = s;
|
||||
|
||||
TriangleCount = res.TriangleCount;
|
||||
|
||||
if (res.Texname != "")
|
||||
TexID = ResourceManager->TexList[res.Texname];
|
||||
else
|
||||
TexID = 0;
|
||||
|
||||
if (res.Normtexname != "")
|
||||
NormTexID = ResourceManager->TexList[res.Normtexname];
|
||||
else
|
||||
NormTexID = 0;
|
||||
|
||||
|
||||
TriangleList.Data.Vec3CoordArr[CONST_STRING_POSITION_ATTRIB] = res.VertexArr;
|
||||
TriangleList.Data.Vec3CoordArr[CONST_STRING_NORMAL_ATTRIB] = res.NormalArr;
|
||||
TriangleList.Data.Vec3CoordArr[CONST_STRING_TANGENT_ATTRIB] = res.TangentArr;
|
||||
TriangleList.Data.Vec3CoordArr[CONST_STRING_BINORMAL_ATTRIB] = res.BinormalArr;
|
||||
TriangleList.Data.Vec2CoordArr[CONST_STRING_TEXCOORD_ATTRIB] = res.TexCoordArr;
|
||||
|
||||
Loaded = true;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void TLiteModel::FreeModel()
|
||||
{
|
||||
Loaded = false;
|
||||
|
||||
TriangleList.Data.Vec3CoordArr.clear();
|
||||
TriangleList.Data.Vec2CoordArr.clear();
|
||||
#ifdef TARGET_WIN32
|
||||
TriangleList.VertBufferArr.clear();
|
||||
#endif
|
||||
TriangleCount = 0;
|
||||
TexID = 0;
|
||||
NormTexID = 0;
|
||||
|
||||
Modelname = "";
|
||||
}
|
||||
|
||||
|
||||
void TLiteModel::UpdateVBO()
|
||||
{
|
||||
|
||||
CheckGlError();
|
||||
|
||||
TriangleList.RefreshBuffer();
|
||||
|
||||
CheckGlError();
|
||||
|
||||
}
|
||||
|
||||
void TLiteModel::DrawImmediate()
|
||||
{
|
||||
|
||||
#ifdef TARGET_WIN32
|
||||
|
||||
if (Loaded)
|
||||
{
|
||||
|
||||
int triangleCount = TriangleCount;
|
||||
|
||||
if (NormTexID == 0)
|
||||
{
|
||||
RenderUniform1i(CONST_STRING_NORMALMAPEXISTS_UNIFORM, 0);
|
||||
}
|
||||
|
||||
RenderUniformMatrix3fv(CONST_STRING_MODELROTATEMATRIX_UNIFORM, false, ShaderRotateMatrix.m);
|
||||
RenderUniform3fv(CONST_STRING_MODELTRANSLATEVECTOR_UNIFORM, ShaderTranslateVector.v);
|
||||
|
||||
glActiveTexture(GL_TEXTURE1);
|
||||
glBindTexture(GL_TEXTURE_2D, NormTexID);
|
||||
|
||||
glActiveTexture(GL_TEXTURE0);
|
||||
glBindTexture(GL_TEXTURE_2D, TexID);
|
||||
|
||||
for (int i=0; i<triangleCount; i++)
|
||||
{
|
||||
|
||||
|
||||
|
||||
glBegin(GL_TRIANGLES);
|
||||
VertexAttrib3fv(CONST_STRING_NORMAL_ATTRIB, (float*)(&TriangleList.Data.Vec3CoordArr[CONST_STRING_NORMAL_ATTRIB][3*i]));
|
||||
VertexAttrib3fv(CONST_STRING_TANGENT_ATTRIB, (float*)(&TriangleList.Data.Vec3CoordArr[CONST_STRING_TANGENT_ATTRIB][3*i]));
|
||||
VertexAttrib3fv(CONST_STRING_BINORMAL_ATTRIB, (float*)(&TriangleList.Data.Vec3CoordArr[CONST_STRING_BINORMAL_ATTRIB][3*i]));
|
||||
VertexAttrib2fv(CONST_STRING_TEXCOORD_ATTRIB, (float*)(&TriangleList.Data.Vec2CoordArr[CONST_STRING_TEXCOORD_ATTRIB][3*i]));
|
||||
VertexAttrib3fv(CONST_STRING_POSITION_ATTRIB, (float*)(&TriangleList.Data.Vec3CoordArr[CONST_STRING_POSITION_ATTRIB][3*i]));
|
||||
|
||||
VertexAttrib3fv(CONST_STRING_NORMAL_ATTRIB, (float*)(&TriangleList.Data.Vec3CoordArr[CONST_STRING_NORMAL_ATTRIB][3*i + 1]));
|
||||
VertexAttrib3fv(CONST_STRING_TANGENT_ATTRIB, (float*)(&TriangleList.Data.Vec3CoordArr[CONST_STRING_TANGENT_ATTRIB][3*i + 1]));
|
||||
VertexAttrib3fv(CONST_STRING_BINORMAL_ATTRIB, (float*)(&TriangleList.Data.Vec3CoordArr[CONST_STRING_BINORMAL_ATTRIB][3*i + 1]));
|
||||
VertexAttrib2fv(CONST_STRING_TEXCOORD_ATTRIB, (float*)(&TriangleList.Data.Vec2CoordArr[CONST_STRING_TEXCOORD_ATTRIB][3*i + 1]));
|
||||
VertexAttrib3fv(CONST_STRING_POSITION_ATTRIB, (float*)(&TriangleList.Data.Vec3CoordArr[CONST_STRING_POSITION_ATTRIB][3*i + 1]));
|
||||
|
||||
VertexAttrib3fv(CONST_STRING_NORMAL_ATTRIB, (float*)(&TriangleList.Data.Vec3CoordArr[CONST_STRING_NORMAL_ATTRIB][3*i + 2]));
|
||||
VertexAttrib3fv(CONST_STRING_TANGENT_ATTRIB, (float*)(&TriangleList.Data.Vec3CoordArr[CONST_STRING_TANGENT_ATTRIB][3*i + 2]));
|
||||
VertexAttrib3fv(CONST_STRING_BINORMAL_ATTRIB, (float*)(&TriangleList.Data.Vec3CoordArr[CONST_STRING_BINORMAL_ATTRIB][3*i + 2]));
|
||||
VertexAttrib2fv(CONST_STRING_TEXCOORD_ATTRIB, (float*)(&TriangleList.Data.Vec2CoordArr[CONST_STRING_TEXCOORD_ATTRIB][3*i + 2]));
|
||||
VertexAttrib3fv(CONST_STRING_POSITION_ATTRIB, (float*)(&TriangleList.Data.Vec3CoordArr[CONST_STRING_POSITION_ATTRIB][3*i + 2]));
|
||||
glEnd();
|
||||
}
|
||||
|
||||
|
||||
RenderUniform1i(CONST_STRING_NORMALMAPEXISTS_UNIFORM, 1);
|
||||
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
void TLiteModel::DrawVBO()
|
||||
{
|
||||
CheckGlError();
|
||||
|
||||
if (NormTexID == 0)
|
||||
RenderUniform1i(CONST_STRING_NORMALMAPEXISTS_UNIFORM,0);
|
||||
|
||||
RenderUniformMatrix3fv(CONST_STRING_MODELROTATEMATRIX_UNIFORM,false,ShaderRotateMatrix.m);
|
||||
RenderUniform3fv(CONST_STRING_MODELTRANSLATEVECTOR_UNIFORM,ShaderTranslateVector.v);
|
||||
|
||||
glActiveTexture(GL_TEXTURE1);
|
||||
glBindTexture(GL_TEXTURE_2D,NormTexID);
|
||||
|
||||
glActiveTexture(GL_TEXTURE0);
|
||||
glBindTexture(GL_TEXTURE_2D,TexID);
|
||||
|
||||
Renderer->DrawTriangleList(TriangleList);
|
||||
|
||||
RenderUniform1i(CONST_STRING_NORMALMAPEXISTS_UNIFORM, 1);
|
||||
|
||||
CheckGlError();
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
void TLiteModel::MoveModel(const vec3& v)
|
||||
{
|
||||
for (cardinal i = 0; i < TriangleCount * 3; i++)
|
||||
{
|
||||
TriangleList.Data.Vec3CoordArr[CONST_STRING_POSITION_ATTRIB][i] += v;
|
||||
}
|
||||
}
|
||||
|
||||
void TLiteModel::RotateModel(const mat3& r)
|
||||
{
|
||||
|
||||
for (cardinal i = 0; i < TriangleCount * 3; i++)
|
||||
{
|
||||
TriangleList.Data.Vec3CoordArr[CONST_STRING_POSITION_ATTRIB][i] = r * TriangleList.Data.Vec3CoordArr[CONST_STRING_POSITION_ATTRIB][i];
|
||||
TriangleList.Data.Vec3CoordArr[CONST_STRING_NORMAL_ATTRIB][i] = r * TriangleList.Data.Vec3CoordArr[CONST_STRING_NORMAL_ATTRIB][i];
|
||||
TriangleList.Data.Vec3CoordArr[CONST_STRING_TANGENT_ATTRIB][i] = r * TriangleList.Data.Vec3CoordArr[CONST_STRING_TANGENT_ATTRIB][i];
|
||||
TriangleList.Data.Vec3CoordArr[CONST_STRING_BINORMAL_ATTRIB][i] = r * TriangleList.Data.Vec3CoordArr[CONST_STRING_BINORMAL_ATTRIB][i];
|
||||
}
|
||||
}
|
||||
|
||||
void TLiteModel::ScaleModel(float s)
|
||||
{
|
||||
|
||||
for (cardinal i = 0; i < TriangleCount * 3; i++)
|
||||
{
|
||||
TriangleList.Data.Vec3CoordArr[CONST_STRING_POSITION_ATTRIB][i] *= s;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
void TLiteModel::ScaleModel(const vec3& s)
|
||||
{
|
||||
|
||||
for (cardinal i = 0; i < TriangleCount * 3; i++)
|
||||
{
|
||||
TriangleList.Data.Vec3CoordArr[CONST_STRING_POSITION_ATTRIB][i].v[0] *= s.v[0];
|
||||
TriangleList.Data.Vec3CoordArr[CONST_STRING_POSITION_ATTRIB][i].v[1] *= s.v[1];
|
||||
TriangleList.Data.Vec3CoordArr[CONST_STRING_POSITION_ATTRIB][i].v[2] *= s.v[2];
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void TLiteModel::SetShaderTranslateVector(const vec3& v)
|
||||
{
|
||||
ShaderTranslateVector = v;
|
||||
}
|
||||
|
||||
void TLiteModel::SetShaderRotateMatrix(const mat3& m)
|
||||
{
|
||||
ShaderRotateMatrix = m;
|
||||
}
|
||||
|
||||
|
||||
//===================================================
|
||||
//=============== MODEL MANAGER =====================
|
||||
//===================================================
|
||||
|
||||
TModelManager::~TModelManager()
|
||||
{
|
||||
|
||||
Clear();
|
||||
|
||||
*Console<<"ResourceManager::ModelManager deleting";
|
||||
}
|
||||
|
||||
void TModelManager::Clear()
|
||||
{
|
||||
if (LiteModelMap.size() != 0)
|
||||
{
|
||||
LiteModelMap.clear();
|
||||
*Console<<"ResourceManager::ModelManager cleared";
|
||||
}
|
||||
}
|
||||
|
||||
TLiteModelResource& TModelManager::operator[](const std::string& s)
|
||||
{
|
||||
if (LiteModelMap.count(s) == 0)
|
||||
{
|
||||
throw ErrorToLog("Lite model with name " + s + " not loaded!");
|
||||
}
|
||||
|
||||
return LiteModelMap[s];
|
||||
}
|
||||
|
||||
bool TModelManager::AddLiteModel(const std::string& filename, const std::string& pathToResources)
|
||||
{
|
||||
cardinal fileSize;
|
||||
|
||||
std::string modelName = GetFileName(filename);
|
||||
|
||||
//If model already exists
|
||||
if (LiteModelMap.count(modelName) != 0)
|
||||
return true;
|
||||
|
||||
boost::shared_array<byte> fileArr = CreateMemFromFile<byte>((ResourceManager->PathToResources + filename), fileSize);
|
||||
|
||||
if (!(fileArr[0] == 'L' && fileArr[1] == 'M' && fileArr[2] == 0 && fileArr[3] == 1))
|
||||
throw ErrorFileNotCorrect(filename);
|
||||
|
||||
|
||||
LiteModelMap[modelName].SetPathToResource(GetFilePath(ResourceManager->PathToResources + filename));
|
||||
|
||||
bool result = LiteModelMap[modelName].LoadModel(fileArr, fileSize);
|
||||
|
||||
if (!result)
|
||||
throw ErrorFileNotLoaded(filename);
|
||||
|
||||
*Console<<"Lite model added successfully: "+filename;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void TModelManager::DeleteLiteModel(const std::string& modelname)
|
||||
{
|
||||
LiteModelMap.erase(modelname);
|
||||
*Console<<"ResourceManager::ModelManager model deleted: "+modelname;
|
||||
}
|
||||
|
||||
|
||||
} //namespace SE
|
||||
@@ -0,0 +1,145 @@
|
||||
#include "include/ModelManager/NewModelManager.h"
|
||||
|
||||
#include "include/Utils/Utils.h"
|
||||
#include "include/Engine.h"
|
||||
|
||||
namespace SE
|
||||
{
|
||||
|
||||
const int CONST_DATA_STACK_SIZE = 20;
|
||||
|
||||
void TFlexModelResource::Serialize(boost::property_tree::ptree& propertyTree)
|
||||
{
|
||||
|
||||
BOOST_FOREACH(auto& ptree, propertyTree.get_child("Model.Vec3ArrMap"))
|
||||
{
|
||||
|
||||
std::string name = ptree.second.get<std::string>("<xmlattr>.name");
|
||||
|
||||
|
||||
BOOST_FOREACH(auto& vec3tree, ptree.second.get_child(""))
|
||||
{
|
||||
if (vec3tree.first == "Vec3")
|
||||
{
|
||||
DataTriangleList.Vec3CoordArr[name].push_back(StringToVec3(vec3tree.second.get<std::string>("")));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
BOOST_FOREACH(auto& ptree, propertyTree.get_child("Model.Vec2ArrMap"))
|
||||
{
|
||||
std::string name = ptree.second.get<std::string>("<xmlattr>.name");
|
||||
|
||||
BOOST_FOREACH(auto& vec2tree, ptree.second.get_child(""))
|
||||
{
|
||||
if (vec2tree.first == "Vec2")
|
||||
{
|
||||
DataTriangleList.Vec2CoordArr[name].push_back(StringToVec2(vec2tree.second.get<std::string>("")));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
BOOST_FOREACH(auto& ptree, propertyTree.get_child("Model.SamplerMap"))
|
||||
{
|
||||
if (ptree.first == "Sampler")
|
||||
{
|
||||
std::string name = ptree.second.get<std::string>("<xmlattr>.name");
|
||||
std::string value = ptree.second.get<std::string>("<xmlattr>.value");
|
||||
|
||||
SamplerMap[name] = value;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
void TFlexModel::PushModelDataTriangleList()
|
||||
{
|
||||
if (DataTriangleListStack.size() == CONST_DATA_STACK_SIZE)
|
||||
{
|
||||
throw ErrorToLog("Error in TFlexModel::PushModelDataTriangleList - stack overflow!");
|
||||
}
|
||||
|
||||
DataTriangleListStack.push(RenderPair.second.Data);
|
||||
}
|
||||
|
||||
void TFlexModel::PopModelDataTriangleList()
|
||||
{
|
||||
if (DataTriangleListStack.size() == 0)
|
||||
{
|
||||
throw ErrorToLog("Error in TFlexModel::PushModelDataTriangleList - stack underflow!");
|
||||
}
|
||||
|
||||
RenderPair.second.Data = DataTriangleListStack.top();
|
||||
|
||||
DataTriangleListStack.pop();
|
||||
}
|
||||
|
||||
void TFlexModel::MoveModel(const vec3& v)
|
||||
{
|
||||
MoveDataTriangleList(RenderPair.second.Data, v);
|
||||
}
|
||||
|
||||
void TFlexModel::RotateModel(const mat3& r)
|
||||
{
|
||||
RotateDataTriangleList(RenderPair.second.Data, r);
|
||||
}
|
||||
|
||||
void TFlexModel::ScaleModel(float s)
|
||||
{
|
||||
ScaleDataTriangleList(RenderPair.second.Data, s);
|
||||
}
|
||||
|
||||
void TFlexModel::ScaleModel(const vec3& s)
|
||||
{
|
||||
ScaleDataTriangleList(RenderPair.second.Data, s);
|
||||
}
|
||||
|
||||
void TFlexModel::RefreshBuffer()
|
||||
{
|
||||
RenderPair.second.RefreshBuffer();
|
||||
}
|
||||
|
||||
void TFlexModel::Draw()
|
||||
{
|
||||
TRenderParamsSetter setter(RenderPair.first);
|
||||
|
||||
Renderer->DrawTriangleList(RenderPair.second);
|
||||
}
|
||||
|
||||
|
||||
void TFlexModelManager::LoadModelFromXml(std::string xmlFileName)
|
||||
{
|
||||
TFlexModelResource model;
|
||||
|
||||
std::string modelName = GetFileName(xmlFileName);
|
||||
std::string modelPath = GetFilePath(xmlFileName);
|
||||
|
||||
model.Serialize(*FileToPropertyTree(xmlFileName));
|
||||
|
||||
FlexModelResourceMap[modelName] = model;
|
||||
}
|
||||
|
||||
TFlexModel TFlexModelManager::InstanciateModel(const std::string& modelName)
|
||||
{
|
||||
if (FlexModelResourceMap.count(modelName) == 0)
|
||||
{
|
||||
throw ErrorToLog("Model not loaded: " + modelName);
|
||||
}
|
||||
|
||||
TFlexModel model;
|
||||
|
||||
model.RenderPair.second.Data = FlexModelResourceMap[modelName].DataTriangleList;
|
||||
|
||||
model.RenderPair.second.RefreshBuffer();
|
||||
|
||||
model.RenderPair.first.SamplerMap = FlexModelResourceMap[modelName].SamplerMap;
|
||||
|
||||
return model;
|
||||
}
|
||||
|
||||
|
||||
|
||||
} //namespace SE
|
||||
Reference in new issue
Block a user