1 Commits

Author SHA1 Message Date
Youssef Assem bab419d197 start 2019-12-18 23:09:56 +02:00
12 changed files with 3504 additions and 0 deletions
+9
View File
@@ -0,0 +1,9 @@
#include "COLLADA.h"
COLLADA::COLLADA(const char* filename)
{
tinyxml2::XMLDocument doc;
doc.LoadFile(filename);
tinyxml2::XMLElement* xml = doc.FirstChildElement("COLLADA");
m_GeometryLibrary = GeometryLibrary(xml->FirstChildElement("library_geometries"));
}
+18
View File
@@ -0,0 +1,18 @@
#pragma once
#include "GeometryLibrary.h"
class COLLADA
{
private:
GeometryLibrary m_GeometryLibrary;
//ImagesLibrary m_ImagesLibrary;
//EffectsLibrary m_EffectsLibrary;
//MaterialLibrary m_MaterialLibrary;
//ControllerLibrary m_ControllerLibrary;
//AnimationLibrary m_AnimationLibrary;
VisualSceneLibrary m_VisualSceneLibrary;
public:
COLLADA() = default;
COLLADA(const char* filename);
};
+9
View File
@@ -0,0 +1,9 @@
#include "GeometryLibrary.h"
GeometryLibrary::GeometryLibrary(tinyxml2::XMLElement* xml)
{
auto xm = xml;
auto g = Geometry(xml->FirstChildElement("geometry"));
m_Geometries.push_back(g);
}
+22
View File
@@ -0,0 +1,22 @@
#pragma once
#include <vector>
#include "geometry.h"
class GeometryLibrary
{
std::vector<Geometry> m_Geometries;
public:
GeometryLibrary() = default;
GeometryLibrary(tinyxml2::XMLElement * xml);
};
class VisualSceneLibrary
{
Visualscene m_visual_scene;
public:
VisualSceneLibrary() = default;
VisualSceneLibrary(tinyxml2::XMLElement* xml);
};
+6
View File
@@ -115,8 +115,11 @@
</Link> </Link>
</ItemDefinitionGroup> </ItemDefinitionGroup>
<ItemGroup> <ItemGroup>
<ClCompile Include="COLLADA.cpp" />
<ClCompile Include="ColladaModel.cpp" /> <ClCompile Include="ColladaModel.cpp" />
<ClCompile Include="data.cpp" />
<ClCompile Include="geometry.cpp" /> <ClCompile Include="geometry.cpp" />
<ClCompile Include="GeometryLibrary.cpp" />
<ClCompile Include="main.cpp" /> <ClCompile Include="main.cpp" />
<ClCompile Include="model.cpp" /> <ClCompile Include="model.cpp" />
<ClCompile Include="renderer.cpp" /> <ClCompile Include="renderer.cpp" />
@@ -125,8 +128,11 @@
<ClCompile Include="util_window.cpp" /> <ClCompile Include="util_window.cpp" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClInclude Include="COLLADA.h" />
<ClInclude Include="ColladaModel.h" /> <ClInclude Include="ColladaModel.h" />
<ClInclude Include="data.h" />
<ClInclude Include="geometry.h" /> <ClInclude Include="geometry.h" />
<ClInclude Include="GeometryLibrary.h" />
<ClInclude Include="model.h" /> <ClInclude Include="model.h" />
<ClInclude Include="renderer.h" /> <ClInclude Include="renderer.h" />
<ClInclude Include="tgaimage.h" /> <ClInclude Include="tgaimage.h" />
+18
View File
@@ -39,6 +39,15 @@
<ClCompile Include="tinyxml2.cpp"> <ClCompile Include="tinyxml2.cpp">
<Filter>Source Files</Filter> <Filter>Source Files</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="COLLADA.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="GeometryLibrary.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="data.cpp">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClInclude Include="util_window.h"> <ClInclude Include="util_window.h">
@@ -62,5 +71,14 @@
<ClInclude Include="tinyxml2.h"> <ClInclude Include="tinyxml2.h">
<Filter>Header Files</Filter> <Filter>Header Files</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="COLLADA.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="GeometryLibrary.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="data.h">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup> </ItemGroup>
</Project> </Project>
+187
View File
@@ -0,0 +1,187 @@
#include "data.h"
Float_Array::Float_Array(tinyxml2::XMLElement* xml)
{
xml->QueryIntAttribute("count", (int*)&m_Count);
const char* ch;
xml->QueryStringAttribute("count", &ch);
std::string s(ch);
m_ID = s;
std::stringstream str(xml->GetText());
m_Floats = new float[m_Count];
for (int i = 0; i < m_Count; i++)
{
str >> m_Floats[i];
}
float f = m_Floats[55358];
}
Name_Array::Name_Array(tinyxml2::XMLElement* xml)
{
xml->QueryIntAttribute("count", (int*)&m_Count);
const char* ch;
xml->QueryStringAttribute("count", &ch);
std::string s(ch);
m_ID = s;
std::stringstream str(xml->GetText());
for (int i = 0; i < m_Count; i++)
{
str >> m_Names[i];
}
}
Param::Param(tinyxml2::XMLElement* xml)
{
const char* ch;
xml->QueryStringAttribute("name", &ch);
std::string s(ch);
m_Name = s;
const char* ch1;
xml->QueryStringAttribute("type", &ch1);
std::string s1(ch1);
m_Type = s1;
}
Accessor::Accessor(tinyxml2::XMLElement* xml)
{
const char* ch;
xml->QueryStringAttribute("source", &ch);
std::string s(ch);
m_Source = s;
xml->QueryIntAttribute("count", (int*)&m_Count);
xml->QueryIntAttribute("stride", (int*)&m_Stride);
for (tinyxml2::XMLElement* child = xml->FirstChildElement("param"); child != NULL; child = child->NextSiblingElement("param"))
{
Param p(child);
m_Params.push_back(p);
}
}
Technique_Common::Technique_Common(tinyxml2::XMLElement* xml)
{
m_Accessor = Accessor(xml->FirstChildElement("accessor"));
}
Source::Source(tinyxml2::XMLElement* xml)
{
const char* ch;
xml->QueryStringAttribute("id", &ch);
std::string s(ch);
m_ID = s;
tinyxml2::XMLElement* fa = xml->FirstChildElement("float_array");
if (fa != NULL)
{
m_Float_Array = Float_Array(fa);
}
tinyxml2::XMLElement* na = xml->FirstChildElement("Name_array");
if (na != NULL)
{
m_Name_Array = Name_Array(na);
}
m_TechniqueCommon = Technique_Common(xml->FirstChildElement("technique_common"));
}
Input::Input(tinyxml2::XMLElement* xml)
{
const char* ch;
xml->QueryStringAttribute("semantic", &ch);
std::string s(ch);
m_Semantic = s;
const char* ch1;
xml->QueryStringAttribute("source", &ch1);
std::string s1(ch1);
m_Source = s1;
if (xml->FindAttribute("offset"))
{
const char* ch2;
xml->QueryStringAttribute("offset", &ch2);
std::string s2(ch2);
m_Offset = s2;
}
if (xml->FindAttribute("set"))
{
const char* ch3;
xml->QueryStringAttribute("set", &ch3);
std::string s3(ch3);
m_Set = s3;
}
}
Vertices::Vertices(tinyxml2::XMLElement* xml)
{
const char* ch;
xml->QueryStringAttribute("id", &ch);
std::string s(ch);
m_ID = s;
for (tinyxml2::XMLElement* child = xml->FirstChildElement("input"); child != NULL; child = child->NextSiblingElement("input"))
{
Input in(child);
m_Inputs.push_back(in);
}
}
P::P(tinyxml2::XMLElement* xml, unsigned int count)
{
m_Count = count;
std::stringstream str(xml->GetText());
m_Indices = new unsigned short[count * 9];
for (int i = 0; i < count * 9; i++)
{
str >> m_Indices[i];
}
}
Triangles::Triangles(tinyxml2::XMLElement* xml)
{
xml->QueryIntAttribute("count", (int*)&m_Count);
const char* ch;
xml->QueryStringAttribute("count", &ch);
std::string s(ch);
m_Material = s;
for (tinyxml2::XMLElement* child = xml->FirstChildElement("input"); child != NULL; child = child->NextSiblingElement("input"))
{
Input in(child);
m_Inputs.push_back(in);
}
tinyxml2::XMLElement* mp = xml->FirstChildElement("p");
if (mp != NULL)
{
m_P = P(mp, m_Count);
}
}
Mesh::Mesh(tinyxml2::XMLElement* xml)
{
for (tinyxml2::XMLElement* child = xml->FirstChildElement("source"); child != NULL; child = child->NextSiblingElement("source"))
{
Source sc(child);
m_Sources.push_back(sc);
}
m_Vertices = Vertices(xml->FirstChildElement("vertices"));
for (tinyxml2::XMLElement* child = xml->FirstChildElement("triangles"); child != NULL; child = child->NextSiblingElement("triangles"))
{
Triangles tr(child);
m_Triangles.push_back(tr);
}
}
+137
View File
@@ -0,0 +1,137 @@
#pragma once
#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
#include <vector>
#include "tinyxml2.h"
//----------------------------------------------//
class Float_Array
{
unsigned int m_Count;
std::string m_ID;
float* m_Floats;
public:
Float_Array() = default;
Float_Array(tinyxml2::XMLElement* xml);
};
//----------------------------------------------//
class Name_Array
{
unsigned int m_Count;
std::string m_ID;
std::string* m_Names;
public:
Name_Array() = default;
Name_Array(tinyxml2::XMLElement* xml);
};
//----------------------------------------------//
class Param
{
std::string m_Name;
std::string m_Type;
public:
Param() = default;
Param(tinyxml2::XMLElement* xml);
};
//----------------------------------------------//
class Accessor
{
std::string m_Source;
unsigned int m_Count;
unsigned int m_Stride;
std::vector<Param> m_Params;
public:
Accessor () = default;
Accessor(tinyxml2::XMLElement* xml);
};
//----------------------------------------------//
class Technique_Common
{
Accessor m_Accessor;
public:
Technique_Common() = default;
Technique_Common(tinyxml2::XMLElement* xml);
};
//----------------------------------------------//
class Source
{
std::string m_ID;
Float_Array m_Float_Array;
Name_Array m_Name_Array;
Technique_Common m_TechniqueCommon;
public:
Source() = default;
Source(tinyxml2::XMLElement* xml);
};
//----------------------------------------------//
class Input
{
std::string m_Semantic;
std::string m_Source;
std::string m_Offset;
std::string m_Set;
public:
Input() = default;
Input(tinyxml2::XMLElement* xml);
};
//----------------------------------------------//
class Vertices
{
std::string m_ID;
std::vector<Input> m_Inputs;
public:
Vertices() = default;
Vertices(tinyxml2::XMLElement* xml);
};
//----------------------------------------------//
class P
{
unsigned int m_Count;
unsigned short* m_Indices;
public:
P() = default;
P(tinyxml2::XMLElement* xml, unsigned int count);
};
//----------------------------------------------//
class Triangles
{
unsigned int m_Count;
std::string m_Material;
std::vector<Input> m_Inputs;
P m_P;
public:
Triangles() = default;
Triangles(tinyxml2::XMLElement* xml);
};
//----------------------------------------------//
class Mesh
{
std::vector<Source> m_Sources;
Vertices m_Vertices;
std::vector<Triangles> m_Triangles;
public:
Mesh() = default;
Mesh(tinyxml2::XMLElement* xml);
};
//----------------------------------------------//
class Node
{
std::string m_ID;
std::string m_name;
std::string m_type;
std::string m_sid;
public:
Node() = default;
Node(tinyxml2::XMLElement* xml);
};
//----------------------------------------------//
class Matrix
{
std::string m_sid;
public:
Node() = default;
Node(tinyxml2::XMLElement* xml);
};
//----------------------------------------------//
+4
View File
@@ -5,3 +5,7 @@ template <> template <> vec<3,float>::vec(const vec<3,int> &v) : x(v.x),y(v.y)
template <> template <> vec<2,int> ::vec(const vec<2,float> &v) : x(int(v.x+.5f)),y(int(v.y+.5f)) {} template <> template <> vec<2,int> ::vec(const vec<2,float> &v) : x(int(v.x+.5f)),y(int(v.y+.5f)) {}
template <> template <> vec<2,float>::vec(const vec<2,int> &v) : x(v.x),y(v.y) {} template <> template <> vec<2,float>::vec(const vec<2,int> &v) : x(v.x),y(v.y) {}
Geometry::Geometry(tinyxml2::XMLElement* xml)
{
m_Mesh = Mesh(xml->FirstChildElement("mesh"));
}
+42
View File
@@ -4,6 +4,7 @@
#include <vector> #include <vector>
#include <cassert> #include <cassert>
#include <iostream> #include <iostream>
#include "data.h"
template<size_t DimCols,size_t DimRows,typename T> class mat; template<size_t DimCols,size_t DimRows,typename T> class mat;
@@ -233,5 +234,46 @@ typedef vec<3, float> Vec3f;
typedef vec<3, int> Vec3i; typedef vec<3, int> Vec3i;
typedef vec<4, float> Vec4f; typedef vec<4, float> Vec4f;
typedef mat<4,4,float> Matrix; typedef mat<4,4,float> Matrix;
class Geometry
{
Mesh m_Mesh;
public:
Geometry() = default;
Geometry(tinyxml2::XMLElement * xml);
};
class Visualscene
{
node m_Mesh;
public:
Visualscene() = default;
Visualscene(tinyxml2::XMLElement* xml);
};
#endif //__GEOMETRY_H__ #endif //__GEOMETRY_H__
+2
View File
@@ -9,6 +9,7 @@
#include "util_window.h" #include "util_window.h"
#include <ctime> #include <ctime>
#include "ColladaModel.h" #include "ColladaModel.h"
#include "COLLADA.h"
const TGAColor white = TGAColor(255, 255, 255, 255); const TGAColor white = TGAColor(255, 255, 255, 255);
const TGAColor red = TGAColor(255, 0, 0, 255); const TGAColor red = TGAColor(255, 0, 0, 255);
@@ -188,6 +189,7 @@ Matrix lookat(Vec3f eye, Vec3f center, Vec3f up) {
void render() void render()
{ {
COLLADA C("sssssssssssss.dae");
ColladaModel* model = new ColladaModel("african_head.dae"); ColladaModel* model = new ColladaModel("african_head.dae");
Matrix ViewPort = viewport(screen_width / 8, screen_height / 8, screen_width * 3 / 4, screen_height * 3 / 4); Matrix ViewPort = viewport(screen_width / 8, screen_height / 8, screen_width * 3 / 4, screen_height * 3 / 4);
Matrix Projection = Matrix::identity(); Matrix Projection = Matrix::identity();
File diff suppressed because one or more lines are too long