//Mesh.h
#include <string>
#include "glut\include\GL\glew.h"
#include "glut\include\GL\glut.h"
#include <assimp/Importer.hpp> // C++ importer interface
#include <assimp/scene.h> // Output data structure
#include <assimp/postprocess.h> // Post processing fla
//#include "glm\glm.hpp"
//textures
#include <SOIL.h>
class Mesh
{
public :
//struct Bone
//{
//char *name;
//glm::mat4 inverse_bone_matrix;
//};
Mesh( void ) ;
Mesh( std:: string filename, std:: string textureFilename, float x, float y, float z, float width, float height, float depth, float rotX, float rotY, float rotZ) ;
~Mesh( void ) ;
void Init( std:: string filename) ;
void LoadTexture( std:: string textureName) ;
void Draw( ) ;
private :
GLfloat * vertexArray;
GLfloat * normalArray;
GLfloat * uvArray;
//Bone *boneArray;
GLint numVerts;
GLuint m_Texture[ 1 ] ;
float m_CenterX, m_CenterY, m_CenterZ, m_Width, m_Height, m_Depth;
float m_XRotation, m_YRotation, m_ZRotation;
} ;
//Mesh.cpp
#include "Mesh.h"
Mesh:: Mesh ( void )
{
}
Mesh:: Mesh ( std:: string filename, std:: string textureFilename, float x, float y, float z, float width, float height, float depth, float rotX, float rotY, float rotZ)
{
//fills in variables
Init( filename) ;
LoadTexture( textureFilename) ;
}
Mesh:: ~Mesh( void )
{
}
void Mesh:: Init ( std:: string filename)
{
Assimp:: Importer importer;
const aiScene * scene = importer.ReadFile ( filename,aiProcessPreset_TargetRealtime_Fast) ; //aiProcessPreset_TargetRealtime_Fast has the configs you'll need
aiMesh * mesh = scene- > mMeshes[ 0 ] ; //assuming you only want the first mesh
numVerts = mesh- > mNumFaces* 3 ;
vertexArray = new float [ mesh- > mNumFaces* 3 * 3 ] ;
normalArray = new float [ mesh- > mNumFaces* 3 * 3 ] ;
uvArray = new float [ mesh- > mNumFaces* 3 * 2 ] ;
//boneArray = new Bone[mesh->mNumBones*3*4];
for ( unsigned int i= 0 ; i< mesh- > mNumFaces; i++ )
{
const aiFace& face = mesh- > mFaces[ i] ;
for ( int j= 0 ; j< 3 ; j++ )
{
aiVector3D uv = mesh- > mTextureCoords[ 0 ] [ face.mIndices [ j] ] ;
memcpy ( uvArray,& uv,sizeof ( float ) * 2 ) ;
uvArray+ = 2 ;
aiVector3D normal = mesh- > mNormals[ face.mIndices [ j] ] ;
memcpy ( normalArray,& normal,sizeof ( float ) * 3 ) ;
normalArray+ = 3 ;
aiVector3D pos = mesh- > mVertices[ face.mIndices [ j] ] ;
memcpy ( vertexArray,& pos,sizeof ( float ) * 3 ) ;
vertexArray+ = 3 ;
}
}
//for (unsigned int boneindex = 0; boneindex < mesh->mNumBones; boneindex++)
//{
// Bone b;
// b.name = mesh->mBones[boneindex]->mName;
// for (int weightindex = 0; weightindex < mesh->mBones[boneindex]->mNumWeights; weightindex++)
// {
// glm::mat4 temp = toMat4(&mesh->mBones[boneindex]->mOffsetMatrix);
// memcpy(boneArray, &b, sizeof(Bone) * 4);
// boneArray += 4;
// }
//}
uvArray- = mesh- > mNumFaces* 3 * 2 ;
normalArray- = mesh- > mNumFaces* 3 * 3 ;
vertexArray- = mesh- > mNumFaces* 3 * 3 ;
//boneArray -= mesh->mNumFaces*3*4;
}
void Mesh:: LoadTexture ( std:: string textureName)
{
}
void Mesh:: Draw ( )
{
glPushMatrix( ) ;
glTranslatef( m_CenterX, m_CenterY, m_CenterZ) ;
glRotatef( m_XRotation, 1 , 0 , 0 ) ;
glRotatef( m_YRotation, 0 , 1 , 0 ) ;
glRotatef( m_ZRotation, 0 , 0 , 1 ) ;
glScalef( m_Width, m_Height, m_Depth) ;
glEnableClientState( GL_NORMAL_ARRAY) ;
glEnableClientState( GL_TEXTURE_COORD_ARRAY) ;
glEnableClientState( GL_VERTEX_ARRAY) ;
glNormalPointer( GL_FLOAT,0 ,normalArray) ;
glTexCoordPointer( 2 ,GL_FLOAT,0 ,uvArray) ;
glVertexPointer( 3 ,GL_FLOAT,0 ,vertexArray) ;
glActiveTexture( GL_TEXTURE0) ;
glBindTexture( GL_TEXTURE_2D, m_Texture[ 0 ] ) ;
glDrawArrays( GL_TRIANGLES,0 ,numVerts) ;
glDisableClientState( GL_NORMAL_ARRAY) ;
glDisableClientState( GL_TEXTURE_COORD_ARRAY) ;
glDisableClientState( GL_VERTEX_ARRAY) ;
glPopMatrix( ) ;
}
ICAgIC8vTWVzaC5oCiAgICAjaW5jbHVkZSA8c3RyaW5nPgogICAgIAogICAgI2luY2x1ZGUgImdsdXRcaW5jbHVkZVxHTFxnbGV3LmgiCiAgICAjaW5jbHVkZSAiZ2x1dFxpbmNsdWRlXEdMXGdsdXQuaCIKICAgICAKICAgICNpbmNsdWRlIDxhc3NpbXAvSW1wb3J0ZXIuaHBwPiAvLyBDKysgaW1wb3J0ZXIgaW50ZXJmYWNlCiAgICAjaW5jbHVkZSA8YXNzaW1wL3NjZW5lLmg+IC8vIE91dHB1dCBkYXRhIHN0cnVjdHVyZQogICAgI2luY2x1ZGUgPGFzc2ltcC9wb3N0cHJvY2Vzcy5oPiAvLyBQb3N0IHByb2Nlc3NpbmcgZmxhCiAgICAgCgkJICAgICAvLyNpbmNsdWRlICJnbG1cZ2xtLmhwcCIKICAgICAKICAgIC8vdGV4dHVyZXMKICAgICNpbmNsdWRlIDxTT0lMLmg+CiAgICAgCiAgICBjbGFzcyBNZXNoCiAgICB7CiAgICBwdWJsaWM6CiAgICAJCS8vc3RydWN0IEJvbmUKCQkJLy97CgkJCQkvL2NoYXIgKm5hbWU7CgkJCQkvL2dsbTo6bWF0NCBpbnZlcnNlX2JvbmVfbWF0cml4OwoJCQkvL307CiAgICAKICAgIE1lc2godm9pZCk7CiAgICBNZXNoKHN0ZDo6c3RyaW5nIGZpbGVuYW1lLCBzdGQ6OnN0cmluZyB0ZXh0dXJlRmlsZW5hbWUsIGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHosIGZsb2F0IHdpZHRoLCBmbG9hdCBoZWlnaHQsIGZsb2F0IGRlcHRoLCBmbG9hdCByb3RYLCBmbG9hdCByb3RZLCBmbG9hdCByb3RaKTsKICAgIH5NZXNoKHZvaWQpOwogICAgIAogICAgdm9pZCBJbml0KHN0ZDo6c3RyaW5nIGZpbGVuYW1lKTsKICAgIHZvaWQgTG9hZFRleHR1cmUoc3RkOjpzdHJpbmcgdGV4dHVyZU5hbWUpOwogICAgdm9pZCBEcmF3KCk7CiAgICAgCiAgICBwcml2YXRlOgogICAgR0xmbG9hdCAqdmVydGV4QXJyYXk7CiAgICBHTGZsb2F0ICpub3JtYWxBcnJheTsKICAgIEdMZmxvYXQgKnV2QXJyYXk7CiAgICAKICAgIAkJIC8vQm9uZSAqYm9uZUFycmF5OwogICAgCQkgCiAgICBHTGludCBudW1WZXJ0czsKICAgICAKICAgIEdMdWludCBtX1RleHR1cmVbMV07CiAgICAgCiAgICBmbG9hdCBtX0NlbnRlclgsIG1fQ2VudGVyWSwgbV9DZW50ZXJaLCBtX1dpZHRoLCBtX0hlaWdodCwgbV9EZXB0aDsKICAgIGZsb2F0IG1fWFJvdGF0aW9uLCBtX1lSb3RhdGlvbiwgbV9aUm90YXRpb247CiAgICB9OwogICAgIAogICAgLy9NZXNoLmNwcAogICAgI2luY2x1ZGUgIk1lc2guaCIKICAgICAKICAgIE1lc2g6Ok1lc2godm9pZCkKICAgIHsKICAgIH0KICAgICAKICAgIE1lc2g6Ok1lc2goc3RkOjpzdHJpbmcgZmlsZW5hbWUsIHN0ZDo6c3RyaW5nIHRleHR1cmVGaWxlbmFtZSwgZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeiwgZmxvYXQgd2lkdGgsIGZsb2F0IGhlaWdodCwgZmxvYXQgZGVwdGgsIGZsb2F0IHJvdFgsIGZsb2F0IHJvdFksIGZsb2F0IHJvdFopCiAgICB7CiAgICAvL2ZpbGxzIGluIHZhcmlhYmxlcwogICAgSW5pdChmaWxlbmFtZSk7CiAgICBMb2FkVGV4dHVyZSh0ZXh0dXJlRmlsZW5hbWUpOwogICAgfQogICAgIAogICAgTWVzaDo6fk1lc2godm9pZCkKICAgIHsKICAgICAKICAgIH0KICAgICAKICAgIHZvaWQgTWVzaDo6SW5pdChzdGQ6OnN0cmluZyBmaWxlbmFtZSkKICAgIHsKICAgIEFzc2ltcDo6SW1wb3J0ZXIgaW1wb3J0ZXI7CiAgICBjb25zdCBhaVNjZW5lICpzY2VuZSA9IGltcG9ydGVyLlJlYWRGaWxlKGZpbGVuYW1lLGFpUHJvY2Vzc1ByZXNldF9UYXJnZXRSZWFsdGltZV9GYXN0KTsvL2FpUHJvY2Vzc1ByZXNldF9UYXJnZXRSZWFsdGltZV9GYXN0IGhhcyB0aGUgY29uZmlncyB5b3UnbGwgbmVlZAogICAgIAogICAgYWlNZXNoICptZXNoID0gc2NlbmUtPm1NZXNoZXNbMF07IC8vYXNzdW1pbmcgeW91IG9ubHkgd2FudCB0aGUgZmlyc3QgbWVzaAogICAgIAogICAgbnVtVmVydHMgPSBtZXNoLT5tTnVtRmFjZXMqMzsKICAgICAKICAgIHZlcnRleEFycmF5ID0gbmV3IGZsb2F0W21lc2gtPm1OdW1GYWNlcyozKjNdOwogICAgbm9ybWFsQXJyYXkgPSBuZXcgZmxvYXRbbWVzaC0+bU51bUZhY2VzKjMqM107CiAgICB1dkFycmF5ID0gbmV3IGZsb2F0W21lc2gtPm1OdW1GYWNlcyozKjJdOwoJCQkvL2JvbmVBcnJheSA9IG5ldyBCb25lW21lc2gtPm1OdW1Cb25lcyozKjRdOwoJCQkKICAgIGZvcih1bnNpZ25lZCBpbnQgaT0wO2k8bWVzaC0+bU51bUZhY2VzO2krKykKICAgIHsKICAgIGNvbnN0IGFpRmFjZSYgZmFjZSA9IG1lc2gtPm1GYWNlc1tpXTsKICAgICAKICAgIGZvcihpbnQgaj0wO2o8MztqKyspCiAgICB7CiAgICBhaVZlY3RvcjNEIHV2ID0gbWVzaC0+bVRleHR1cmVDb29yZHNbMF1bZmFjZS5tSW5kaWNlc1tqXV07CiAgICBtZW1jcHkodXZBcnJheSwmdXYsc2l6ZW9mKGZsb2F0KSoyKTsKICAgIHV2QXJyYXkrPTI7CiAgICAgCiAgICBhaVZlY3RvcjNEIG5vcm1hbCA9IG1lc2gtPm1Ob3JtYWxzW2ZhY2UubUluZGljZXNbal1dOwogICAgbWVtY3B5KG5vcm1hbEFycmF5LCZub3JtYWwsc2l6ZW9mKGZsb2F0KSozKTsKICAgIG5vcm1hbEFycmF5Kz0zOwogICAgIAogICAgYWlWZWN0b3IzRCBwb3MgPSBtZXNoLT5tVmVydGljZXNbZmFjZS5tSW5kaWNlc1tqXV07CiAgICBtZW1jcHkodmVydGV4QXJyYXksJnBvcyxzaXplb2YoZmxvYXQpKjMpOwogICAgdmVydGV4QXJyYXkrPTM7CiAgICB9CiAgICB9CiAgICAgCgkJICAgIC8vZm9yICh1bnNpZ25lZCBpbnQgYm9uZWluZGV4ID0gMDsgYm9uZWluZGV4IDwgbWVzaC0+bU51bUJvbmVzOyBib25laW5kZXgrKykKCQkJLy97CgkJCS8vCUJvbmUgYjsKCQkJLy8JYi5uYW1lID0gbWVzaC0+bUJvbmVzW2JvbmVpbmRleF0tPm1OYW1lOwoJCQkvLwlmb3IgKGludCB3ZWlnaHRpbmRleCA9IDA7IHdlaWdodGluZGV4IDwgbWVzaC0+bUJvbmVzW2JvbmVpbmRleF0tPm1OdW1XZWlnaHRzOyB3ZWlnaHRpbmRleCsrKQoJCQkvLwl7CgkJCS8vCQlnbG06Om1hdDQgdGVtcCA9IHRvTWF0NCgmbWVzaC0+bUJvbmVzW2JvbmVpbmRleF0tPm1PZmZzZXRNYXRyaXgpOwoJCQkvLwkJbWVtY3B5KGJvbmVBcnJheSwgJmIsIHNpemVvZihCb25lKSAqIDQpOwoJCQkvLwkJYm9uZUFycmF5ICs9IDQ7CgkJCS8vCX0KCQkJLy99CgogICAgIAogICAgdXZBcnJheS09bWVzaC0+bU51bUZhY2VzKjMqMjsKICAgIG5vcm1hbEFycmF5LT1tZXNoLT5tTnVtRmFjZXMqMyozOwogICAgdmVydGV4QXJyYXktPW1lc2gtPm1OdW1GYWNlcyozKjM7CgkJCS8vYm9uZUFycmF5IC09IG1lc2gtPm1OdW1GYWNlcyozKjQ7CiAgICB9CiAgICAgCiAgICB2b2lkIE1lc2g6OkxvYWRUZXh0dXJlKHN0ZDo6c3RyaW5nIHRleHR1cmVOYW1lKQogICAgewogICAgCiAgICB9CiAgICAgCiAgICB2b2lkIE1lc2g6OkRyYXcoKQogICAgewogICAgZ2xQdXNoTWF0cml4KCk7CiAgICBnbFRyYW5zbGF0ZWYobV9DZW50ZXJYLCBtX0NlbnRlclksIG1fQ2VudGVyWik7CiAgICAgCiAgICBnbFJvdGF0ZWYobV9YUm90YXRpb24sIDEsIDAsIDApOwogICAgZ2xSb3RhdGVmKG1fWVJvdGF0aW9uLCAwLCAxLCAwKTsKICAgIGdsUm90YXRlZihtX1pSb3RhdGlvbiwgMCwgMCwgMSk7CiAgICAgCiAgICBnbFNjYWxlZihtX1dpZHRoLCBtX0hlaWdodCwgbV9EZXB0aCk7CiAgICAgCiAgICBnbEVuYWJsZUNsaWVudFN0YXRlKEdMX05PUk1BTF9BUlJBWSk7CiAgICBnbEVuYWJsZUNsaWVudFN0YXRlKEdMX1RFWFRVUkVfQ09PUkRfQVJSQVkpOwogICAgZ2xFbmFibGVDbGllbnRTdGF0ZShHTF9WRVJURVhfQVJSQVkpOwogICAgIAogICAgZ2xOb3JtYWxQb2ludGVyKEdMX0ZMT0FULDAsbm9ybWFsQXJyYXkpOwogICAgZ2xUZXhDb29yZFBvaW50ZXIoMixHTF9GTE9BVCwwLHV2QXJyYXkpOwogICAgZ2xWZXJ0ZXhQb2ludGVyKDMsR0xfRkxPQVQsMCx2ZXJ0ZXhBcnJheSk7CiAgICAgCiAgICBnbEFjdGl2ZVRleHR1cmUoR0xfVEVYVFVSRTApOwogICAgZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFXzJELCBtX1RleHR1cmVbMF0pOwogICAgZ2xEcmF3QXJyYXlzKEdMX1RSSUFOR0xFUywwLG51bVZlcnRzKTsKICAgICAKICAgIGdsRGlzYWJsZUNsaWVudFN0YXRlKEdMX05PUk1BTF9BUlJBWSk7CiAgICBnbERpc2FibGVDbGllbnRTdGF0ZShHTF9URVhUVVJFX0NPT1JEX0FSUkFZKTsKICAgIGdsRGlzYWJsZUNsaWVudFN0YXRlKEdMX1ZFUlRFWF9BUlJBWSk7CiAgICBnbFBvcE1hdHJpeCgpOwogICAgfQ==