2011-10-25 05:03:10 +00:00
//
// KRModel.h
2012-03-15 20:09:01 +00:00
// KREngine
2011-10-25 05:03:10 +00:00
//
2012-03-15 20:09:01 +00:00
// Copyright 2012 Kearwood Gilbert. All rights reserved.
2011-10-25 06:16:47 +00:00
//
// Redistribution and use in source and binary forms, with or without modification, are
// permitted provided that the following conditions are met:
//
// 1. Redistributions of source code must retain the above copyright notice, this list of
// conditions and the following disclaimer.
//
// 2. Redistributions in binary form must reproduce the above copyright notice, this list
// of conditions and the following disclaimer in the documentation and/or other materials
// provided with the distribution.
//
// THIS SOFTWARE IS PROVIDED BY KEARWOOD GILBERT ''AS IS'' AND ANY EXPRESS OR IMPLIED
// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
// FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL KEARWOOD GILBERT OR
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
// The views and conclusions contained in the software and documentation are those of the
// authors and should not be interpreted as representing official policies, either expressed
// or implied, of Kearwood Gilbert.
2011-10-25 05:03:10 +00:00
//
# import <stdint.h>
# import <vector>
2012-03-15 20:09:01 +00:00
# import <set>
2011-10-25 05:03:10 +00:00
# import <string>
2012-03-23 02:28:46 +00:00
# import "KRVector2.h"
2012-06-14 19:33:17 +00:00
# import "KRContext.h"
2011-10-25 05:03:10 +00:00
2012-03-15 23:58:37 +00:00
# import "KREngine-common.h"
2011-10-25 05:03:10 +00:00
using std : : vector ;
2012-03-15 20:09:01 +00:00
using std : : set ;
2012-10-03 19:55:34 +00:00
using std : : list ;
# define MAX_VBO_SIZE 65535
// MAX_VBO_SIZE must be divisible by 3 so triangles aren't split across VBO objects...
# define BUFFER_OFFSET(i) ((char *)NULL + (i))
2011-10-25 05:03:10 +00:00
# ifndef KRMODEL_I
# define KRMODEL_I
# import "KRMaterialManager.h"
# import "KRCamera.h"
2012-06-14 19:33:17 +00:00
class KRMaterial ;
2012-10-19 23:17:43 +00:00
class KRNode ;
2012-06-14 19:33:17 +00:00
2012-10-03 19:55:34 +00:00
class KRModel : public KRResource {
2011-10-25 05:03:10 +00:00
public :
2012-09-11 03:06:35 +00:00
KRModel ( KRContext & context , std : : string name , KRDataBlock * data ) ;
2012-10-03 19:55:34 +00:00
KRModel ( KRContext & context , std : : string name ) ;
2012-08-17 01:04:49 +00:00
virtual ~ KRModel ( ) ;
2011-10-25 05:03:10 +00:00
2012-08-23 16:55:46 +00:00
bool hasTransparency ( ) ;
2012-04-12 00:43:53 +00:00
# if TARGET_OS_IPHONE
2012-10-12 00:02:24 +00:00
void render ( KRCamera * pCamera , KRContext * pContext , KRMat4 & matModel , KRMat4 & matView , KRMat4 & matMVP , KRVector3 & lightDirection , KRMat4 * pShadowMatrices , GLuint * shadowDepthTextures , int cShadowBuffers , KRTexture * pLightMap , KRNode : : RenderPass renderPass ) ;
2011-10-25 05:03:10 +00:00
2012-04-12 00:43:53 +00:00
# endif
2012-10-05 02:23:00 +00:00
std : : string m_lodBaseName ;
2012-10-03 19:55:34 +00:00
virtual std : : string getExtension ( ) ;
virtual bool save ( const std : : string & path ) ;
void LoadData ( std : : vector < KRVector3 > vertices , std : : vector < KRVector2 > uva , std : : vector < KRVector2 > uvb , std : : vector < KRVector3 > normals , std : : vector < KRVector3 > tangents , std : : vector < int > submesh_starts , std : : vector < int > submesh_lengths , std : : vector < std : : string > material_names ) ;
void loadPack ( KRDataBlock * data ) ;
void renderSubmesh ( int iSubmesh ) ;
GLfloat getMaxDimension ( ) ;
KRVector3 getMinPoint ( ) const ;
KRVector3 getMaxPoint ( ) const ;
typedef struct {
GLint start_vertex ;
GLsizei vertex_count ;
char szMaterialName [ 256 ] ;
} Submesh ;
typedef struct {
GLfloat x ;
GLfloat y ;
GLfloat z ;
} KRVector3D ;
typedef struct {
GLfloat u ;
GLfloat v ;
} TexCoord ;
typedef struct {
KRVector3D vertex ;
KRVector3D normal ;
KRVector3D tangent ;
TexCoord uva ;
TexCoord uvb ;
} VertexData ;
VertexData * getVertexData ( ) ;
vector < Submesh * > getSubmeshes ( ) ;
typedef struct {
int32_t start_vertex ;
int32_t vertex_count ;
char szName [ 256 ] ;
} pack_material ;
2012-10-05 02:23:00 +00:00
int getLODCoverage ( ) const ;
std : : string getLODBaseName ( ) const ;
static bool lod_sort_predicate ( const KRModel * m1 , const KRModel * m2 ) ;
2012-03-15 19:19:23 +00:00
2012-10-05 02:23:00 +00:00
private :
int m_lodCoverage ; // This LOD level is activated when the bounding box of the model will cover less than this percent of the screen (100 = highest detail model)
2012-03-15 19:19:23 +00:00
vector < KRMaterial * > m_materials ;
2012-03-15 20:09:01 +00:00
set < KRMaterial * > m_uniqueMaterials ;
2012-08-23 16:55:46 +00:00
bool m_hasTransparency ;
2012-10-03 19:55:34 +00:00
KRVector3 m_minPoint , m_maxPoint ;
KRDataBlock * m_pData ;
typedef struct {
char szTag [ 16 ] ;
float minx , miny , minz , maxx , maxy , maxz ;
int32_t vertex_count ;
int32_t submesh_count ;
} pack_header ;
vector < Submesh * > m_submeshes ;
void clearData ( ) ;
void clearBuffers ( ) ;
2011-10-25 05:03:10 +00:00
} ;
# endif // KRMODEL_I