2011-10-25 05:03:10 +00:00
//
// KRModelManager.cpp
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
//
# include "KRModelManager.h"
2012-09-13 20:09:19 +00:00
# include <assert.h>
2011-10-25 05:03:10 +00:00
2012-04-12 19:43:08 +00:00
# import "KRModel.h"
2012-08-17 01:04:49 +00:00
KRModelManager : : KRModelManager ( KRContext & context ) : KRContextObject ( context ) {
2012-10-25 18:28:30 +00:00
m_currentVBO . vbo_handle = 0 ;
m_currentVBO . vao_handle = 0 ;
2012-09-11 03:06:35 +00:00
m_currentVBO . data = NULL ;
2012-09-11 04:32:04 +00:00
m_vboMemUsed = 0 ;
2012-11-02 20:50:45 +00:00
m_randomParticleVertexData = NULL ;
2012-11-09 09:18:38 +00:00
m_volumetricLightingVertexData = NULL ;
2011-10-25 05:03:10 +00:00
}
KRModelManager : : ~ KRModelManager ( ) {
2012-10-05 02:23:00 +00:00
for ( std : : multimap < std : : string , KRModel * > : : iterator itr = m_models . begin ( ) ; itr ! = m_models . end ( ) ; + + itr ) {
2011-10-25 05:03:10 +00:00
delete ( * itr ) . second ;
}
m_models . empty ( ) ;
2012-11-02 20:50:45 +00:00
if ( m_randomParticleVertexData ! = NULL ) delete m_randomParticleVertexData ;
2012-11-09 09:18:38 +00:00
if ( m_volumetricLightingVertexData ! = NULL ) delete m_volumetricLightingVertexData ;
2011-10-25 05:03:10 +00:00
}
2012-09-11 03:06:35 +00:00
KRModel * KRModelManager : : loadModel ( const char * szName , KRDataBlock * pData ) {
2012-10-05 02:23:00 +00:00
std : : string lowerName = szName ;
std : : transform ( lowerName . begin ( ) , lowerName . end ( ) ,
lowerName . begin ( ) , : : tolower ) ;
KRModel * pModel = new KRModel ( * m_pContext , lowerName , pData ) ;
2012-11-01 22:16:59 +00:00
m_models . insert ( std : : pair < std : : string , KRModel * > ( pModel - > getLODBaseName ( ) , pModel ) ) ;
2012-10-05 02:23:00 +00:00
2011-10-25 05:03:10 +00:00
return pModel ;
}
2012-10-05 02:23:00 +00:00
std : : vector < KRModel * > KRModelManager : : getModel ( const char * szName ) {
std : : string lowerName = szName ;
std : : transform ( lowerName . begin ( ) , lowerName . end ( ) ,
lowerName . begin ( ) , : : tolower ) ;
std : : vector < KRModel * > matching_models ;
std : : pair < std : : multimap < std : : string , KRModel * > : : iterator , std : : multimap < std : : string , KRModel * > : : iterator > range = m_models . equal_range ( lowerName ) ;
for ( std : : multimap < std : : string , KRModel * > : : iterator itr_match = range . first ; itr_match ! = range . second ; itr_match + + ) {
matching_models . push_back ( itr_match - > second ) ;
2012-09-13 20:09:19 +00:00
}
2012-10-05 02:23:00 +00:00
std : : sort ( matching_models . begin ( ) , matching_models . end ( ) , KRModel : : lod_sort_predicate ) ;
if ( matching_models . size ( ) = = 0 ) {
fprintf ( stderr , " ERROR: Model not found: %s \n " , lowerName . c_str ( ) ) ;
}
return matching_models ;
2011-10-25 05:03:10 +00:00
}
2012-10-05 02:23:00 +00:00
std : : multimap < std : : string , KRModel * > KRModelManager : : getModels ( ) {
2012-04-05 21:18:25 +00:00
return m_models ;
}
2012-09-13 20:09:19 +00:00
void KRModelManager : : unbindVBO ( ) {
if ( m_currentVBO . data ! = NULL ) {
GLDEBUG ( glBindBuffer ( GL_ARRAY_BUFFER , 0 ) ) ;
m_currentVBO . size = 0 ;
m_currentVBO . data = NULL ;
2012-10-25 18:28:30 +00:00
m_currentVBO . vbo_handle = - 1 ;
m_currentVBO . vao_handle = - 1 ;
2012-09-13 20:09:19 +00:00
}
}
2012-12-10 21:09:14 +00:00
void KRModelManager : : bindVBO ( GLvoid * data , GLsizeiptr size , bool enable_vertex , bool enable_normal , bool enable_tangent , bool enable_uva , bool enable_uvb , bool enable_bone_indexes , bool enable_bone_weights ) {
2012-09-11 03:06:35 +00:00
if ( m_currentVBO . data ! = data | | m_currentVBO . size ! = size ) {
2012-09-13 20:09:19 +00:00
if ( m_vbosActive . find ( data ) ! = m_vbosActive . end ( ) ) {
m_currentVBO = m_vbosActive [ data ] ;
2012-10-25 18:28:30 +00:00
# if GL_OES_vertex_array_object
GLDEBUG ( glBindVertexArrayOES ( m_currentVBO . vao_handle ) ) ;
# else
GLDEBUG ( glBindBuffer ( GL_ARRAY_BUFFER , m_currentVBO . vbo_handle ) ) ;
2012-12-10 21:09:14 +00:00
configureAttribs ( enable_vertex , enable_normal , enable_tangent , enable_uva , enable_uvb , enable_bone_indexes , enable_bone_weights ) ;
2012-10-25 18:28:30 +00:00
# endif
2012-09-13 20:09:19 +00:00
} else if ( m_vbosPool . find ( data ) ! = m_vbosPool . end ( ) ) {
m_currentVBO = m_vbosPool [ data ] ;
m_vbosPool . erase ( data ) ;
m_vbosActive [ data ] = m_currentVBO ;
2012-10-25 18:28:30 +00:00
# if GL_OES_vertex_array_object
GLDEBUG ( glBindVertexArrayOES ( m_currentVBO . vao_handle ) ) ;
# else
GLDEBUG ( glBindBuffer ( GL_ARRAY_BUFFER , m_currentVBO . vbo_handle ) ) ;
2012-12-10 21:09:14 +00:00
configureAttribs ( enable_vertex , enable_normal , enable_tangent , enable_uva , enable_uvb , enable_bone_indexes , enable_bone_weights ) ;
2012-10-25 18:28:30 +00:00
# endif
2012-09-11 03:06:35 +00:00
} else {
2012-11-17 00:15:52 +00:00
while ( m_vbosPool . size ( ) + m_vbosActive . size ( ) + 1 > = KRContext : : KRENGINE_MAX_VBO_HANDLES | | m_vboMemUsed + size > = KRContext : : KRENGINE_MAX_VBO_MEM ) {
2012-09-13 20:09:19 +00:00
if ( m_vbosPool . empty ( ) ) {
2012-09-20 10:51:28 +00:00
fprintf ( stderr , " flushBuffers due to VBO exhaustion... \n " ) ;
2012-09-26 20:07:48 +00:00
m_pContext - > rotateBuffers ( false ) ;
2012-09-13 20:09:19 +00:00
}
std : : map < GLvoid * , vbo_info_type > : : iterator first_itr = m_vbosPool . begin ( ) ;
2012-09-11 03:06:35 +00:00
vbo_info_type firstVBO = first_itr - > second ;
2012-10-25 18:28:30 +00:00
# if GL_OES_vertex_array_object
GLDEBUG ( glDeleteVertexArraysOES ( 1 , & firstVBO . vao_handle ) ) ;
# endif
GLDEBUG ( glDeleteBuffers ( 1 , & firstVBO . vbo_handle ) ) ;
2012-09-11 04:32:04 +00:00
m_vboMemUsed - = firstVBO . size ;
2012-09-13 20:09:19 +00:00
m_vbosPool . erase ( first_itr ) ;
2012-09-26 20:07:48 +00:00
fprintf ( stderr , " VBO Swapping... \n " ) ;
2012-09-11 03:06:35 +00:00
}
2012-10-25 18:28:30 +00:00
m_currentVBO . vao_handle = - 1 ;
m_currentVBO . vbo_handle = - 1 ;
GLDEBUG ( glGenBuffers ( 1 , & m_currentVBO . vbo_handle ) ) ;
# if GL_OES_vertex_array_object
GLDEBUG ( glGenVertexArraysOES ( 1 , & m_currentVBO . vao_handle ) ) ;
GLDEBUG ( glBindVertexArrayOES ( m_currentVBO . vao_handle ) ) ;
# endif
GLDEBUG ( glBindBuffer ( GL_ARRAY_BUFFER , m_currentVBO . vbo_handle ) ) ;
2012-09-13 20:09:19 +00:00
GLDEBUG ( glBufferData ( GL_ARRAY_BUFFER , size , data , GL_STATIC_DRAW ) ) ;
2012-11-17 00:15:52 +00:00
m_vboMemUsed + = size ;
2012-12-10 21:09:14 +00:00
configureAttribs ( enable_vertex , enable_normal , enable_tangent , enable_uva , enable_uvb , enable_bone_indexes , enable_bone_weights ) ;
2012-09-11 04:32:04 +00:00
2012-09-11 03:06:35 +00:00
m_currentVBO . size = size ;
m_currentVBO . data = data ;
2012-09-13 20:09:19 +00:00
m_vbosActive [ data ] = m_currentVBO ;
2012-09-11 03:06:35 +00:00
}
}
}
2012-12-10 21:09:14 +00:00
void KRModelManager : : configureAttribs ( bool enable_vertex , bool enable_normal , bool enable_tangent , bool enable_uva , bool enable_uvb , bool enable_bone_indexes , bool enable_bone_weights )
2012-09-19 20:26:30 +00:00
{
2012-10-25 18:28:30 +00:00
if ( enable_vertex ) {
2012-12-10 21:09:14 +00:00
GLDEBUG ( glEnableVertexAttribArray ( KRModel : : KRENGINE_ATTRIB_VERTEX ) ) ;
2012-10-25 18:28:30 +00:00
} else {
2012-12-10 21:09:14 +00:00
GLDEBUG ( glDisableVertexAttribArray ( KRModel : : KRENGINE_ATTRIB_VERTEX ) ) ;
2012-09-19 20:26:30 +00:00
}
2012-10-25 18:28:30 +00:00
if ( enable_normal ) {
2012-12-10 21:09:14 +00:00
GLDEBUG ( glEnableVertexAttribArray ( KRModel : : KRENGINE_ATTRIB_NORMAL ) ) ;
2012-10-25 18:28:30 +00:00
} else {
2012-12-10 21:09:14 +00:00
GLDEBUG ( glDisableVertexAttribArray ( KRModel : : KRENGINE_ATTRIB_NORMAL ) ) ;
2012-09-19 20:26:30 +00:00
}
2012-10-25 18:28:30 +00:00
if ( enable_tangent ) {
2012-12-10 21:09:14 +00:00
GLDEBUG ( glEnableVertexAttribArray ( KRModel : : KRENGINE_ATTRIB_TANGENT ) ) ;
2012-10-25 18:28:30 +00:00
} else {
2012-12-10 21:09:14 +00:00
GLDEBUG ( glDisableVertexAttribArray ( KRModel : : KRENGINE_ATTRIB_TANGENT ) ) ;
2012-09-19 20:26:30 +00:00
}
2012-10-25 18:28:30 +00:00
if ( enable_uva ) {
2012-12-10 21:09:14 +00:00
GLDEBUG ( glEnableVertexAttribArray ( KRModel : : KRENGINE_ATTRIB_TEXUVA ) ) ;
2012-10-25 18:28:30 +00:00
} else {
2012-12-10 21:09:14 +00:00
GLDEBUG ( glDisableVertexAttribArray ( KRModel : : KRENGINE_ATTRIB_TEXUVA ) ) ;
2012-09-19 20:26:30 +00:00
}
2012-10-25 18:28:30 +00:00
if ( enable_uvb ) {
2012-12-10 21:09:14 +00:00
GLDEBUG ( glEnableVertexAttribArray ( KRModel : : KRENGINE_ATTRIB_TEXUVB ) ) ;
2012-10-25 18:28:30 +00:00
} else {
2012-12-10 21:09:14 +00:00
GLDEBUG ( glDisableVertexAttribArray ( KRModel : : KRENGINE_ATTRIB_TEXUVB ) ) ;
}
if ( enable_bone_indexes ) {
GLDEBUG ( glEnableVertexAttribArray ( KRModel : : KRENGINE_ATTRIB_BONEINDEXES ) ) ;
} else {
GLDEBUG ( glDisableVertexAttribArray ( KRModel : : KRENGINE_ATTRIB_BONEINDEXES ) ) ;
}
if ( enable_bone_weights ) {
GLDEBUG ( glEnableVertexAttribArray ( KRModel : : KRENGINE_ATTRIB_BONEWEIGHTS ) ) ;
} else {
GLDEBUG ( glDisableVertexAttribArray ( KRModel : : KRENGINE_ATTRIB_BONEWEIGHTS ) ) ;
2012-10-25 18:28:30 +00:00
}
int data_size = 0 ;
if ( enable_vertex ) {
2012-12-10 21:09:14 +00:00
data_size + = sizeof ( GLfloat ) * 3 ;
2012-10-25 18:28:30 +00:00
}
if ( enable_normal ) {
2012-12-10 21:09:14 +00:00
data_size + = sizeof ( GLfloat ) * 3 ;
2012-10-25 18:28:30 +00:00
}
if ( enable_tangent ) {
2012-12-10 21:09:14 +00:00
data_size + = sizeof ( GLfloat ) * 3 ;
2012-10-25 18:28:30 +00:00
}
if ( enable_uva ) {
2012-12-10 21:09:14 +00:00
data_size + = sizeof ( GLfloat ) * 2 ;
2012-10-25 18:28:30 +00:00
}
if ( enable_uvb ) {
2012-12-10 21:09:14 +00:00
data_size + = sizeof ( GLfloat ) * 2 ;
}
if ( enable_bone_indexes ) {
data_size + = 4 ; // 4 bytes
}
if ( enable_bone_weights ) {
data_size + = sizeof ( GLfloat ) * 4 ;
2012-09-19 20:26:30 +00:00
}
2012-10-25 18:28:30 +00:00
int offset = 0 ;
if ( enable_vertex ) {
2012-12-10 21:09:14 +00:00
GLDEBUG ( glVertexAttribPointer ( KRModel : : KRENGINE_ATTRIB_VERTEX , 3 , GL_FLOAT , 0 , data_size , BUFFER_OFFSET ( offset ) ) ) ;
2012-10-25 18:28:30 +00:00
offset + = sizeof ( KRModel : : KRVector3D ) ;
}
if ( enable_normal ) {
2012-12-10 21:09:14 +00:00
GLDEBUG ( glVertexAttribPointer ( KRModel : : KRENGINE_ATTRIB_NORMAL , 3 , GL_FLOAT , 0 , data_size , BUFFER_OFFSET ( offset ) ) ) ;
2012-10-25 18:28:30 +00:00
offset + = sizeof ( KRModel : : KRVector3D ) ;
}
if ( enable_tangent ) {
2012-12-10 21:09:14 +00:00
GLDEBUG ( glVertexAttribPointer ( KRModel : : KRENGINE_ATTRIB_TANGENT , 3 , GL_FLOAT , 0 , data_size , BUFFER_OFFSET ( offset ) ) ) ;
2012-10-25 18:28:30 +00:00
offset + = sizeof ( KRModel : : KRVector3D ) ;
}
if ( enable_uva ) {
2012-12-10 21:09:14 +00:00
GLDEBUG ( glVertexAttribPointer ( KRModel : : KRENGINE_ATTRIB_TEXUVA , 2 , GL_FLOAT , 0 , data_size , BUFFER_OFFSET ( offset ) ) ) ;
2012-10-25 18:28:30 +00:00
offset + = sizeof ( KRModel : : TexCoord ) ;
}
if ( enable_uvb ) {
2012-12-10 21:09:14 +00:00
GLDEBUG ( glVertexAttribPointer ( KRModel : : KRENGINE_ATTRIB_TEXUVB , 2 , GL_FLOAT , 0 , data_size , BUFFER_OFFSET ( offset ) ) ) ;
2012-10-25 18:28:30 +00:00
offset + = sizeof ( KRModel : : TexCoord ) ;
2012-09-19 20:26:30 +00:00
}
2012-12-10 21:09:14 +00:00
if ( enable_bone_indexes ) {
GLDEBUG ( glVertexAttribPointer ( KRModel : : KRENGINE_ATTRIB_BONEINDEXES , 1 , GL_UNSIGNED_BYTE , 0 , data_size , BUFFER_OFFSET ( offset ) ) ) ;
offset + = 4 ; // 4 bytes
}
if ( enable_bone_weights ) {
GLDEBUG ( glVertexAttribPointer ( KRModel : : KRENGINE_ATTRIB_BONEWEIGHTS , 4 , GL_FLOAT , 0 , data_size , BUFFER_OFFSET ( offset ) ) ) ;
offset + = sizeof ( GLfloat ) * 4 ;
}
2012-09-19 20:26:30 +00:00
}
2012-09-11 04:32:04 +00:00
long KRModelManager : : getMemUsed ( )
{
return m_vboMemUsed ;
}
2012-09-13 20:09:19 +00:00
2012-09-26 20:07:48 +00:00
void KRModelManager : : rotateBuffers ( bool new_frame )
2012-09-13 20:09:19 +00:00
{
m_vbosPool . insert ( m_vbosActive . begin ( ) , m_vbosActive . end ( ) ) ;
m_vbosActive . clear ( ) ;
if ( m_currentVBO . data ! = NULL ) {
// Ensure that the currently active VBO does not get flushed to free memory
m_vbosPool . erase ( m_currentVBO . data ) ;
m_vbosActive [ m_currentVBO . data ] = m_currentVBO ;
}
2012-09-19 20:26:30 +00:00
2012-09-13 20:09:19 +00:00
}
2012-11-02 20:50:45 +00:00
2012-11-09 09:18:38 +00:00
KRModelManager : : VolumetricLightingVertexData * KRModelManager : : getVolumetricLightingVertexes ( )
{
if ( m_volumetricLightingVertexData = = NULL ) {
2012-11-23 01:02:22 +00:00
m_volumetricLightingVertexData = ( VolumetricLightingVertexData * ) malloc ( sizeof ( VolumetricLightingVertexData ) * KRENGINE_MAX_VOLUMETRIC_PLANES * 6 ) ;
2012-11-09 09:18:38 +00:00
int iVertex = 0 ;
2012-11-23 01:02:22 +00:00
for ( int iPlane = 0 ; iPlane < KRENGINE_MAX_VOLUMETRIC_PLANES ; iPlane + + ) {
2012-11-09 09:18:38 +00:00
m_volumetricLightingVertexData [ iVertex ] . vertex . x = - 1.0f ;
m_volumetricLightingVertexData [ iVertex ] . vertex . y = - 1.0f ;
m_volumetricLightingVertexData [ iVertex ] . vertex . z = iPlane ;
iVertex + + ;
m_volumetricLightingVertexData [ iVertex ] . vertex . x = 1.0f ;
m_volumetricLightingVertexData [ iVertex ] . vertex . y = - 1.0f ;
m_volumetricLightingVertexData [ iVertex ] . vertex . z = iPlane ;
iVertex + + ;
m_volumetricLightingVertexData [ iVertex ] . vertex . x = - 1.0f ;
m_volumetricLightingVertexData [ iVertex ] . vertex . y = 1.0f ;
m_volumetricLightingVertexData [ iVertex ] . vertex . z = iPlane ;
iVertex + + ;
m_volumetricLightingVertexData [ iVertex ] . vertex . x = - 1.0f ;
m_volumetricLightingVertexData [ iVertex ] . vertex . y = 1.0f ;
m_volumetricLightingVertexData [ iVertex ] . vertex . z = iPlane ;
iVertex + + ;
m_volumetricLightingVertexData [ iVertex ] . vertex . x = 1.0f ;
m_volumetricLightingVertexData [ iVertex ] . vertex . y = - 1.0f ;
m_volumetricLightingVertexData [ iVertex ] . vertex . z = iPlane ;
iVertex + + ;
m_volumetricLightingVertexData [ iVertex ] . vertex . x = 1.0f ;
m_volumetricLightingVertexData [ iVertex ] . vertex . y = 1.0f ;
m_volumetricLightingVertexData [ iVertex ] . vertex . z = iPlane ;
iVertex + + ;
// -1.0f, -1.0f,
// 1.0f, -1.0f,
// -1.0f, 1.0f,
// 1.0f, 1.0f,
}
}
return m_volumetricLightingVertexData ;
}
2012-11-02 20:50:45 +00:00
KRModelManager : : RandomParticleVertexData * KRModelManager : : getRandomParticles ( )
{
if ( m_randomParticleVertexData = = NULL ) {
2012-11-23 01:02:22 +00:00
m_randomParticleVertexData = ( RandomParticleVertexData * ) malloc ( sizeof ( RandomParticleVertexData ) * KRENGINE_MAX_RANDOM_PARTICLES * 3 ) ;
// Generate vertices for randomly placed equilateral triangles with a side length of 1 and an origin point centered so that an inscribed circle can be efficiently rendered without wasting fill
float equilateral_triangle_height = sqrt ( 3.0f ) / 2.0f ;
float inscribed_circle_radius = 1.0f / ( 2.0f * sqrt ( 3.0f ) ) ;
2012-11-02 20:50:45 +00:00
int iVertex = 0 ;
2012-11-23 01:02:22 +00:00
for ( int iParticle = 0 ; iParticle < KRENGINE_MAX_RANDOM_PARTICLES ; iParticle + + ) {
m_randomParticleVertexData [ iVertex ] . vertex . x = ( float ) ( arc4random ( ) % 2000 ) / 1000.0f - 1000.0f ;
m_randomParticleVertexData [ iVertex ] . vertex . y = ( float ) ( arc4random ( ) % 2000 ) / 1000.0f - 1000.0f ;
m_randomParticleVertexData [ iVertex ] . vertex . z = ( float ) ( arc4random ( ) % 2000 ) / 1000.0f - 1000.0f ;
m_randomParticleVertexData [ iVertex ] . uva . u = - 0.5f ;
m_randomParticleVertexData [ iVertex ] . uva . v = - inscribed_circle_radius ;
2012-11-02 20:50:45 +00:00
iVertex + + ;
m_randomParticleVertexData [ iVertex ] . vertex . x = m_randomParticleVertexData [ iVertex - 1 ] . vertex . x ;
m_randomParticleVertexData [ iVertex ] . vertex . y = m_randomParticleVertexData [ iVertex - 1 ] . vertex . y ;
m_randomParticleVertexData [ iVertex ] . vertex . z = m_randomParticleVertexData [ iVertex - 1 ] . vertex . z ;
2012-11-23 01:02:22 +00:00
m_randomParticleVertexData [ iVertex ] . uva . u = 0.5f ;
m_randomParticleVertexData [ iVertex ] . uva . v = - inscribed_circle_radius ;
2012-11-02 20:50:45 +00:00
iVertex + + ;
m_randomParticleVertexData [ iVertex ] . vertex . x = m_randomParticleVertexData [ iVertex - 1 ] . vertex . x ;
m_randomParticleVertexData [ iVertex ] . vertex . y = m_randomParticleVertexData [ iVertex - 1 ] . vertex . y ;
m_randomParticleVertexData [ iVertex ] . vertex . z = m_randomParticleVertexData [ iVertex - 1 ] . vertex . z ;
2012-11-23 01:02:22 +00:00
m_randomParticleVertexData [ iVertex ] . uva . u = 0.0f ;
m_randomParticleVertexData [ iVertex ] . uva . v = - inscribed_circle_radius + equilateral_triangle_height ;
2012-11-02 20:50:45 +00:00
iVertex + + ;
}
}
return m_randomParticleVertexData ;
}