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"
2012-12-12 23:21:15 +00:00
# import "KRBone.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
2012-12-12 22:15:09 +00:00
# define KRENGINE_MAX_BONE_WEIGHTS_PER_VERTEX 4
# define KRENGINE_MAX_NAME_LENGTH 256
2012-10-03 19:55:34 +00:00
// 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-10-26 01:17:35 +00:00
# import "KRViewport.h"
2012-12-15 00:51:53 +00:00
# import "KRHitInfo.h"
2011-10-25 05:03:10 +00:00
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-12-14 20:45:16 +00:00
typedef enum {
KRENGINE_ATTRIB_VERTEX = 0 ,
KRENGINE_ATTRIB_NORMAL ,
KRENGINE_ATTRIB_TANGENT ,
KRENGINE_ATTRIB_TEXUVA ,
KRENGINE_ATTRIB_TEXUVB ,
KRENGINE_ATTRIB_BONEINDEXES ,
KRENGINE_ATTRIB_BONEWEIGHTS ,
KRENGINE_NUM_ATTRIBUTES
} vertex_attrib_t ;
typedef enum {
KRENGINE_MODEL_FORMAT_TRIANGLES = 0 ,
KRENGINE_MODEL_FORMAT_STRIP ,
KRENGINE_MODEL_FORMAT_INDEXED_TRIANGLES ,
KRENGINE_MODEL_FORMAT_INDEXED_STRIP
} model_format_t ;
2012-04-12 00:43:53 +00:00
# if TARGET_OS_IPHONE
2012-12-12 23:21:15 +00:00
void render ( KRCamera * pCamera , std : : vector < KRLight * > & lights , const KRViewport & viewport , const KRMat4 & matModel , KRTexture * pLightMap , KRNode : : RenderPass renderPass , const std : : vector < KRBone * > & bones ) ;
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 ) ;
2012-12-14 20:45:16 +00:00
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 , std : : vector < std : : string > bone_names , std : : vector < std : : vector < int > > bone_indexes , std : : vector < std : : vector < float > > bone_weights , model_format_t model_format ) ;
2012-10-03 19:55:34 +00:00
void loadPack ( KRDataBlock * data ) ;
void renderSubmesh ( int iSubmesh ) ;
GLfloat getMaxDimension ( ) ;
KRVector3 getMinPoint ( ) const ;
KRVector3 getMaxPoint ( ) const ;
2012-12-14 20:45:16 +00:00
2012-12-10 21:09:14 +00:00
2012-10-03 19:55:34 +00:00
typedef struct {
GLint start_vertex ;
GLsizei vertex_count ;
2012-12-12 22:15:09 +00:00
char szMaterialName [ KRENGINE_MAX_NAME_LENGTH ] ;
2012-10-03 19:55:34 +00:00
} 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 ;
vector < Submesh * > getSubmeshes ( ) ;
typedef struct {
int32_t start_vertex ;
int32_t vertex_count ;
2012-12-12 22:15:09 +00:00
char szName [ KRENGINE_MAX_NAME_LENGTH ] ;
2012-10-03 19:55:34 +00:00
} pack_material ;
2012-12-12 22:15:09 +00:00
typedef struct {
char szName [ KRENGINE_MAX_NAME_LENGTH ] ;
} pack_bone ;
2012-10-03 19:55:34 +00:00
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-12-10 21:09:14 +00:00
bool has_vertex_attribute ( vertex_attrib_t attribute_type ) const ;
2012-12-15 00:51:53 +00:00
int getSubmeshCount ( ) const ;
int getVertexCount ( int submesh ) const ;
2012-12-10 21:09:14 +00:00
KRVector3 getVertexPosition ( int index ) const ;
KRVector3 getVertexNormal ( int index ) const ;
KRVector3 getVertexTangent ( int index ) const ;
KRVector2 getVertexUVA ( int index ) const ;
KRVector2 getVertexUVB ( int index ) const ;
2012-12-12 22:15:09 +00:00
int getBoneIndex ( int index , int weight_index ) const ;
float getBoneWeight ( int index , int weight_index ) const ;
2012-12-10 21:09:14 +00:00
void setVertexPosition ( int index , const KRVector3 & v ) ;
void setVertexNormal ( int index , const KRVector3 & v ) ;
void setVertexTangent ( int index , const KRVector3 & v ) ;
void setVertexUVA ( int index , const KRVector2 & v ) ;
void setVertexUVB ( int index , const KRVector2 & v ) ;
2012-12-12 22:15:09 +00:00
void setBoneIndex ( int index , int weight_index , int bone_index ) ;
void setBoneWeight ( int index , int weight_index , float bone_weight ) ;
static size_t VertexSizeForAttributes ( __int32_t vertex_attrib_flags ) ;
static size_t AttributeOffset ( __int32_t vertex_attrib , __int32_t vertex_attrib_flags ) ;
2012-12-12 23:21:15 +00:00
int getBoneCount ( ) ;
char * getBoneName ( int bone_index ) ;
2012-03-15 19:19:23 +00:00
2012-12-14 20:45:16 +00:00
2012-12-15 00:51:53 +00:00
model_format_t getModelFormat ( ) const ;
2012-12-14 20:45:16 +00:00
2012-12-15 00:51:53 +00:00
bool lineCast ( const KRVector3 & v0 , const KRVector3 & v1 , KRHitInfo & hitinfo ) const ;
bool rayCast ( const KRVector3 & v0 , const KRVector3 & v1 , KRHitInfo & hitinfo ) const ;
private :
bool rayCast ( const KRVector3 & line_v0 , const KRVector3 & line_v1 , int tri_index0 , int tri_index1 , int tri_index2 , KRHitInfo & hitinfo ) const ;
static bool rayCast ( const KRVector3 & line_v0 , const KRVector3 & line_v1 , const KRVector3 & tri_v0 , const KRVector3 & tri_v1 , const KRVector3 & tri_v2 , const KRVector3 & tri_n0 , const KRVector3 & tri_n1 , const KRVector3 & tri_n2 , KRHitInfo & hitinfo ) ;
2012-12-14 20:45:16 +00:00
2012-10-05 02:23:00 +00:00
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 ;
2012-12-14 20:45:16 +00:00
2012-10-03 19:55:34 +00:00
typedef struct {
char szTag [ 16 ] ;
2012-12-14 20:45:16 +00:00
int32_t model_format ; // 0 == Triangle list, 1 == Triangle strips, 2 == Indexed triangle list, 3 == Indexed triangle strips, rest are reserved (model_format_t enum)
2012-12-10 21:09:14 +00:00
int32_t vertex_attrib_flags ;
2012-10-03 19:55:34 +00:00
int32_t vertex_count ;
int32_t submesh_count ;
2012-12-12 22:15:09 +00:00
int32_t bone_count ;
2012-12-10 21:09:14 +00:00
float minx , miny , minz , maxx , maxy , maxz ; // Axis aligned bounding box, in model's coordinate space
2012-12-12 22:15:09 +00:00
unsigned char reserved [ 452 ] ; // Pad out to 512 bytes
2012-10-03 19:55:34 +00:00
} pack_header ;
vector < Submesh * > m_submeshes ;
2012-12-10 21:09:14 +00:00
int m_vertex_attribute_offset [ KRENGINE_NUM_ATTRIBUTES ] ;
int m_vertex_size ;
void updateAttributeOffsets ( ) ;
2012-10-03 19:55:34 +00:00
void clearData ( ) ;
void clearBuffers ( ) ;
2012-11-01 22:16:59 +00:00
void setName ( const std : : string name ) ;
2012-12-14 20:45:16 +00:00
void optimize ( ) ;
2012-12-10 21:09:14 +00:00
2012-12-12 22:15:09 +00:00
2012-12-10 21:09:14 +00:00
2012-12-15 00:51:53 +00:00
pack_material * getSubmesh ( int mesh_index ) const ;
2012-12-10 21:09:14 +00:00
unsigned char * getVertexData ( ) const ;
unsigned char * getVertexData ( int index ) const ;
pack_header * getHeader ( ) const ;
2012-12-12 22:15:09 +00:00
pack_bone * getBone ( int index ) ;
2011-10-25 05:03:10 +00:00
} ;
# endif // KRMODEL_I