2011-10-25 05:03:10 +00:00
//
2013-01-09 22:37:23 +00:00
// KRMeshManager.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.
2013-03-21 17:32:26 -07:00
//
2011-10-25 06:16:47 +00:00
// 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
//
2013-01-11 03:21:19 +00:00
# include "KREngine-common.h"
2013-01-09 22:37:23 +00:00
# include "KRMeshManager.h"
2011-10-25 05:03:10 +00:00
2013-01-11 03:21:19 +00:00
# include "KRMesh.h"
# include "KRMeshCube.h"
# include "KRMeshSphere.h"
2012-04-12 19:43:08 +00:00
2013-01-09 22:37:23 +00:00
KRMeshManager : : KRMeshManager ( KRContext & context ) : KRContextObject ( context ) {
2013-01-24 21:56:40 -08:00
m_currentVBO . vbo_handle = - 1 ;
m_currentVBO . vbo_handle_indexes = - 1 ;
m_currentVBO . vao_handle = - 1 ;
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 ;
2013-03-21 17:32:26 -07:00
m_memoryTransferredThisFrame = 0 ;
2012-12-14 20:45:16 +00:00
2013-02-16 01:35:05 -08:00
// addModel(new KRMeshCube(context)); // FINDME - HACK! This needs to be fixed, as it currently segfaults
2013-01-09 22:37:23 +00:00
addModel ( new KRMeshSphere ( context ) ) ;
2013-03-21 19:58:35 -07:00
m_draw_call_logging_enabled = false ;
m_draw_call_log_used = false ;
2011-10-25 05:03:10 +00:00
}
2013-01-09 22:37:23 +00:00
KRMeshManager : : ~ KRMeshManager ( ) {
2013-04-24 18:12:03 -07:00
for ( std : : unordered_multimap < std : : string , KRMesh * > : : 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
}
2013-01-09 22:37:23 +00:00
KRMesh * KRMeshManager : : loadModel ( const char * szName , KRDataBlock * pData ) {
2013-04-04 16:09:29 -07:00
KRMesh * pModel = new KRMesh ( * m_pContext , szName , pData ) ;
2012-12-14 20:45:16 +00:00
addModel ( pModel ) ;
2011-10-25 05:03:10 +00:00
return pModel ;
}
2013-01-09 22:37:23 +00:00
void KRMeshManager : : addModel ( KRMesh * model ) {
2013-04-04 16:09:29 -07:00
std : : string lowerName = model - > getLODBaseName ( ) ;
std : : transform ( lowerName . begin ( ) , lowerName . end ( ) ,
lowerName . begin ( ) , : : tolower ) ;
m_models . insert ( std : : pair < std : : string , KRMesh * > ( lowerName , model ) ) ;
2012-12-14 20:45:16 +00:00
}
2013-01-09 22:37:23 +00:00
std : : vector < KRMesh * > KRMeshManager : : getModel ( const char * szName ) {
2012-10-05 02:23:00 +00:00
std : : string lowerName = szName ;
std : : transform ( lowerName . begin ( ) , lowerName . end ( ) ,
lowerName . begin ( ) , : : tolower ) ;
2013-01-09 22:37:23 +00:00
std : : vector < KRMesh * > matching_models ;
2012-10-05 02:23:00 +00:00
2013-04-24 18:12:03 -07:00
std : : pair < std : : unordered_multimap < std : : string , KRMesh * > : : iterator , std : : unordered_multimap < std : : string , KRMesh * > : : iterator > range = m_models . equal_range ( lowerName ) ;
for ( std : : unordered_multimap < std : : string , KRMesh * > : : iterator itr_match = range . first ; itr_match ! = range . second ; itr_match + + ) {
2012-10-05 02:23:00 +00:00
matching_models . push_back ( itr_match - > second ) ;
2012-09-13 20:09:19 +00:00
}
2012-10-05 02:23:00 +00:00
2013-01-09 22:37:23 +00:00
std : : sort ( matching_models . begin ( ) , matching_models . end ( ) , KRMesh : : lod_sort_predicate ) ;
2012-10-05 02:23:00 +00:00
2012-12-14 20:45:16 +00:00
if ( matching_models . size ( ) = = 0 ) {
2012-10-05 02:23:00 +00:00
fprintf ( stderr , " ERROR: Model not found: %s \n " , lowerName . c_str ( ) ) ;
}
return matching_models ;
2011-10-25 05:03:10 +00:00
}
2013-04-24 18:12:03 -07:00
std : : unordered_multimap < std : : string , KRMesh * > & KRMeshManager : : getModels ( ) {
2012-04-05 21:18:25 +00:00
return m_models ;
}
2013-01-09 22:37:23 +00:00
void KRMeshManager : : unbindVBO ( ) {
2012-09-13 20:09:19 +00:00
if ( m_currentVBO . data ! = NULL ) {
GLDEBUG ( glBindBuffer ( GL_ARRAY_BUFFER , 0 ) ) ;
2013-01-24 21:56:40 -08:00
GLDEBUG ( glBindBuffer ( GL_ELEMENT_ARRAY_BUFFER , 0 ) ) ;
2012-09-13 20:09:19 +00:00
m_currentVBO . size = 0 ;
m_currentVBO . data = NULL ;
2012-10-25 18:28:30 +00:00
m_currentVBO . vbo_handle = - 1 ;
2013-01-24 21:56:40 -08:00
m_currentVBO . vbo_handle_indexes = - 1 ;
2012-10-25 18:28:30 +00:00
m_currentVBO . vao_handle = - 1 ;
2012-09-13 20:09:19 +00:00
}
}
2013-03-21 13:21:04 -07:00
void KRMeshManager : : releaseVBO ( GLvoid * data )
{
if ( m_currentVBO . data = = data ) {
unbindVBO ( ) ;
}
vbo_info_type vbo_to_release ;
if ( m_vbosActive . find ( data ) ! = m_vbosActive . end ( ) ) {
fprintf ( stderr , " glFinish called due to releasing a VBO that is active in the current frame. \n " ) ;
GLDEBUG ( glFinish ( ) ) ;
// The VBO is active
vbo_to_release = m_vbosActive [ data ] ;
m_vbosActive . erase ( data ) ;
} else {
// The VBO is inactive
vbo_to_release = m_vbosPool [ data ] ;
m_vbosPool . erase ( data ) ;
}
m_vboMemUsed - = vbo_to_release . size ;
# if GL_OES_vertex_array_object
GLDEBUG ( glDeleteVertexArraysOES ( 1 , & vbo_to_release . vao_handle ) ) ;
# endif
GLDEBUG ( glDeleteBuffers ( 1 , & vbo_to_release . vbo_handle ) ) ;
if ( vbo_to_release . vbo_handle_indexes ! = - 1 ) {
GLDEBUG ( glDeleteBuffers ( 1 , & vbo_to_release . vbo_handle_indexes ) ) ;
}
}
void KRMeshManager : : bindVBO ( GLvoid * data , GLsizeiptr size , GLvoid * index_data , GLsizeiptr index_data_size , bool enable_vertex , bool enable_normal , bool enable_tangent , bool enable_uva , bool enable_uvb , bool enable_bone_indexes , bool enable_bone_weights , bool static_vbo ) {
2012-09-11 03:06:35 +00:00
2013-04-24 12:48:55 -07:00
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 ) ;
2013-04-24 12:48:55 -07:00
if ( m_currentVBO . vbo_handle_indexes = = - 1 ) {
GLDEBUG ( glBindBuffer ( GL_ELEMENT_ARRAY_BUFFER , 0 ) ) ;
} else {
GLDEBUG ( glBindBuffer ( GL_ELEMENT_ARRAY_BUFFER , m_currentVBO . vbo_handle_indexes ) ) ;
}
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 ) ;
2013-04-24 12:48:55 -07:00
if ( m_currentVBO . vbo_handle_indexes = = - 1 ) {
GLDEBUG ( glBindBuffer ( GL_ELEMENT_ARRAY_BUFFER , 0 ) ) ;
} else {
GLDEBUG ( glBindBuffer ( GL_ELEMENT_ARRAY_BUFFER , m_currentVBO . vbo_handle_indexes ) ) ;
}
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
2013-04-24 12:48:55 -07:00
while ( m_vbosPool . size ( ) + m_vbosActive . size ( ) + 1 > = KRContext : : KRENGINE_MAX_VBO_HANDLES | | m_vboMemUsed + size + index_data_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
}
2013-04-24 18:12:03 -07:00
std : : unordered_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 ) ) ;
2013-01-24 21:56:40 -08:00
if ( firstVBO . vbo_handle_indexes ! = - 1 ) {
GLDEBUG ( glDeleteBuffers ( 1 , & firstVBO . vbo_handle_indexes ) ) ;
}
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 ;
2013-01-24 21:56:40 -08:00
m_currentVBO . vbo_handle_indexes = - 1 ;
2012-10-25 18:28:30 +00:00
GLDEBUG ( glGenBuffers ( 1 , & m_currentVBO . vbo_handle ) ) ;
2013-04-24 12:48:55 -07:00
if ( index_data ! = NULL ) {
GLDEBUG ( glGenBuffers ( 1 , & m_currentVBO . vbo_handle_indexes ) ) ;
}
2012-10-25 18:28:30 +00:00
# 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 ) ) ;
2013-03-21 13:21:04 -07:00
GLDEBUG ( glBufferData ( GL_ARRAY_BUFFER , size , data , static_vbo ? GL_STATIC_DRAW : GL_DYNAMIC_DRAW ) ) ;
2013-03-21 17:32:26 -07:00
m_memoryTransferredThisFrame + = size ;
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 ;
2013-04-24 12:48:55 -07:00
if ( index_data = = NULL ) {
GLDEBUG ( glBindBuffer ( GL_ELEMENT_ARRAY_BUFFER , 0 ) ) ;
} else {
GLDEBUG ( glBindBuffer ( GL_ELEMENT_ARRAY_BUFFER , m_currentVBO . vbo_handle_indexes ) ) ;
GLDEBUG ( glBufferData ( GL_ELEMENT_ARRAY_BUFFER , index_data_size , index_data , static_vbo ? GL_STATIC_DRAW : GL_DYNAMIC_DRAW ) ) ;
m_memoryTransferredThisFrame + = index_data_size ;
m_vboMemUsed + = index_data_size ;
m_currentVBO . size + = index_data_size ;
}
2012-09-13 20:09:19 +00:00
m_vbosActive [ data ] = m_currentVBO ;
2012-09-11 03:06:35 +00:00
}
}
}
2013-01-09 22:37:23 +00:00
void KRMeshManager : : 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-12-12 22:15:09 +00:00
__int32_t attributes = 0 ;
2012-10-25 18:28:30 +00:00
if ( enable_vertex ) {
2013-01-09 22:37:23 +00:00
attributes | = ( 1 < < KRMesh : : KRENGINE_ATTRIB_VERTEX ) ;
GLDEBUG ( glEnableVertexAttribArray ( KRMesh : : KRENGINE_ATTRIB_VERTEX ) ) ;
2012-10-25 18:28:30 +00:00
} else {
2013-01-09 22:37:23 +00:00
GLDEBUG ( glDisableVertexAttribArray ( KRMesh : : KRENGINE_ATTRIB_VERTEX ) ) ;
2012-09-19 20:26:30 +00:00
}
2012-10-25 18:28:30 +00:00
if ( enable_normal ) {
2013-01-09 22:37:23 +00:00
attributes | = ( 1 < < KRMesh : : KRENGINE_ATTRIB_NORMAL ) ;
GLDEBUG ( glEnableVertexAttribArray ( KRMesh : : KRENGINE_ATTRIB_NORMAL ) ) ;
2012-10-25 18:28:30 +00:00
} else {
2013-01-09 22:37:23 +00:00
GLDEBUG ( glDisableVertexAttribArray ( KRMesh : : KRENGINE_ATTRIB_NORMAL ) ) ;
2012-09-19 20:26:30 +00:00
}
2012-10-25 18:28:30 +00:00
if ( enable_tangent ) {
2013-01-09 22:37:23 +00:00
attributes | = ( 1 < < KRMesh : : KRENGINE_ATTRIB_TANGENT ) ;
GLDEBUG ( glEnableVertexAttribArray ( KRMesh : : KRENGINE_ATTRIB_TANGENT ) ) ;
2012-10-25 18:28:30 +00:00
} else {
2013-01-09 22:37:23 +00:00
GLDEBUG ( glDisableVertexAttribArray ( KRMesh : : KRENGINE_ATTRIB_TANGENT ) ) ;
2012-09-19 20:26:30 +00:00
}
2012-10-25 18:28:30 +00:00
if ( enable_uva ) {
2013-01-09 22:37:23 +00:00
attributes | = ( 1 < < KRMesh : : KRENGINE_ATTRIB_TEXUVA ) ;
GLDEBUG ( glEnableVertexAttribArray ( KRMesh : : KRENGINE_ATTRIB_TEXUVA ) ) ;
2012-10-25 18:28:30 +00:00
} else {
2013-01-09 22:37:23 +00:00
GLDEBUG ( glDisableVertexAttribArray ( KRMesh : : KRENGINE_ATTRIB_TEXUVA ) ) ;
2012-09-19 20:26:30 +00:00
}
2012-10-25 18:28:30 +00:00
if ( enable_uvb ) {
2013-01-09 22:37:23 +00:00
attributes | = ( 1 < < KRMesh : : KRENGINE_ATTRIB_TEXUVB ) ;
GLDEBUG ( glEnableVertexAttribArray ( KRMesh : : KRENGINE_ATTRIB_TEXUVB ) ) ;
2012-10-25 18:28:30 +00:00
} else {
2013-01-09 22:37:23 +00:00
GLDEBUG ( glDisableVertexAttribArray ( KRMesh : : KRENGINE_ATTRIB_TEXUVB ) ) ;
2012-12-10 21:09:14 +00:00
}
if ( enable_bone_indexes ) {
2013-01-09 22:37:23 +00:00
attributes | = ( 1 < < KRMesh : : KRENGINE_ATTRIB_BONEINDEXES ) ;
GLDEBUG ( glEnableVertexAttribArray ( KRMesh : : KRENGINE_ATTRIB_BONEINDEXES ) ) ;
2012-12-10 21:09:14 +00:00
} else {
2013-01-09 22:37:23 +00:00
GLDEBUG ( glDisableVertexAttribArray ( KRMesh : : KRENGINE_ATTRIB_BONEINDEXES ) ) ;
2012-12-10 21:09:14 +00:00
}
if ( enable_bone_weights ) {
2013-01-09 22:37:23 +00:00
attributes | = ( 1 < < KRMesh : : KRENGINE_ATTRIB_BONEWEIGHTS ) ;
GLDEBUG ( glEnableVertexAttribArray ( KRMesh : : KRENGINE_ATTRIB_BONEWEIGHTS ) ) ;
2012-12-10 21:09:14 +00:00
} else {
2013-01-09 22:37:23 +00:00
GLDEBUG ( glDisableVertexAttribArray ( KRMesh : : KRENGINE_ATTRIB_BONEWEIGHTS ) ) ;
2012-10-25 18:28:30 +00:00
}
2012-09-19 20:26:30 +00:00
2013-01-09 22:37:23 +00:00
GLsizei data_size = ( GLsizei ) KRMesh : : VertexSizeForAttributes ( attributes ) ;
2012-12-12 22:15:09 +00:00
2012-10-25 18:28:30 +00:00
if ( enable_vertex ) {
2013-01-09 22:37:23 +00:00
GLDEBUG ( glVertexAttribPointer ( KRMesh : : KRENGINE_ATTRIB_VERTEX , 3 , GL_FLOAT , GL_FALSE , data_size , BUFFER_OFFSET ( KRMesh : : AttributeOffset ( KRMesh : : KRENGINE_ATTRIB_VERTEX , attributes ) ) ) ) ;
2012-10-25 18:28:30 +00:00
}
if ( enable_normal ) {
2013-01-09 22:37:23 +00:00
GLDEBUG ( glVertexAttribPointer ( KRMesh : : KRENGINE_ATTRIB_NORMAL , 3 , GL_FLOAT , GL_FALSE , data_size , BUFFER_OFFSET ( KRMesh : : AttributeOffset ( KRMesh : : KRENGINE_ATTRIB_NORMAL , attributes ) ) ) ) ;
2012-10-25 18:28:30 +00:00
}
if ( enable_tangent ) {
2013-01-09 22:37:23 +00:00
GLDEBUG ( glVertexAttribPointer ( KRMesh : : KRENGINE_ATTRIB_TANGENT , 3 , GL_FLOAT , GL_FALSE , data_size , BUFFER_OFFSET ( KRMesh : : AttributeOffset ( KRMesh : : KRENGINE_ATTRIB_TANGENT , attributes ) ) ) ) ;
2012-10-25 18:28:30 +00:00
}
if ( enable_uva ) {
2013-01-09 22:37:23 +00:00
GLDEBUG ( glVertexAttribPointer ( KRMesh : : KRENGINE_ATTRIB_TEXUVA , 2 , GL_FLOAT , GL_FALSE , data_size , BUFFER_OFFSET ( KRMesh : : AttributeOffset ( KRMesh : : KRENGINE_ATTRIB_TEXUVA , attributes ) ) ) ) ;
2012-10-25 18:28:30 +00:00
}
if ( enable_uvb ) {
2013-01-09 22:37:23 +00:00
GLDEBUG ( glVertexAttribPointer ( KRMesh : : KRENGINE_ATTRIB_TEXUVB , 2 , GL_FLOAT , GL_FALSE , data_size , BUFFER_OFFSET ( KRMesh : : AttributeOffset ( KRMesh : : KRENGINE_ATTRIB_TEXUVB , attributes ) ) ) ) ;
2012-09-19 20:26:30 +00:00
}
2012-12-10 21:09:14 +00:00
if ( enable_bone_indexes ) {
2013-01-09 22:37:23 +00:00
GLDEBUG ( glVertexAttribPointer ( KRMesh : : KRENGINE_ATTRIB_BONEINDEXES , 4 , GL_UNSIGNED_BYTE , GL_FALSE , data_size , BUFFER_OFFSET ( KRMesh : : AttributeOffset ( KRMesh : : KRENGINE_ATTRIB_BONEINDEXES , attributes ) ) ) ) ;
2012-12-10 21:09:14 +00:00
}
if ( enable_bone_weights ) {
2013-01-09 22:37:23 +00:00
GLDEBUG ( glVertexAttribPointer ( KRMesh : : KRENGINE_ATTRIB_BONEWEIGHTS , 4 , GL_FLOAT , GL_FALSE , data_size , BUFFER_OFFSET ( KRMesh : : AttributeOffset ( KRMesh : : KRENGINE_ATTRIB_BONEWEIGHTS , attributes ) ) ) ) ;
2012-12-10 21:09:14 +00:00
}
2012-09-19 20:26:30 +00:00
}
2013-01-09 22:37:23 +00:00
long KRMeshManager : : getMemUsed ( )
2012-09-11 04:32:04 +00:00
{
return m_vboMemUsed ;
}
2012-09-13 20:09:19 +00:00
2013-03-21 17:32:26 -07:00
long KRMeshManager : : getMemActive ( )
{
long mem_active = 0 ;
2013-04-24 18:12:03 -07:00
for ( std : : unordered_map < GLvoid * , vbo_info_type > : : iterator itr = m_vbosActive . begin ( ) ; itr ! = m_vbosActive . end ( ) ; itr + + ) {
2013-03-21 17:32:26 -07:00
mem_active + = ( * itr ) . second . size ;
}
return mem_active ;
}
2013-01-09 22:37:23 +00:00
void KRMeshManager : : 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
2013-01-09 22:37:23 +00:00
KRMeshManager : : VolumetricLightingVertexData * KRMeshManager : : getVolumetricLightingVertexes ( )
2012-11-09 09:18:38 +00:00
{
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 ;
}
2013-01-09 22:37:23 +00:00
KRMeshManager : : RandomParticleVertexData * KRMeshManager : : getRandomParticles ( )
2012-11-02 20:50:45 +00:00
{
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
2013-04-24 12:48:55 -07:00
float equilateral_triangle_height = sqrt ( 3.0f ) * 0.5f ;
2012-11-23 01:02:22 +00:00
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 ;
}
2013-03-21 17:32:26 -07:00
void KRMeshManager : : startFrame ( float deltaTime )
{
m_memoryTransferredThisFrame = 0 ;
2013-03-21 19:58:35 -07:00
if ( m_draw_call_log_used ) {
// Only log draw calls on the next frame if the draw call log was used on last frame
m_draw_call_log_used = false ;
m_draw_call_logging_enabled = true ;
}
m_draw_calls . clear ( ) ;
}
void KRMeshManager : : endFrame ( float deltaTime )
{
2013-03-21 17:32:26 -07:00
}
long KRMeshManager : : getMemoryTransferedThisFrame ( )
{
return m_memoryTransferredThisFrame ;
}
int KRMeshManager : : getActiveVBOCount ( )
{
return m_vbosActive . size ( ) ;
}
int KRMeshManager : : getPoolVBOCount ( )
{
return m_vbosPool . size ( ) ;
}
2013-03-21 19:58:35 -07:00
void KRMeshManager : : log_draw_call ( KRNode : : RenderPass pass , const std : : string & object_name , const std : : string & material_name , int vertex_count )
{
if ( m_draw_call_logging_enabled ) {
draw_call_info info ;
info . pass = pass ;
strncpy ( info . object_name , object_name . c_str ( ) , 256 ) ;
strncpy ( info . material_name , material_name . c_str ( ) , 256 ) ;
info . vertex_count = vertex_count ;
m_draw_calls . push_back ( info ) ;
}
}
std : : vector < KRMeshManager : : draw_call_info > KRMeshManager : : getDrawCalls ( )
{
m_draw_call_log_used = true ;
return m_draw_calls ;
}