2007-12-24 14:11:18 -08:00
/*
2007-10-24 06:12:10 -07:00
* PieToaster is an OpenGL application to edit 3 D models in
* Warzone 2100 ' s ( an RTS game ) PIE 3 D model format , which is heavily
* inspired by PieSlicer created by stratadrake .
* Copyright ( C ) 2007 Carl Hee
*
* This program is free software : you can redistribute it and / or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation , either version 3 of the License , or
* ( at your option ) any later version .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*
* You should have received a copy of the GNU General Public License
* along with this program . If not , see < http : //www.gnu.org/licenses/>.
*/
2007-10-24 05:29:36 -07:00
# include "pie_internal.h"
2007-12-25 10:26:15 -08:00
# include <SDL_opengl.h>
2007-10-24 05:29:36 -07:00
# include "screen.h"
# include "game_io.h"
# include "config.h"
2007-12-24 14:11:18 -08:00
# include "gui.h"
///cache between pie and va/vbo
static INTERLEAVED_T2F_V3F vaCache [ pie_MAX_VERTICES ] ;
//default submodel id for GUI
2007-12-24 14:50:45 -08:00
static Uint32 g_SubModelIndex = 8000 ;
2007-12-24 14:11:18 -08:00
// this is a joke actually the result of 65536.0f / 360.f * 22.5f / 4096.0f is ~1
static inline float WTFScale ( float x )
{
//return (x * 65536.0f / 360.f * 22.5f / 4096.0f);
return x ;
}
CAddSubModelDialog AddSubModelDialog ;
CAddSubModelFileDialog AddSubModelFileDialog ;
CReadAnimFileDialog ReadAnimFileDialog ;
CWriteAnimFileDialog WriteAnimFileDialog ;
void CAddSubModelDialog : : doFunction ( ) {
CPieInternal * instance = reinterpret_cast < CPieInternal * > ( m_userInfo ) ;
if ( ! instance - > addSub ( m_text ) )
{
fprintf ( stderr , " Error adding sub model with name:%s \n " , m_text ) ;
}
this - > deleteTextBox ( ) ;
this - > m_Up = false ;
}
void CAddSubModelFileDialog : : doFunction ( ) {
CPieInternal * instance = reinterpret_cast < CPieInternal * > ( m_userInfo ) ;
if ( ! instance - > addSubFromFile ( m_text ) )
{
fprintf ( stderr , " Error adding sub model with name:%s \n " , m_text ) ;
}
this - > deleteTextBox ( ) ;
this - > m_Up = false ;
}
void CReadAnimFileDialog : : doFunction ( ) {
CPieInternal * instance = reinterpret_cast < CPieInternal * > ( m_userInfo ) ;
instance - > readAnimFile ( m_text ) ;
instance - > updateGUI ( ) ;
// Updates sub model gui as well
CPieInternal * temp = instance - > m_nextSub ;
while ( temp )
{
temp - > updateGUI ( ) ;
temp = temp - > m_nextSub ;
}
this - > deleteTextBox ( ) ;
this - > m_Up = false ;
}
void CWriteAnimFileDialog : : doFunction ( ) {
CPieInternal * instance = reinterpret_cast < CPieInternal * > ( m_userInfo ) ;
if ( instance - > m_animMode = = instance - > ANIM3DTRANS )
{
if ( ! instance - > writeAnimFileTrans ( m_text ) )
{
fprintf ( stderr , " Error writing anim file name:%s \n " , m_text ) ;
}
}
else if ( instance - > m_animMode = = instance - > ANIM3DFRAMES )
{
if ( ! instance - > writeAnimFileFrames ( m_text ) )
{
fprintf ( stderr , " Error writing anim file name:%s \n " , m_text ) ;
}
}
this - > deleteTextBox ( ) ;
this - > m_Up = false ;
}
2007-10-24 05:29:36 -07:00
//// Callbacks ////
2007-12-24 14:11:18 -08:00
/* borked CB's
void TW_CALL setVarCB ( const void * value , void * clientData ) {
}
void TW_CALL getVarCB ( void * value , void * clientData ) {
PIE_INTERNAL_CB * pie_internal_cb = ( PIE_INTERNAL_CB * ) clientData ;
CPieInternal * instance = reinterpret_cast < CPieInternal * > ( pie_internal_cb - > pInstance ) ;
instance - > buildHLCache ( ) ;
}
*/
2007-10-24 05:29:36 -07:00
//clientData as struct(includes instance of object and int info)
void TW_CALL addVerticeCB ( void * clientData ) {
PIE_INTERNAL_CB * pie_internal_cb = ( PIE_INTERNAL_CB * ) clientData ;
CPieInternal * instance = reinterpret_cast < CPieInternal * > ( pie_internal_cb - > pInstance ) ;
2007-12-24 14:50:45 -08:00
Uint8 i = pie_internal_cb - > Id ;
2007-10-24 05:29:36 -07:00
2007-12-24 14:11:18 -08:00
//fprintf(stderr, "address of instance:%d", instance);
//fprintf(stderr, "type of id:%c", i);
2007-10-24 05:29:36 -07:00
if ( ! instance - > addVertice ( i ) )
{
fprintf ( stderr , " adding vertice type %d failed \n " , i ) ;
}
instance - > updateGUI ( ) ;
}
//clientData as struct(includes instance of object and int info)
void TW_CALL removeSelectedCB ( void * clientData ) {
PIE_INTERNAL_CB * pie_internal_cb = ( PIE_INTERNAL_CB * ) clientData ;
CPieInternal * instance = reinterpret_cast < CPieInternal * > ( pie_internal_cb - > pInstance ) ;
instance - > removeSelected ( ) ;
instance - > updateGUI ( ) ;
}
//clientData as struct(includes instance of object and int info)
void TW_CALL removeVerticeAtCB ( void * clientData ) {
PIE_INTERNAL_CB * pie_internal_cb = ( PIE_INTERNAL_CB * ) clientData ;
CPieInternal * instance = reinterpret_cast < CPieInternal * > ( pie_internal_cb - > pInstance ) ;
2007-12-24 14:50:45 -08:00
Uint16 i = pie_internal_cb - > Id ;
2007-10-24 05:29:36 -07:00
if ( ! instance - > removeVerticeAt ( i ) )
{
fprintf ( stderr , " remove vertice at %d failed \n " , i ) ;
}
}
//clientData as struct(includes instance of object and int info)
void TW_CALL removeConnectorAtCB ( void * clientData ) {
PIE_INTERNAL_CB * pie_internal_cb = ( PIE_INTERNAL_CB * ) clientData ;
CPieInternal * instance = reinterpret_cast < CPieInternal * > ( pie_internal_cb - > pInstance ) ;
2007-12-24 14:50:45 -08:00
Uint16 i = pie_internal_cb - > Id ;
2007-10-24 05:29:36 -07:00
if ( ! instance - > removeConnectorAt ( i ) )
{
fprintf ( stderr , " remove connector at %d failed \n " , i ) ;
}
instance - > updateGUI ( ) ;
}
2007-12-24 14:11:18 -08:00
//clientData as struct(includes instance of object and int info)
void TW_CALL selectAllCB ( void * clientData ) {
PIE_INTERNAL_CB * pie_internal_cb = ( PIE_INTERNAL_CB * ) clientData ;
CPieInternal * instance = reinterpret_cast < CPieInternal * > ( pie_internal_cb - > pInstance ) ;
instance - > selectAll ( ) ;
}
//clientData as struct(includes instance of object and int info)
void TW_CALL unselectAllCB ( void * clientData ) {
PIE_INTERNAL_CB * pie_internal_cb = ( PIE_INTERNAL_CB * ) clientData ;
CPieInternal * instance = reinterpret_cast < CPieInternal * > ( pie_internal_cb - > pInstance ) ;
instance - > unselectAll ( ) ;
}
2007-10-24 05:29:36 -07:00
//clientData as struct(includes instance of object and int info)
void TW_CALL moveSelectedVertices ( void * clientData ) {
PIE_INTERNAL_CB * pie_internal_cb = ( PIE_INTERNAL_CB * ) clientData ;
CPieInternal * instance = reinterpret_cast < CPieInternal * > ( pie_internal_cb - > pInstance ) ;
instance - > moveSelected ( ) ;
}
//clientData as struct(includes instance of object and int info)
void TW_CALL removeSelectedVertices ( void * clientData ) {
PIE_INTERNAL_CB * pie_internal_cb = ( PIE_INTERNAL_CB * ) clientData ;
CPieInternal * instance = reinterpret_cast < CPieInternal * > ( pie_internal_cb - > pInstance ) ;
instance - > removeSelected ( ) ;
instance - > updateGUI ( ) ;
}
//clientData as struct(includes instance of object and int info)
void TW_CALL symmetricSelectedVertices ( void * clientData ) {
PIE_INTERNAL_CB * pie_internal_cb = ( PIE_INTERNAL_CB * ) clientData ;
CPieInternal * instance = reinterpret_cast < CPieInternal * > ( pie_internal_cb - > pInstance ) ;
2007-12-24 14:50:45 -08:00
Uint8 axis = pie_internal_cb - > Id ;
2007-10-24 05:29:36 -07:00
instance - > symmetricSelected ( axis ) ;
instance - > updateGUI ( ) ;
}
2007-12-24 14:11:18 -08:00
//clientData as struct(includes instance of object and int info)
void TW_CALL duplicateSelectedVertices ( void * clientData ) {
PIE_INTERNAL_CB * pie_internal_cb = ( PIE_INTERNAL_CB * ) clientData ;
CPieInternal * instance = reinterpret_cast < CPieInternal * > ( pie_internal_cb - > pInstance ) ;
if ( ! instance - > duplicateSelected ( ) )
{
fprintf ( stderr , " Error duplicating selected vertices \n " ) ;
}
instance - > updateGUI ( ) ;
}
//clientData as struct(includes instance of object and int info)
void TW_CALL duplicatePolyCB ( void * clientData ) {
PIE_INTERNAL_CB * pie_internal_cb = ( PIE_INTERNAL_CB * ) clientData ;
CPieInternal * instance = reinterpret_cast < CPieInternal * > ( pie_internal_cb - > pInstance ) ;
2007-12-24 14:50:45 -08:00
Uint16 id = pie_internal_cb - > Id ;
2007-12-24 14:11:18 -08:00
if ( ! instance - > duplicatePoly ( id ) )
{
fprintf ( stderr , " Error duplicating Poly %d \n " , id ) ;
}
instance - > updateGUI ( ) ;
}
2007-10-24 05:29:36 -07:00
//clientData as struct(includes instance of object and int info)
void TW_CALL hideGUICB ( void * clientData ) {
PIE_INTERNAL_CB * pie_internal_cb = ( PIE_INTERNAL_CB * ) clientData ;
CPieInternal * instance = reinterpret_cast < CPieInternal * > ( pie_internal_cb - > pInstance ) ;
instance - > hideGUI ( ) ;
}
//clientData as struct(includes instance of object and int info)
void TW_CALL showGUICB ( void * clientData ) {
PIE_INTERNAL_CB * pie_internal_cb = ( PIE_INTERNAL_CB * ) clientData ;
CPieInternal * instance = reinterpret_cast < CPieInternal * > ( pie_internal_cb - > pInstance ) ;
instance - > showGUI ( ) ;
}
2007-12-24 14:11:18 -08:00
//clientData as struct(includes instance of object and int info)
void TW_CALL destructCB ( void * clientData ) {
PIE_INTERNAL_CB * pie_internal_cb = ( PIE_INTERNAL_CB * ) clientData ;
CPieInternal * instance = reinterpret_cast < CPieInternal * > ( pie_internal_cb - > pInstance ) ;
instance - > died = true ;
}
//clientData as struct(includes instance of object and int info)
void TW_CALL addSubModelCB ( void * clientData ) {
PIE_INTERNAL_CB * pie_internal_cb = ( PIE_INTERNAL_CB * ) clientData ;
AddSubModelDialog . addTextBox ( " AddSubModel " ) ;
AddSubModelDialog . addUserInfo ( pie_internal_cb - > pInstance ) ;
}
//clientData as struct(includes instance of object and int info)
void TW_CALL addSubModelFileCB ( void * clientData ) {
PIE_INTERNAL_CB * pie_internal_cb = ( PIE_INTERNAL_CB * ) clientData ;
AddSubModelFileDialog . addTextBox ( " AddSubModelFile " ) ;
AddSubModelFileDialog . addUserInfo ( pie_internal_cb - > pInstance ) ;
}
//clientData as struct(includes instance of object and int info)
void TW_CALL readAnimFileCB ( void * clientData ) {
PIE_INTERNAL_CB * pie_internal_cb = ( PIE_INTERNAL_CB * ) clientData ;
ReadAnimFileDialog . addTextBox ( " ReadAnimFile " ) ;
ReadAnimFileDialog . addUserInfo ( pie_internal_cb - > pInstance ) ;
}
//clientData as struct(includes instance of object and int info)
void TW_CALL writeAnimFileCB ( void * clientData ) {
PIE_INTERNAL_CB * pie_internal_cb = ( PIE_INTERNAL_CB * ) clientData ;
WriteAnimFileDialog . addTextBox ( " WriteAnimFile " ) ;
WriteAnimFileDialog . addUserInfo ( pie_internal_cb - > pInstance ) ;
}
//clientData as struct(includes instance of object and int info)
void TW_CALL addFrameCB ( void * clientData ) {
PIE_INTERNAL_CB * pie_internal_cb = ( PIE_INTERNAL_CB * ) clientData ;
CPieInternal * instance = reinterpret_cast < CPieInternal * > ( pie_internal_cb - > pInstance ) ;
instance - > addFrame ( ) ;
}
//clientData as struct(PIE_FRAME_INFO)
void TW_CALL removeFrameCB ( void * clientData ) {
PIE_FRAME_INFO * frame = ( PIE_FRAME_INFO * ) clientData ;
frame - > died = true ;
}
//clientData as struct(includes instance and frameId to duplicate)
void TW_CALL duplicateFrameCB ( void * clientData ) {
PIE_INTERNAL_CB * pie_internal_cb = ( PIE_INTERNAL_CB * ) clientData ;
CPieInternal * instance = reinterpret_cast < CPieInternal * > ( pie_internal_cb - > pInstance ) ;
2007-12-24 14:50:45 -08:00
Uint16 id = pie_internal_cb - > Id ;
2007-12-24 14:11:18 -08:00
instance - > duplicateFrame ( id ) ;
}
void TW_CALL saveNowCB ( void * clientData ) {
PIE_INTERNAL_CB * pie_internal_cb = ( PIE_INTERNAL_CB * ) clientData ;
CPieInternal * instance = reinterpret_cast < CPieInternal * > ( pie_internal_cb - > pInstance ) ;
instance - > m_saveNow = true ;
}
2007-10-24 05:29:36 -07:00
//// End of Callbacks ////
void CPolygonLinker : : flush ( void ) {
m_LinkedIndex = 0 ;
m_Target = 0 ;
m_MakePolygon = false ;
}
2007-12-24 14:50:45 -08:00
void CPolygonLinker : : setTarget ( Sint32 target ) {
2007-10-24 05:29:36 -07:00
m_Target = target ;
}
2007-12-24 14:50:45 -08:00
Uint16 CPolygonLinker : : getTarget ( void ) {
2007-10-24 05:29:36 -07:00
return m_Target ;
}
bool CPolygonLinker : : isUp ( void ) {
return ( m_Up ) ;
}
2007-12-24 14:50:45 -08:00
bool CPolygonLinker : : isDuplicated ( Uint16 vertId ) {
Uint8 i = 0 ;
2007-10-24 05:29:36 -07:00
if ( ! m_LinkedIndex )
{
//not linked vertices yet
return false ;
}
for ( i = 0 ; i < m_LinkedIndex + 1 ; i + + )
{
if ( m_LinkedVertices [ i ] = = vertId )
{
return true ;
}
}
return false ;
}
2007-12-24 14:50:45 -08:00
bool CPolygonLinker : : canLink ( Uint16 vertId ) {
2007-10-24 05:29:36 -07:00
//Skips self-link(dot) and line link(2 points line)
if ( isDuplicated ( vertId ) & & m_LinkedIndex < 3 )
{
return false ;
}
return true ;
}
2007-12-24 14:50:45 -08:00
bool CPolygonLinker : : Link ( Uint16 vertId ) {
2007-10-24 05:29:36 -07:00
if ( ! canLink ( vertId ) )
{
return false ;
}
if ( isDuplicated ( vertId ) )
{
m_MakePolygon = true ;
return true ;
}
m_LinkedVertices [ m_LinkedIndex ] = vertId ;
m_LinkedIndex + + ;
return true ;
}
void CPolygonLinker : : draw ( CPieInternal * target ) {
2007-12-24 14:50:45 -08:00
Uint16 i ;
Uint8 color [ 4 ] = { 0 , 0 , 64 , 255 } ;
2007-12-24 14:11:18 -08:00
bool bTextured = false ;
glDisable ( GL_DEPTH_TEST ) ;
if ( glIsEnabled ( GL_TEXTURE_2D ) )
{
glDisable ( GL_TEXTURE_2D ) ;
bTextured = true ;
}
2007-10-24 05:29:36 -07:00
for ( i = 0 ; i < m_LinkedIndex ; i + + )
{
if ( ( i + 1 ) > = m_LinkedIndex )
{
break ;
}
2007-12-24 14:11:18 -08:00
glColor4ub ( color [ 0 ] , color [ 1 ] , color [ 2 ] + i * 32 , color [ 3 ] ) ;
2007-10-24 05:29:36 -07:00
glBegin ( GL_LINES ) ;
glVertex3f ( target - > m_Vertices [ m_LinkedVertices [ i ] ] - > vertice . x ,
target - > m_Vertices [ m_LinkedVertices [ i ] ] - > vertice . y ,
target - > m_Vertices [ m_LinkedVertices [ i ] ] - > vertice . z ) ;
glVertex3f ( target - > m_Vertices [ m_LinkedVertices [ i + 1 ] ] - > vertice . x ,
target - > m_Vertices [ m_LinkedVertices [ i + 1 ] ] - > vertice . y ,
target - > m_Vertices [ m_LinkedVertices [ i + 1 ] ] - > vertice . z ) ;
glEnd ( ) ;
}
glColor4ub ( 255 , 255 , 255 , 255 ) ;
2007-12-24 14:11:18 -08:00
glEnable ( GL_DEPTH_TEST ) ;
if ( bTextured )
{
glEnable ( GL_TEXTURE_2D ) ;
}
2007-10-24 05:29:36 -07:00
}
void CPolygonLinker : : makePolygon ( CPieInternal * target ) {
2007-12-24 14:50:45 -08:00
Uint8 i ;
Uint16 polyIndex ;
2007-10-24 05:29:36 -07:00
polyIndex = target - > findFreeSlot ( 1 ) ;
target - > m_Polygons [ polyIndex ] = ( IMD_POLY_LIST * ) malloc ( sizeof ( IMD_POLY_LIST ) ) ;
memset ( target - > m_Polygons [ polyIndex ] , 0 , sizeof ( IMD_POLY_LIST ) ) ;
2007-12-24 14:11:18 -08:00
//TODO:make flags customizable?
target - > m_Polygons [ polyIndex ] - > polygon . flags = 0x00000200 ;
2007-10-24 05:29:36 -07:00
target - > m_Polygons [ polyIndex ] - > polygon . pTexAnim = NULL ;
target - > m_Polygons [ polyIndex ] - > polygon . pindex = ( VERTEXID * ) malloc ( sizeof ( VERTEXID ) * pie_MAX_VERTICES_PER_POLYGON ) ;
target - > m_Polygons [ polyIndex ] - > polygon . texCoord = ( Vector2f * ) malloc ( sizeof ( Vector2f ) * pie_MAX_VERTICES_PER_POLYGON ) ;
memset ( target - > m_Polygons [ polyIndex ] - > polygon . texCoord , 0 , sizeof ( Vector2f ) * pie_MAX_VERTICES_PER_POLYGON ) ;
target - > m_Polygons [ polyIndex ] - > polygon . npnts = m_LinkedIndex ;
2007-12-24 14:11:18 -08:00
target - > m_Polygons [ polyIndex ] - > callback . Id = polyIndex ;
target - > m_Polygons [ polyIndex ] - > callback . pInstance = ( void * ) target ;
2007-10-24 05:29:36 -07:00
for ( i = 0 ; i < m_LinkedIndex ; i + + )
{
target - > m_Polygons [ polyIndex ] - > polygon . pindex [ i ] = ( VERTEXID ) m_LinkedVertices [ i ] ;
}
2007-12-24 14:11:18 -08:00
target - > m_Polygons [ polyIndex ] - > id = polyIndex ;
target - > m_Polygons [ polyIndex ] - > frame = 0 ; //set default frame to 0
2007-10-24 05:29:36 -07:00
if ( polyIndex = = target - > m_polyCount )
{
target - > m_polyCount + + ;
}
m_MakePolygon = false ;
m_LinkedIndex = 0 ;
}
//the in game pie_Draw3DShape2 function for reference's sake
#if 0
static void pie_Draw3DShape2 ( iIMDShape * shape , int frame , PIELIGHT colour , PIELIGHT specular , int pieFlag , int pieFlagData )
{
unsigned int n ;
Vector3f * pVertices , * pPixels , scrPoints [ pie_MAX_VERTICES ] ;
iIMDPoly * pPolys ;
PIEPOLY piePoly ;
VERTEXID * index ;
bool light = lighting ;
/* Set tranlucency */
if ( pieFlag & pie_ADDITIVE )
{ //Assume also translucent
//pie_SetRendMode(REND_ADDITIVE_TEX);
2007-12-24 14:50:45 -08:00
colour . byte . a = ( Uint8 ) pieFlagData ;
2007-10-24 05:29:36 -07:00
//pie_SetBilinear(true);
light = false ;
}
else if ( pieFlag & pie_TRANSLUCENT )
{
//pie_SetRendMode(REND_ALPHA_TEX);
2007-12-24 14:50:45 -08:00
colour . byte . a = ( Uint8 ) pieFlagData ;
2007-10-24 05:29:36 -07:00
//pie_SetBilinear(false);//never bilinear with constant alpha, gives black edges
light = false ;
}
else
{
//pie_SetRendMode(REND_GOURAUD_TEX);
//if hardware fog then alpha is set else unused in decal mode
if ( pieFlag & pie_NO_BILINEAR )
{
//pie_SetBilinear(false);
}
else
{
//pie_SetBilinear(true);
}
}
pie_SetTexturePage ( shape - > texpage ) ;
//now draw the shape
//rotate and project points from shape->points to scrPoints
for ( pVertices = shape - > points , pPixels = scrPoints ;
pVertices < shape - > points + shape - > npoints ;
pVertices + + , pPixels + + )
{
pPixels - > x = pVertices - > x ;
pPixels - > y = pVertices - > y ;
pPixels - > z = pVertices - > z ;
}
for ( pPolys = shape - > polys ;
pPolys < shape - > polys + shape - > npolys ;
pPolys + + )
{
piePoly . flags = pPolys - > flags ;
if ( pieFlag & pie_TRANSLUCENT )
{
/* There are no PIE files with PIE_ALPHA set, this is the only user, and
* this flag is never checked anywhere , except we check below that _some_
* flag is set . This is weird . FIXME . - Per */
piePoly . flags | = PIE_ALPHA ;
}
else if ( pieFlag & pie_ADDITIVE )
{
piePoly . flags & = ( 0xffffffff - PIE_COLOURKEYED ) ; //dont treat additive images as colour keyed
}
for ( n = 0 , index = pPolys - > pindex ;
n < pPolys - > npnts ;
n + + , index + + )
{
pieVrts [ n ] . x = scrPoints [ * index ] . x ;
pieVrts [ n ] . y = scrPoints [ * index ] . y ;
pieVrts [ n ] . z = scrPoints [ * index ] . z ;
pieVrts [ n ] . u = pPolys - > texCoord [ n ] . x ;
pieVrts [ n ] . v = pPolys - > texCoord [ n ] . y ;
pieVrts [ n ] . light . argb = colour . argb ;
pieVrts [ n ] . specular . argb = specular . argb ;
}
piePoly . nVrts = pPolys - > npnts ;
piePoly . pVrts = pieVrts ;
piePoly . pTexAnim = pPolys - > pTexAnim ;
if ( piePoly . flags > 0 )
{
pie_PiePolyFrame ( & piePoly , frame , light ) ; // draw the polygon ...
}
}
if ( pieFlag & pie_BUTTON )
{
pie_SetDepthBufferStatus ( DEPTH_CMP_ALWAYS_WRT_ON ) ;
}
}
# endif
///Constructed from a imd
2007-12-24 14:50:45 -08:00
CPieInternal : : CPieInternal ( Uint16 uid , iIMDShape * imd , const char * name , bool isSub , CPieInternal * parent ) {
Uint32 i , j , vertIndex = 0 ;
2007-10-24 05:29:36 -07:00
2007-12-24 14:11:18 -08:00
memset ( this - > m_Polygons , 0 , sizeof ( IMD_POLY_LIST ) * pie_MAX_POLYGONS ) ;
memset ( this - > m_Vertices , 0 , sizeof ( VERTICE_LIST ) * pie_MAX_VERTICES ) ;
memset ( this - > m_Connectors , 0 , sizeof ( CONNECTOR_LIST ) * pie_MAX_VERTICES ) ;
m_IsSub = isSub ;
m_Visible = true ;
m_saveNow = false ;
m_drawAnim = m_framesVisible = m_controlSubAnim = false ;
m_parent = parent ;
m_numAnimFrames = 0 ; //imd->numFrames; need to load ani file
m_frameInterval = 0 ;
m_currAnimFrame = 0xFFFFFFFF ;
m_levels = 0 ;
2007-10-24 05:29:36 -07:00
strncpy ( & m_Name [ 0 ] , name , 255 ) ;
2007-12-24 14:11:18 -08:00
died = false ;
2007-10-24 05:29:36 -07:00
m_polyCount = m_vertCount = m_connCount = 0 ;
m_newVerticeX = m_newVerticeY = m_newVerticeZ = 0.0f ;
m_VelocityX = m_VelocityY = m_VelocityZ = 0.0f ;
2007-12-24 14:11:18 -08:00
m_duplicateX = m_duplicateY = m_duplicateZ = 0.0f ;
2007-10-24 05:29:36 -07:00
this - > uid = uid ;
this - > setInstance ( ) ;
this - > m_InstanceCallback . pInstance = ( void * ) this ;
this - > m_InstanceCallback . Id = 0 ;
this - > m_AddVerticeCB . pInstance = ( void * ) this ;
this - > m_AddVerticeCB . Id = PIE_VERTICE ;
this - > m_AddConnectorCB . pInstance = ( void * ) this ;
this - > m_AddConnectorCB . Id = PIE_CONNECTOR ;
this - > m_numInstances = 0 ;
this - > m_TexpageId = imd - > texpage ;
for ( i = 0 ; i < imd - > npolys ; i + + )
{
m_Polygons [ i ] = ( IMD_POLY_LIST * ) malloc ( sizeof ( IMD_POLY_LIST ) ) ;
memset ( & m_Polygons [ i ] - > polygon , 0 , sizeof ( iIMDPoly ) ) ;
if ( imd - > polys [ i ] . pTexAnim ! = NULL )
{
m_Polygons [ i ] - > polygon . pTexAnim = ( iTexAnim * ) malloc ( sizeof ( iTexAnim ) ) ;
memcpy ( m_Polygons [ i ] - > polygon . pTexAnim , imd - > polys [ i ] . pTexAnim , sizeof ( iTexAnim ) ) ;
}
else
{
m_Polygons [ i ] - > polygon . pTexAnim = NULL ;
}
2007-12-24 14:11:18 -08:00
m_Polygons [ i ] - > frame = 0 ; //set default frame to 0
2007-10-24 05:29:36 -07:00
m_Polygons [ i ] - > polygon . texCoord = ( Vector2f * ) malloc ( sizeof ( Vector2f ) * pie_MAX_VERTICES_PER_POLYGON ) ;
m_Polygons [ i ] - > polygon . pindex = ( VERTEXID * ) malloc ( sizeof ( VERTEXID ) * pie_MAX_VERTICES_PER_POLYGON ) ;
for ( j = 0 ;
j < imd - > polys [ i ] . npnts ;
j + + )
{
2007-12-24 14:11:18 -08:00
m_Polygons [ i ] - > polygon . pindex [ j ] = imd - > polys [ i ] . pindex [ j ] ;
2007-10-24 05:29:36 -07:00
m_Polygons [ i ] - > polygon . texCoord [ j ] . x = imd - > polys [ i ] . texCoord [ j ] . x ;
m_Polygons [ i ] - > polygon . texCoord [ j ] . y = imd - > polys [ i ] . texCoord [ j ] . y ;
}
m_Polygons [ i ] - > polygon . normal = imd - > polys [ i ] . normal ;
m_Polygons [ i ] - > polygon . npnts = imd - > polys [ i ] . npnts ;
m_Polygons [ i ] - > polygon . zcentre = imd - > polys [ i ] . zcentre ;
m_Polygons [ i ] - > polygon . flags = imd - > polys [ i ] . flags ;
2007-12-24 14:11:18 -08:00
m_Polygons [ i ] - > callback . Id = i ;
m_Polygons [ i ] - > callback . pInstance = ( void * ) this ;
2007-10-24 05:29:36 -07:00
m_Polygons [ i ] - > id = i ;
m_Polygons [ i ] - > selected = false ;
2007-12-24 14:11:18 -08:00
m_Polygons [ i ] - > hasVBO = false ;
2007-10-24 05:29:36 -07:00
m_polyCount + + ;
}
for ( i = 0 ; i < imd - > npoints ; i + + )
{
m_Vertices [ vertIndex ] = ( VERTICE_LIST * ) malloc ( sizeof ( VERTICE_LIST ) ) ;
m_Vertices [ vertIndex ] - > vertice . x = imd - > points [ vertIndex ] . x ;
m_Vertices [ vertIndex ] - > vertice . y = imd - > points [ vertIndex ] . y ;
m_Vertices [ vertIndex ] - > vertice . z = imd - > points [ vertIndex ] . z ;
m_Vertices [ vertIndex ] - > id = vertIndex ;
m_Vertices [ vertIndex ] - > selected = false ;
2007-12-24 14:11:18 -08:00
m_Vertices [ vertIndex ] - > callback . pInstance = this - > getInstance ( ) ;
m_Vertices [ vertIndex ] - > callback . Id = vertIndex ;
2007-10-24 05:29:36 -07:00
m_vertCount + + ;
vertIndex + + ;
}
for ( i = 0 ; i < imd - > nconnectors ; i + + )
{
m_Connectors [ i ] = ( CONNECTOR_LIST * ) malloc ( sizeof ( CONNECTOR_LIST ) ) ;
m_Connectors [ i ] - > connector . x = imd - > connectors [ i ] . x ;
m_Connectors [ i ] - > connector . y = imd - > connectors [ i ] . y ;
m_Connectors [ i ] - > connector . z = imd - > connectors [ i ] . z ;
m_Connectors [ i ] - > id = m_connCount ;
m_Connectors [ i ] - > selected = false ;
2007-12-24 14:11:18 -08:00
m_Connectors [ i ] - > callback . pInstance = this - > getInstance ( ) ;
m_Connectors [ i ] - > callback . Id = i ;
2007-10-24 05:29:36 -07:00
m_connCount + + ;
}
this - > addGUI ( ) ;
2007-12-24 14:11:18 -08:00
if ( imd - > next )
{
g_SubModelIndex + + ;
if ( this - > m_parent )
{
this - > m_nextSub = new CPieInternal ( g_SubModelIndex , imd - > next , " sub " , true , this - > m_parent ) ;
this - > m_parent - > m_levels + + ;
}
else
{
this - > m_nextSub = new CPieInternal ( g_SubModelIndex , imd - > next , " sub " , true , this ) ;
}
}
else
{
this - > m_nextSub = NULL ;
}
if ( this - > m_levels > 0 )
{
this - > readAnimFile ( this - > m_Name ) ;
this - > updateGUI ( ) ;
// Updates sub model gui as well
CPieInternal * temp = this - > m_nextSub ;
while ( temp )
{
temp - > updateGUI ( ) ;
temp = temp - > m_nextSub ;
}
}
2007-10-24 05:29:36 -07:00
}
///Newly generated CPieInternal
2007-12-24 14:50:45 -08:00
CPieInternal : : CPieInternal ( Uint16 uid , const char * name , Sint32 textureId , bool isSub , CPieInternal * parent ) {
2007-12-24 14:11:18 -08:00
memset ( this - > m_Polygons , 0 , sizeof ( IMD_POLY_LIST ) * pie_MAX_POLYGONS ) ;
memset ( this - > m_Vertices , 0 , sizeof ( VERTICE_LIST ) * pie_MAX_VERTICES ) ;
memset ( this - > m_Connectors , 0 , sizeof ( CONNECTOR_LIST ) * pie_MAX_VERTICES ) ;
died = false ;
m_IsSub = isSub ;
m_Visible = true ;
m_saveNow = false ;
m_drawAnim = m_framesVisible = m_controlSubAnim = false ;
m_parent = parent ;
m_numAnimFrames = 0 ;
m_frameInterval = 0 ;
m_currAnimFrame = 0xFFFFFFFF ;
m_levels = 0 ;
if ( parent )
{
parent - > m_levels + + ;
}
m_levels = m_polyCount = m_vertCount = m_connCount = 0 ;
2007-10-24 05:29:36 -07:00
m_newVerticeX = m_newVerticeY = m_newVerticeZ = 0.0f ;
m_VelocityX = m_VelocityY = m_VelocityZ = 0.0f ;
2007-12-24 14:11:18 -08:00
m_duplicateX = m_duplicateY = m_duplicateZ = 0.0f ;
2007-10-24 05:29:36 -07:00
this - > uid = uid ;
this - > setInstance ( ) ;
this - > m_InstanceCallback . pInstance = ( void * ) this ;
this - > m_InstanceCallback . Id = 0 ;
2007-12-24 14:11:18 -08:00
this - > m_AddVerticeCB . pInstance = ( void * ) this ;
this - > m_AddVerticeCB . Id = PIE_VERTICE ;
this - > m_AddConnectorCB . pInstance = ( void * ) this ;
this - > m_AddConnectorCB . Id = PIE_CONNECTOR ;
2007-10-24 05:29:36 -07:00
this - > m_numInstances = 0 ;
this - > m_TexpageId = textureId ;
2007-12-24 14:11:18 -08:00
// Sets newly generated poly's next sub to null
this - > m_nextSub = NULL ;
2007-10-24 05:29:36 -07:00
// Sets m_Name's length to 0
m_Name [ 0 ] = ' \0 ' ;
strncpy ( m_Name , name , 255 ) ;
this - > addGUI ( ) ;
}
///Constructed from a imd
CPieInternal : : ~ CPieInternal ( ) {
2007-12-24 14:50:45 -08:00
Uint32 i ;
2007-10-24 05:29:36 -07:00
for ( i = 0 ; i < m_polyCount ; i + + )
{
if ( m_Polygons [ i ] )
{
if ( ! TwDeleteBar ( m_polyBars [ i ] ) )
{
fprintf ( stderr , TwGetLastError ( ) ) ;
}
m_polyBars [ i ] = NULL ;
if ( m_Polygons [ i ] - > polygon . pTexAnim ! = NULL )
{
free ( m_Polygons [ i ] - > polygon . pTexAnim ) ;
m_Polygons [ i ] - > polygon . pTexAnim = NULL ;
}
if ( m_Polygons [ i ] - > polygon . texCoord ! = NULL )
{
free ( m_Polygons [ i ] - > polygon . texCoord ) ;
m_Polygons [ i ] - > polygon . texCoord = NULL ;
}
if ( m_Polygons [ i ] - > polygon . pindex ! = NULL )
{
free ( m_Polygons [ i ] - > polygon . pindex ) ;
m_Polygons [ i ] - > polygon . pindex = NULL ;
2007-12-24 14:11:18 -08:00
}
2007-10-24 05:29:36 -07:00
2007-12-24 14:11:18 -08:00
if ( m_Polygons [ i ] - > hasVBO )
{
g_Screen . glDeleteBuffersARB ( 1 , & m_Polygons [ i ] - > VBOId ) ;
2007-10-24 05:29:36 -07:00
}
free ( m_Polygons [ i ] ) ;
m_Polygons [ i ] = NULL ;
}
}
2007-12-24 14:11:18 -08:00
if ( this - > m_IsSub )
{
/* do nothing handled in ResMaster now
//assert(this->m_parent != NULL);
CPieInternal * next = this - > m_parent ;
while ( next )
{
if ( next - > m_nextSub = = this )
{
next - > m_nextSub = next - > m_nextSub - > m_nextSub ;
break ;
}
next = next - > m_nextSub ;
}
//fprintf(stderr, "No Sub model found at %d in model at %d\n", this->m_parent, this);
*/
}
else
{
// Deletes sub models
CPieInternal * next = this - > m_nextSub ;
while ( next )
{
CPieInternal * temp = next - > m_nextSub ;
delete next ;
next = temp ;
}
}
for ( i = 0 ; i < this - > m_numAnimFrames ; i + + )
{
TwDeleteBar ( this - > m_frames [ i ] . Bar ) ;
this - > m_frames [ i ] . Bar = NULL ;
}
2007-10-24 05:29:36 -07:00
if ( ! TwDeleteBar ( m_toolBar ) )
{
fprintf ( stderr , TwGetLastError ( ) ) ;
}
//TwDeleteBar(m_vertBar);
m_toolBar = NULL ;
if ( ! TwDeleteBar ( m_vertBar ) )
{
fprintf ( stderr , TwGetLastError ( ) ) ;
}
//TwDeleteBar(m_vertBar);
m_vertBar = NULL ;
if ( ! TwDeleteBar ( m_connBar ) )
{
fprintf ( stderr , TwGetLastError ( ) ) ;
}
//TwDeleteBar(m_connBar);
m_connBar = NULL ;
for ( i = 0 ; i < m_vertCount ; i + + )
{
if ( m_Vertices [ i ] )
{
free ( m_Vertices [ i ] ) ;
m_Vertices [ i ] = NULL ;
}
}
for ( i = 0 ; i < m_connCount ; i + + )
{
if ( m_Connectors [ i ] )
{
free ( m_Connectors [ i ] ) ;
m_Connectors [ i ] = NULL ;
}
}
2007-12-24 14:11:18 -08:00
/*
if ( g_Screen . m_useVBO )
{
g_Screen . glDeleteBuffersARB ( 1 , & m_VerticesHLVBOId ) ;
g_Screen . glDeleteBuffersARB ( 1 , & m_ConnectorsHLVBOId ) ;
}
*/
2007-10-24 05:29:36 -07:00
}
CPieInternal * CPieInternal : : getInstance ( void ) {
return m_instance ;
}
void CPieInternal : : setInstance ( void ) {
m_instance = this ;
}
///Convert to iIMDShape
iIMDShape * CPieInternal : : ToIMD ( void ) {
iIMDShape * newIMD = NULL ;
2007-12-24 14:50:45 -08:00
Uint32 i , j , vertIndex = 0 , newPolyIndex , newVertIndex , newConnIndex ;
2007-10-24 05:29:36 -07:00
newIMD = ( iIMDShape * ) malloc ( sizeof ( iIMDShape ) ) ;
memset ( newIMD , 0 , sizeof ( iIMDShape ) ) ;
newIMD - > texpage = m_TexpageId ;
newIMD - > npolys = 0 ;
newIMD - > polys = ( iIMDPoly * ) malloc ( sizeof ( iIMDPoly ) * pie_MAX_POLYGONS ) ;
newIMD - > points = ( Vector3f * ) malloc ( sizeof ( Vector3f ) * pie_MAX_VERTICES ) ;
newIMD - > connectors = ( Vector3f * ) malloc ( sizeof ( Vector3f ) * pie_MAX_VERTICES ) ;
newIMD - > npoints = 0 ;
newPolyIndex = 0 ;
for ( i = 0 ; i < m_polyCount ; i + + )
{
if ( m_Polygons [ i ] = = NULL )
{
continue ;
}
2007-12-24 14:11:18 -08:00
newIMD - > polys [ newPolyIndex ] . pindex = ( VERTEXID * ) malloc ( sizeof ( VERTEXID ) * pie_MAX_VERTICES_PER_POLYGON ) ;
newIMD - > polys [ newPolyIndex ] . texCoord = ( Vector2f * ) malloc ( sizeof ( Vector2f ) * pie_MAX_VERTICES_PER_POLYGON ) ;
newIMD - > polys [ newPolyIndex ] . flags = m_Polygons [ i ] - > polygon . flags ;
newIMD - > polys [ newPolyIndex ] . normal = m_Polygons [ i ] - > polygon . normal ;
newIMD - > polys [ newPolyIndex ] . npnts = m_Polygons [ i ] - > polygon . npnts ;
newIMD - > polys [ newPolyIndex ] . zcentre = m_Polygons [ i ] - > polygon . zcentre ;
//TODO:TexAnim
newIMD - > polys [ newPolyIndex ] . pTexAnim = ( iTexAnim * ) malloc ( sizeof ( iTexAnim ) ) ;
//memcpy(newIMD->polys[newPolyIndex], m_Polygons[i]->polygon, sizeof(iIMDPoly));
//newIMD->polys[newPolyIndex] = m_Polygons[i]->polygon;
if ( m_Polygons [ i ] - > polygon . pTexAnim )
{
memcpy ( newIMD - > polys [ newPolyIndex ] . pTexAnim , m_Polygons [ i ] - > polygon . pTexAnim , sizeof ( iTexAnim ) ) ;
}
else
{
newIMD - > polys [ newPolyIndex ] . pTexAnim = NULL ;
}
for ( j = 0 ; j < m_Polygons [ i ] - > polygon . npnts ; j + + )
{
//memcpy(&newIMD->polys[newPolyIndex].pindex[j], &m_Polygons[i]->polygon.pindex[j], sizeof(VERTEXID));
newIMD - > polys [ newPolyIndex ] . pindex [ j ] = m_Polygons [ i ] - > polygon . pindex [ j ] ;
newIMD - > polys [ newPolyIndex ] . texCoord [ j ] = m_Polygons [ i ] - > polygon . texCoord [ j ] ;
//newIMD->polys[newPolyIndex].pTexAnim[j] = m_Polygons[i]->polygon.pTexAnim[j];
}
2007-10-24 05:29:36 -07:00
//newIMD->polys[i] = m_Polygons[i]->polygon;
newIMD - > npolys + + ;
newPolyIndex + + ;
/*
newVertIndex = 0 ;
for ( j = 0 ; j < m_Polygons [ i ] - > polygon . npnts ; j + + )
{
if ( m_Vertices [ vertIndex ] = = NULL )
{
fprintf ( stderr , " WARNING:NULL vertice at index %d \n " , vertIndex ) ;
vertIndex + + ;
continue ;
}
newIMD - > points [ vertIndex ] . x = m_Vertices [ j ] - > vertice . x ;
newIMD - > points [ vertIndex ] . y = m_Vertices [ j ] - > vertice . y ;
newIMD - > points [ vertIndex ] . z = m_Vertices [ j ] - > vertice . z ;
newIMD - > npoints + + ;
vertIndex + + ;
}
*/
}
newVertIndex = 0 ;
for ( i = 0 ; i < m_vertCount ; i + + )
{
if ( m_Vertices [ vertIndex ] = = NULL )
{
2007-12-24 14:11:18 -08:00
// Paranoid check
int polys , points ;
for ( polys = 0 ; polys < newIMD - > npolys ; polys + + )
{
for ( points = 0 ; points < newIMD - > polys [ polys ] . npnts ; points + + )
{
if ( newIMD - > polys [ polys ] . pindex [ points ] > vertIndex )
{
newIMD - > polys [ polys ] . pindex [ points ] - = 1 ;
}
}
}
2007-10-24 05:29:36 -07:00
fprintf ( stderr , " WARNING:NULL vertice at index %d \n " , vertIndex ) ;
vertIndex + + ;
continue ;
}
newIMD - > points [ newVertIndex ] . x = m_Vertices [ i ] - > vertice . x ;
newIMD - > points [ newVertIndex ] . y = m_Vertices [ i ] - > vertice . y ;
newIMD - > points [ newVertIndex ] . z = m_Vertices [ i ] - > vertice . z ;
newVertIndex + + ;
newIMD - > npoints + + ;
vertIndex + + ;
}
newConnIndex = 0 ;
for ( i = 0 ; i < m_connCount ; i + + )
{
if ( m_Connectors [ i ] = = NULL )
{
continue ;
}
newIMD - > connectors [ newConnIndex ] . x = m_Connectors [ i ] - > connector . x ;
newIMD - > connectors [ newConnIndex ] . y = m_Connectors [ i ] - > connector . y ;
newIMD - > connectors [ newConnIndex ] . z = m_Connectors [ i ] - > connector . z ;
newIMD - > nconnectors + + ;
newConnIndex + + ;
}
2007-12-24 14:11:18 -08:00
//Recursively save the multilevel pies
CPieInternal * sub = this - > m_nextSub ;
if ( sub )
{
newIMD - > next = sub - > ToIMD ( ) ;
}
2007-10-24 05:29:36 -07:00
return newIMD ;
}
2007-12-24 14:11:18 -08:00
bool CPieInternal : : ToFile ( const char * filename , bool isOld ) {
2007-10-24 05:29:36 -07:00
FILE * file ;
iIMDShape * tmpIMD ;
file = fopen ( filename , " w+ " ) ;
if ( file = = NULL )
{
fprintf ( stderr , " error when creating file %s \n " , filename ) ;
return false ;
}
tmpIMD = this - > ToIMD ( ) ;
if ( tmpIMD = = NULL )
{
fprintf ( stderr , " null imd when trying to save to file %s " , filename ) ;
return false ;
}
2007-12-24 14:11:18 -08:00
if ( isOld )
{
iV_IMDSaveOld ( filename , tmpIMD , true ) ;
}
else
{
iV_IMDSave ( filename , tmpIMD , true ) ;
}
int i ;
for ( i = 0 ; i < tmpIMD - > npolys ; i + + )
{
if ( tmpIMD - > polys [ i ] . pindex )
{
free ( tmpIMD - > polys [ i ] . pindex ) ;
tmpIMD - > polys [ i ] . pindex = NULL ;
}
if ( tmpIMD - > polys [ i ] . pindex )
{
free ( tmpIMD - > polys [ i ] . texCoord ) ;
tmpIMD - > polys [ i ] . texCoord = NULL ;
}
if ( tmpIMD - > polys [ i ] . pTexAnim )
{
free ( tmpIMD - > polys [ i ] . pTexAnim ) ;
tmpIMD - > polys [ i ] . pindex = NULL ;
}
}
if ( tmpIMD - > polys )
{
free ( tmpIMD - > polys ) ;
tmpIMD - > polys = NULL ;
}
if ( tmpIMD - > points )
{
free ( tmpIMD - > points ) ;
tmpIMD - > points = NULL ;
}
if ( tmpIMD - > connectors )
{
free ( tmpIMD - > connectors ) ;
tmpIMD - > connectors = NULL ;
}
2007-10-24 05:29:36 -07:00
free ( tmpIMD ) ;
2007-12-24 14:11:18 -08:00
tmpIMD = NULL ;
2007-10-24 05:29:36 -07:00
return true ;
}
bool CPieInternal : : isVerticeDuplicated ( Vector3f v ) {
2007-12-24 14:50:45 -08:00
Uint16 i ;
2007-10-24 05:29:36 -07:00
for ( i = 0 ; i < m_vertCount ; i + + )
{
if ( v . x = = m_Vertices [ i ] - > vertice . x & &
v . y = = m_Vertices [ i ] - > vertice . y & &
v . z = = m_Vertices [ i ] - > vertice . z )
{
return true ;
}
}
return false ;
}
2007-12-24 14:50:45 -08:00
Uint16 CPieInternal : : findFreeSlot ( Uint8 type ) {
Uint16 i ;
2007-10-24 05:29:36 -07:00
switch ( type )
{
case PIE_VERTICE :
for ( i = 0 ; i < m_vertCount ; i + + )
{
if ( m_Vertices [ i ] = = NULL )
{
return i ;
}
}
return m_vertCount ;
case PIE_POLYGON :
for ( i = 0 ; i < m_polyCount ; i + + )
{
if ( m_Polygons [ i ] = = NULL )
{
return i ;
}
}
return m_polyCount ;
case PIE_CONNECTOR :
for ( i = 0 ; i < m_connCount ; i + + )
{
if ( m_Connectors [ i ] = = NULL )
{
return i ;
}
}
return m_connCount ;
default :
fprintf ( stderr , " Unknown type when finding free slot \n " ) ;
return false ;
}
}
2007-12-24 14:50:45 -08:00
bool CPieInternal : : addVertice ( Uint8 type ) {
Uint16 slot ;
2007-10-24 05:29:36 -07:00
slot = this - > findFreeSlot ( type ) ;
if ( slot = = 0xFFFF )
{
return false ;
}
switch ( type )
{
case PIE_VERTICE :
m_Vertices [ slot ] = ( VERTICE_LIST * ) malloc ( sizeof ( VERTICE_LIST ) ) ;
m_Vertices [ slot ] - > vertice . x = m_newVerticeX ;
m_Vertices [ slot ] - > vertice . y = m_newVerticeY ;
m_Vertices [ slot ] - > vertice . z = m_newVerticeZ ;
2007-12-24 14:11:18 -08:00
m_Vertices [ slot ] - > id = slot ;
2007-10-24 05:29:36 -07:00
m_Vertices [ slot ] - > selected = false ;
m_Vertices [ slot ] - > callback . pInstance = this - > getInstance ( ) ;
2007-12-24 14:11:18 -08:00
m_Vertices [ slot ] - > callback . Id = slot ;
2007-10-24 05:29:36 -07:00
if ( slot = = m_vertCount )
{
m_vertCount + + ;
}
2007-12-24 14:11:18 -08:00
// Now rebuilds every frame due to gui
2007-10-24 05:29:36 -07:00
// Re-construct the shared vertice list
2007-12-24 14:11:18 -08:00
//this->constructSharedVerticeList();
// Re-build highlight cache
//this->buildHLCache();
2007-10-24 05:29:36 -07:00
return true ;
case PIE_CONNECTOR :
m_Connectors [ slot ] = ( CONNECTOR_LIST * ) malloc ( sizeof ( CONNECTOR_LIST ) ) ;
m_Connectors [ slot ] - > connector . x = m_newVerticeX ;
m_Connectors [ slot ] - > connector . y = m_newVerticeY ;
m_Connectors [ slot ] - > connector . z = m_newVerticeZ ;
2007-12-24 14:11:18 -08:00
m_Connectors [ slot ] - > id = slot ;
2007-10-24 05:29:36 -07:00
m_Connectors [ slot ] - > selected = false ;
2007-12-24 14:11:18 -08:00
m_Connectors [ slot ] - > callback . pInstance = this - > getInstance ( ) ;
m_Connectors [ slot ] - > callback . Id = slot ;
2007-10-24 05:29:36 -07:00
if ( slot = = m_connCount )
{
m_connCount + + ;
}
return true ;
default :
fprintf ( stderr , " Unknown type when adding vertice \n " ) ;
return false ;
}
}
2007-12-24 14:50:45 -08:00
bool CPieInternal : : removeVerticeAt ( Uint16 position ) {
Uint16 i , j ;
2007-10-24 05:29:36 -07:00
VERTEXID * vertexId ;
2007-12-24 14:11:18 -08:00
// Traverse and remove all polygons using this vertice
2007-10-24 05:29:36 -07:00
for ( i = 0 ; i < m_polyCount ; i + + )
{
if ( m_Polygons [ i ] )
{
vertexId = m_Polygons [ i ] - > polygon . pindex ;
for ( j = 0 ; j < m_Polygons [ i ] - > polygon . npnts ; j + + , vertexId + + )
{
if ( * vertexId = = ( VERTEXID ) position )
{
if ( m_Polygons [ i ] - > polygon . pTexAnim ! = NULL )
{
free ( m_Polygons [ i ] - > polygon . pTexAnim ) ;
m_Polygons [ i ] - > polygon . pTexAnim = NULL ;
}
if ( m_Polygons [ i ] - > polygon . texCoord ! = NULL )
{
free ( m_Polygons [ i ] - > polygon . texCoord ) ;
m_Polygons [ i ] - > polygon . texCoord = NULL ;
}
if ( m_Polygons [ i ] - > polygon . pindex ! = NULL )
{
free ( m_Polygons [ i ] - > polygon . pindex ) ;
m_Polygons [ i ] - > polygon . pindex = NULL ;
}
2007-12-24 14:11:18 -08:00
if ( m_Polygons [ i ] - > hasVBO )
{
g_Screen . glDeleteBuffersARB ( 1 , & m_Polygons [ i ] - > VBOId ) ;
}
2007-10-24 05:29:36 -07:00
free ( m_Polygons [ i ] ) ;
m_Polygons [ i ] = NULL ;
break ;
}
}
}
}
if ( m_Vertices [ position ] )
{
free ( m_Vertices [ position ] ) ;
m_Vertices [ position ] = NULL ;
m_SharedVertices [ position ] . numShared = 0 ;
2007-12-24 14:11:18 -08:00
//this->buildHLCache();
2007-10-24 05:29:36 -07:00
return true ;
}
fprintf ( stderr , " vertice in position %d doesnt exist \n " , position ) ;
return false ;
}
2007-12-24 14:50:45 -08:00
bool CPieInternal : : removeConnectorAt ( Uint16 position ) {
2007-10-24 05:29:36 -07:00
if ( m_Connectors [ position ] )
{
free ( m_Connectors [ position ] ) ;
m_Connectors [ position ] = NULL ;
2007-12-24 14:11:18 -08:00
//this->buildHLCache();
2007-10-24 05:29:36 -07:00
return true ;
}
fprintf ( stderr , " connector in position %d doesnt exist \n " , position ) ;
return false ;
}
2007-12-24 14:11:18 -08:00
void CPieInternal : : selectAll ( void ) {
2007-12-24 14:50:45 -08:00
Uint16 i ;
2007-10-24 05:29:36 -07:00
for ( i = 0 ; i < m_vertCount ; i + + )
{
2007-12-24 14:11:18 -08:00
if ( m_Vertices [ i ] )
2007-10-24 05:29:36 -07:00
{
2007-12-24 14:11:18 -08:00
m_Vertices [ i ] - > selected = true ;
2007-10-24 05:29:36 -07:00
}
}
2007-12-24 14:11:18 -08:00
for ( i = 0 ; i < m_connCount ; i + + )
2007-10-24 05:29:36 -07:00
{
2007-12-24 14:11:18 -08:00
if ( m_Connectors [ i ] )
2007-10-24 05:29:36 -07:00
{
2007-12-24 14:11:18 -08:00
m_Connectors [ i ] - > selected = true ;
2007-10-24 05:29:36 -07:00
}
}
2007-12-24 14:11:18 -08:00
}
2007-10-24 05:29:36 -07:00
2007-12-24 14:11:18 -08:00
void CPieInternal : : unselectAll ( void ) {
2007-12-24 14:50:45 -08:00
Uint16 i ;
2007-12-24 14:11:18 -08:00
for ( i = 0 ; i < m_vertCount ; i + + )
{
if ( m_Vertices [ i ] )
{
m_Vertices [ i ] - > selected = false ;
}
}
for ( i = 0 ; i < m_connCount ; i + + )
{
if ( m_Connectors [ i ] )
{
m_Connectors [ i ] - > selected = false ;
}
}
}
void CPieInternal : : moveSelected ( void ) {
2007-12-24 14:50:45 -08:00
Uint16 i ;
2007-12-24 14:11:18 -08:00
for ( i = 0 ; i < m_vertCount ; i + + )
{
if ( m_Vertices [ i ] & & m_Vertices [ i ] - > selected )
{
m_Vertices [ i ] - > vertice . x + = m_VelocityX ;
m_Vertices [ i ] - > vertice . y + = m_VelocityY ;
m_Vertices [ i ] - > vertice . z + = m_VelocityZ ;
//this->buildHLCache();
}
}
}
///Remove selected vertices and connectors
void CPieInternal : : removeSelected ( void ) {
2007-12-24 14:50:45 -08:00
Uint16 i ;
2007-12-24 14:11:18 -08:00
for ( i = 0 ; i < m_vertCount ; i + + )
{
if ( m_Vertices [ i ] & & m_Vertices [ i ] - > selected )
{
this - > removeVerticeAt ( i ) ;
}
}
for ( i = 0 ; i < m_connCount ; i + + )
2007-10-24 05:29:36 -07:00
{
if ( m_Connectors [ i ] & & m_Connectors [ i ] - > selected )
{
this - > removeConnectorAt ( i ) ;
}
}
}
//TODO:finish this
2007-12-24 14:50:45 -08:00
void CPieInternal : : symmetricSelected ( Uint8 Axis ) {
2007-10-24 05:29:36 -07:00
}
2007-12-24 14:11:18 -08:00
bool CPieInternal : : duplicateSelected ( void ) {
2007-12-24 14:50:45 -08:00
Uint16 i , count ;
2007-12-24 14:11:18 -08:00
count = 0 ;
for ( i = 0 ; i < m_vertCount ; i + + )
{
if ( m_Vertices [ i ] & & m_Vertices [ i ] - > selected )
{
2007-12-24 14:50:45 -08:00
Uint16 slot ;
2007-12-24 14:11:18 -08:00
slot = this - > findFreeSlot ( PIE_VERTICE ) ;
if ( slot = = 0xFFFF )
{
fprintf ( stderr , " no slot left for duplicate at %d \n " , i ) ;
return false ;
}
m_Vertices [ slot ] = ( VERTICE_LIST * ) malloc ( sizeof ( VERTICE_LIST ) ) ;
m_Vertices [ slot ] - > vertice . x = m_Vertices [ i ] - > vertice . x + m_duplicateX ;
m_Vertices [ slot ] - > vertice . y = m_Vertices [ i ] - > vertice . y + m_duplicateY ;
m_Vertices [ slot ] - > vertice . z = m_Vertices [ i ] - > vertice . z + m_duplicateZ ;
m_Vertices [ slot ] - > id = slot ;
m_Vertices [ slot ] - > selected = false ;
m_Vertices [ slot ] - > callback . pInstance = this - > getInstance ( ) ;
m_Vertices [ slot ] - > callback . Id = slot ;
m_vertCount + + ;
count + + ;
}
}
fprintf ( stderr , " %d vertices duplicated. \n " , count ) ;
return true ;
}
2007-12-24 14:50:45 -08:00
bool CPieInternal : : duplicatePoly ( Uint16 index ) {
Uint16 i ;
Uint16 newPolyIndex ;
2007-12-24 14:11:18 -08:00
newPolyIndex = this - > findFreeSlot ( PIE_POLYGON ) ;
if ( this - > m_Polygons [ newPolyIndex ] ! = NULL )
{
fprintf ( stderr , " Error when duplicating polygon, polygon slot %d is used. \n " , newPolyIndex ) ;
return false ;
}
this - > m_Polygons [ newPolyIndex ] = ( IMD_POLY_LIST * ) malloc ( sizeof ( IMD_POLY_LIST ) ) ;
memset ( this - > m_Polygons [ newPolyIndex ] , 0 , sizeof ( IMD_POLY_LIST ) ) ;
//TODO:make flags customizable?
m_Polygons [ newPolyIndex ] - > polygon . flags = 0x00000200 ;
m_Polygons [ newPolyIndex ] - > polygon . pTexAnim = NULL ;
m_Polygons [ newPolyIndex ] - > polygon . pindex = ( VERTEXID * ) malloc ( sizeof ( VERTEXID ) * pie_MAX_VERTICES_PER_POLYGON ) ;
m_Polygons [ newPolyIndex ] - > polygon . texCoord = ( Vector2f * ) malloc ( sizeof ( Vector2f ) * pie_MAX_VERTICES_PER_POLYGON ) ;
memset ( m_Polygons [ newPolyIndex ] - > polygon . texCoord , 0 , sizeof ( Vector2f ) * pie_MAX_VERTICES_PER_POLYGON ) ;
m_Polygons [ newPolyIndex ] - > polygon . npnts = m_Polygons [ index ] - > polygon . npnts ;
m_Polygons [ newPolyIndex ] - > polygon . normal = m_Polygons [ index ] - > polygon . normal ;
m_Polygons [ newPolyIndex ] - > id = newPolyIndex ;
m_Polygons [ newPolyIndex ] - > frame = 0 ; //set default frame to 0
m_Polygons [ newPolyIndex ] - > hasVBO = false ;
for ( i = 0 ; i < m_Polygons [ index ] - > polygon . npnts ; i + + )
{
2007-12-24 14:50:45 -08:00
Uint16 slot ;
2007-12-24 14:11:18 -08:00
slot = findFreeSlot ( PIE_VERTICE ) ;
if ( slot = = 0xFFFF )
{
fprintf ( stderr , " no slot left for polygon duplicate vertice at %d \n " , i ) ;
free ( m_Polygons [ index ] ) ;
m_Polygons [ index ] = NULL ;
return false ;
}
m_Vertices [ slot ] = ( VERTICE_LIST * ) malloc ( sizeof ( VERTICE_LIST ) ) ;
m_Vertices [ slot ] - > vertice . x = m_Vertices [ i ] - > vertice . x + m_duplicateX ;
m_Vertices [ slot ] - > vertice . y = m_Vertices [ i ] - > vertice . y + m_duplicateY ;
m_Vertices [ slot ] - > vertice . z = m_Vertices [ i ] - > vertice . z + m_duplicateZ ;
m_Vertices [ slot ] - > id = slot ;
m_Vertices [ slot ] - > selected = false ;
m_Vertices [ slot ] - > callback . pInstance = this - > getInstance ( ) ;
m_Vertices [ slot ] - > callback . Id = slot ;
m_vertCount + + ;
m_Polygons [ newPolyIndex ] - > polygon . pindex [ i ] = ( VERTEXID ) slot ;
m_Polygons [ newPolyIndex ] - > polygon . texCoord [ i ] . x = m_Polygons [ index ] - > polygon . texCoord [ i ] . x ;
m_Polygons [ newPolyIndex ] - > polygon . texCoord [ i ] . y = m_Polygons [ index ] - > polygon . texCoord [ i ] . y ;
m_Polygons [ newPolyIndex ] - > callback . Id = newPolyIndex ;
m_Polygons [ newPolyIndex ] - > callback . pInstance = ( void * ) this ;
}
m_polyCount + + ;
return true ;
}
2007-10-24 05:29:36 -07:00
void CPieInternal : : checkSelection ( float x1 , float y1 , float z1 ,
float x2 , float y2 , float z2 ) {
2007-12-24 14:50:45 -08:00
Uint16 i , chosen ;
2007-10-24 05:29:36 -07:00
float mag , minDist ;
float xdiff = x2 - x1 , ydiff = y2 - y1 , zdiff = z2 - z1 ;
Vector3f slope = { xdiff , ydiff , zdiff } ;
2007-12-24 14:11:18 -08:00
if ( ! m_Visible )
{
goto CheckNextSubSelection ;
}
2007-10-24 05:29:36 -07:00
mag = sqrtf ( slope . x * slope . x + slope . y * slope . y + slope . z * slope . z ) ;
slope . x / = mag ;
slope . y / = mag ;
slope . z / = mag ;
minDist = 0.0f ;
chosen = 0xFFFF ;
for ( i = 0 ; i < m_vertCount ; i + + )
{
if ( m_Vertices [ i ] )
{
//Begin of Ray Test
xdiff = m_Vertices [ i ] - > vertice . x - x1 ;
ydiff = m_Vertices [ i ] - > vertice . y - y1 ;
zdiff = m_Vertices [ i ] - > vertice . z - z1 ;
Vector3f selectSlope = { xdiff , ydiff , zdiff } ;
mag = sqrtf ( selectSlope . x * selectSlope . x + selectSlope . y * selectSlope . y + selectSlope . z * selectSlope . z ) ;
selectSlope . x / = mag ;
selectSlope . y / = mag ;
selectSlope . z / = mag ;
xdiff = slope . x - selectSlope . x ;
ydiff = slope . y - selectSlope . y ;
zdiff = slope . z - selectSlope . z ;
float dist = xdiff * xdiff + ydiff * ydiff + zdiff * zdiff ;
if ( dist < = VERTICE_SELECT_RADIUS )
{
//TODO:fix broken cycling through shared vertice code
#if 0
if ( isMouseButtonDoubleDown ( 1 ) )
{
if ( m_SharedVertices [ i ] . numShared )
{
2007-12-24 14:50:45 -08:00
Uint16 index , newIndex ;
2007-10-24 05:29:36 -07:00
for ( index = 0 ; index < m_SharedVertices [ i ] . numShared ; index + + )
{
if ( m_Vertices [ m_SharedVertices [ i ] . shared [ index ] ] - > selected )
{
newIndex = index + 1 ;
if ( newIndex > = m_SharedVertices [ i ] . numShared )
{
newIndex = 0 ;
}
//assert(m_Vertices[m_SharedVertices[i].shared[newIndex]] != NULL);
m_Vertices [ m_SharedVertices [ i ] . shared [ index ] ] - > selected = false ;
m_Vertices [ m_SharedVertices [ i ] . shared [ newIndex ] ] - > selected = true ;
}
}
return ;
}
else
{
if ( m_Vertices [ i ] - > selected )
{
m_Vertices [ i ] - > selected = false ;
}
else
{
m_Vertices [ i ] - > selected = true ;
}
return ;
}
}
else
{
# endif
if ( minDist < = 0.0f )
{
minDist = dist ;
chosen = i ;
}
else
{
if ( dist < minDist )
{
minDist = dist ;
chosen = i ;
}
minDist = dist ;
}
}
}
}
if ( chosen ! = 0xFFFF )
{
if ( m_Vertices [ chosen ] - > selected )
{
m_Vertices [ chosen ] - > selected = false ;
}
else
{
m_Vertices [ chosen ] - > selected = true ;
}
return ;
}
minDist = 0.0f ;
chosen = 0xFFFF ;
for ( i = 0 ; i < m_connCount ; i + + )
{
if ( m_Connectors [ i ] )
{
//Begin of Ray Test
xdiff = m_Connectors [ i ] - > connector . x - x1 ;
ydiff = m_Connectors [ i ] - > connector . z - y1 ;
zdiff = m_Connectors [ i ] - > connector . y - z1 ;
Vector3f selectSlope = { xdiff , ydiff , zdiff } ;
mag = sqrtf ( selectSlope . x * selectSlope . x + selectSlope . y * selectSlope . y + selectSlope . z * selectSlope . z ) ;
selectSlope . x / = mag ;
selectSlope . y / = mag ;
selectSlope . z / = mag ;
xdiff = slope . x - selectSlope . x ;
ydiff = slope . y - selectSlope . y ;
zdiff = slope . z - selectSlope . z ;
float dist = xdiff * xdiff + ydiff * ydiff + zdiff * zdiff ;
if ( dist < = VERTICE_SELECT_RADIUS )
{
if ( minDist < = 0.0f )
{
minDist = dist ;
chosen = i ;
}
else
{
if ( dist < minDist )
{
minDist = dist ;
chosen = i ;
}
minDist = dist ;
}
}
}
}
if ( chosen ! = 0xFFFF )
{
if ( m_Connectors [ chosen ] - > selected )
{
m_Connectors [ chosen ] - > selected = false ;
}
else
{
m_Connectors [ chosen ] - > selected = true ;
}
2007-12-24 14:11:18 -08:00
return ;
}
CheckNextSubSelection :
if ( this - > m_nextSub )
{
this - > m_nextSub - > checkSelection ( x1 , y1 , z1 ,
x2 , y2 , z2 ) ;
2007-10-24 05:29:36 -07:00
}
}
VERTICE_LIST * CPieInternal : : getVertices ( void ) {
return m_Vertices [ 0 ] ;
}
IMD_POLY_LIST * CPieInternal : : getPolys ( void ) {
return m_Polygons [ 0 ] ;
}
CONNECTOR_LIST * CPieInternal : : getConnectors ( void ) {
return m_Connectors [ 0 ] ;
}
void CPieInternal : : setPosition ( float x , float y , float z ) {
m_position . x = x ;
m_position . y = y ;
m_position . z = z ;
}
2007-12-24 14:11:18 -08:00
void CPieInternal : : buildHLCache ( void ) {
2007-12-24 14:50:45 -08:00
Sint32 i , index ;
2007-12-24 14:11:18 -08:00
index = - 1 ;
m_vertHLCount = 0 ;
for ( i = 0 ; i < m_vertCount ; i + + )
{
if ( m_Vertices [ i ] )
{
+ + index ;
m_VerticesHLCache [ index ] . x = m_Vertices [ i ] - > vertice . x ;
m_VerticesHLCache [ index ] . y = m_Vertices [ i ] - > vertice . y + 1.0f ;
m_VerticesHLCache [ index ] . z = m_Vertices [ i ] - > vertice . z ;
+ + index ;
m_VerticesHLCache [ index ] . x = m_Vertices [ i ] - > vertice . x + 1.0f ;
m_VerticesHLCache [ index ] . y = m_Vertices [ i ] - > vertice . y ;
m_VerticesHLCache [ index ] . z = m_Vertices [ i ] - > vertice . z ;
+ + index ;
m_VerticesHLCache [ index ] . x = m_Vertices [ i ] - > vertice . x ;
m_VerticesHLCache [ index ] . y = m_Vertices [ i ] - > vertice . y - 1.0f ;
m_VerticesHLCache [ index ] . z = m_Vertices [ i ] - > vertice . z ;
+ + index ;
m_VerticesHLCache [ index ] . x = m_Vertices [ i ] - > vertice . x - 1.0f ;
m_VerticesHLCache [ index ] . y = m_Vertices [ i ] - > vertice . y ;
m_VerticesHLCache [ index ] . z = m_Vertices [ i ] - > vertice . z ;
m_vertHLCount + + ;
}
}
index = - 1 ;
m_connHLCount = 0 ;
for ( i = 0 ; i < m_connCount ; i + + )
{
if ( m_Connectors [ i ] )
{
+ + index ;
m_ConnectorsHLCache [ index ] . x = m_Connectors [ i ] - > connector . x ;
m_ConnectorsHLCache [ index ] . y = m_Connectors [ i ] - > connector . z + 1.0f ;
m_ConnectorsHLCache [ index ] . z = m_Connectors [ i ] - > connector . y ;
+ + index ;
m_ConnectorsHLCache [ index ] . x = m_Connectors [ i ] - > connector . x + 1.0f ;
m_ConnectorsHLCache [ index ] . y = m_Connectors [ i ] - > connector . z - 1.0f ;
m_ConnectorsHLCache [ index ] . z = m_Connectors [ i ] - > connector . y ;
+ + index ;
m_ConnectorsHLCache [ index ] . x = m_Connectors [ i ] - > connector . x - 1.0f ;
m_ConnectorsHLCache [ index ] . y = m_Connectors [ i ] - > connector . z - 1.0f ;
m_ConnectorsHLCache [ index ] . z = m_Connectors [ i ] - > connector . y ;
m_connHLCount + + ;
}
}
#if 0
if ( g_Screen . m_useVBO )
{
2007-12-24 14:50:45 -08:00
Sint32 test ;
2007-12-24 14:11:18 -08:00
if ( ! bRebuild )
{
if ( m_vertHLCount )
{
glGenBuffersARB ( 1 , & m_VerticesHLVBOId ) ;
glBindBufferARB ( GL_ARRAY_BUFFER_ARB , m_VerticesHLVBOId ) ;
glBufferDataARB ( GL_ARRAY_BUFFER_ARB , m_vertHLCount * 4 , m_VerticesHLCache , GL_STATIC_DRAW_ARB ) ;
}
if ( m_connHLCount )
{
glGenBuffersARB ( 1 , & m_ConnectorsHLVBOId ) ;
glBindBufferARB ( GL_ARRAY_BUFFER_ARB , m_ConnectorsHLVBOId ) ;
glBufferDataARB ( GL_ARRAY_BUFFER_ARB , m_connHLCount * 3 , m_ConnectorsHLCache , GL_STATIC_DRAW_ARB ) ;
}
glBindBufferARB ( GL_ARRAY_BUFFER_ARB , 0 ) ;
bRebuild = true ;
}
else
{
//Deletes and recreate there is no need to map buffer cos HL lists may resize
glDeleteBuffersARB ( 1 , & m_VerticesHLVBOId ) ;
glDeleteBuffersARB ( 1 , & m_ConnectorsHLVBOId ) ;
if ( m_vertHLCount )
{
glGenBuffersARB ( 1 , & m_VerticesHLVBOId ) ;
glBindBufferARB ( GL_ARRAY_BUFFER_ARB , m_VerticesHLVBOId ) ;
glBufferDataARB ( GL_ARRAY_BUFFER_ARB , m_vertHLCount * 4 , m_VerticesHLCache , GL_STATIC_DRAW_ARB ) ;
glGetBufferParameterivARB ( GL_ARRAY_BUFFER_ARB , GL_BUFFER_SIZE_ARB , & test ) ;
}
if ( m_connHLCount )
{
glGenBuffersARB ( 1 , & m_ConnectorsHLVBOId ) ;
glBindBufferARB ( GL_ARRAY_BUFFER_ARB , m_ConnectorsHLVBOId ) ;
glBufferDataARB ( GL_ARRAY_BUFFER_ARB , m_connHLCount * 3 , m_ConnectorsHLCache , GL_STATIC_DRAW_ARB ) ;
glGetBufferParameterivARB ( GL_ARRAY_BUFFER_ARB , GL_BUFFER_SIZE_ARB , & test ) ;
}
glBindBufferARB ( GL_ARRAY_BUFFER_ARB , 0 ) ;
}
}
# endif
}
2007-10-24 05:29:36 -07:00
void CPieInternal : : constructSharedVerticeList ( void ) {
2007-12-24 14:50:45 -08:00
Uint16 i , count , count2 ;
2007-10-24 05:29:36 -07:00
count = count2 = 0 ;
for ( i = 0 ; i < m_vertCount ; i + + )
{
m_SharedVertices [ i ] . shared [ 0 ] = i ;
m_SharedVertices [ i ] . numShared = 1 ;
count2 = count ;
while ( count2 )
{
2007-12-24 14:11:18 -08:00
if ( m_Vertices [ count2 - 1 ] & & m_Vertices [ i ] )
2007-10-24 05:29:36 -07:00
{
2007-12-24 14:11:18 -08:00
if ( m_Vertices [ count2 - 1 ] - > vertice . x = = m_Vertices [ i ] - > vertice . x & &
m_Vertices [ count2 - 1 ] - > vertice . y = = m_Vertices [ i ] - > vertice . y & &
m_Vertices [ count2 - 1 ] - > vertice . z = = m_Vertices [ i ] - > vertice . z )
{
m_SharedVertices [ i ] . shared [ m_SharedVertices [ i ] . numShared ] = count2 - 1 ;
m_SharedVertices [ i ] . numShared + + ;
// duplicate the shared info
memcpy ( & m_SharedVertices [ count2 - 1 ] , & m_SharedVertices [ i ] , sizeof ( SHARED_VERTICE ) ) ;
}
2007-10-24 05:29:36 -07:00
}
count2 - - ;
}
count + + ;
}
}
void CPieInternal : : drawNewVertice ( void ) {
2007-12-24 14:11:18 -08:00
bool bTextured = false ;
if ( ! this - > m_Visible ) {
return ;
}
2007-10-24 05:29:36 -07:00
glDisable ( GL_DEPTH_TEST ) ;
2007-12-24 14:11:18 -08:00
if ( glIsEnabled ( GL_TEXTURE_2D ) )
{
glDisable ( GL_TEXTURE_2D ) ;
bTextured = true ;
}
glColor4ub ( 255 , 0 , 0 , 255 ) ;
2007-10-24 05:29:36 -07:00
glBegin ( GL_LINES ) ;
2007-12-24 14:11:18 -08:00
glVertex3f ( m_newVerticeX + 0.3f , m_newVerticeY , m_newVerticeZ ) ;
2007-10-24 05:29:36 -07:00
glVertex3f ( m_newVerticeX + 2.0f , m_newVerticeY , m_newVerticeZ ) ;
2007-12-24 14:11:18 -08:00
glVertex3f ( m_newVerticeX , m_newVerticeY , m_newVerticeZ + 0.3f ) ;
2007-10-24 05:29:36 -07:00
glVertex3f ( m_newVerticeX , m_newVerticeY , m_newVerticeZ + 2.0f ) ;
2007-12-24 14:11:18 -08:00
glVertex3f ( m_newVerticeX - 0.3f , m_newVerticeY , m_newVerticeZ ) ;
2007-10-24 05:29:36 -07:00
glVertex3f ( m_newVerticeX - 2.0f , m_newVerticeY , m_newVerticeZ ) ;
2007-12-24 14:11:18 -08:00
glVertex3f ( m_newVerticeX , m_newVerticeY , m_newVerticeZ - 0.3f ) ;
2007-10-24 05:29:36 -07:00
glVertex3f ( m_newVerticeX , m_newVerticeY , m_newVerticeZ - 2.0f ) ;
2007-12-24 14:11:18 -08:00
glVertex3f ( m_newVerticeX , m_newVerticeY + 0.3f , m_newVerticeZ ) ;
2007-10-24 05:29:36 -07:00
glVertex3f ( m_newVerticeX , m_newVerticeY + 2.0f , m_newVerticeZ ) ;
2007-12-24 14:11:18 -08:00
glVertex3f ( m_newVerticeX , m_newVerticeY - 0.3f , m_newVerticeZ ) ;
2007-10-24 05:29:36 -07:00
glVertex3f ( m_newVerticeX , m_newVerticeY - 2.0f , m_newVerticeZ ) ;
glEnd ( ) ;
glColor4ub ( 255 , 255 , 255 , 255 ) ;
2007-12-24 14:11:18 -08:00
if ( bTextured )
{
glEnable ( GL_TEXTURE_2D ) ;
}
2007-10-24 05:29:36 -07:00
glEnable ( GL_DEPTH_TEST ) ;
2007-12-24 14:11:18 -08:00
if ( this - > m_nextSub )
{
this - > m_nextSub - > drawNewVertice ( ) ;
}
2007-10-24 05:29:36 -07:00
}
void CPieInternal : : highLightVertices ( void ) {
2007-12-24 14:11:18 -08:00
bool bTextured = false ;
if ( ! this - > m_vertCount | |
! this - > m_Visible ) {
goto NextSubHighLightVertices ;
}
2007-10-24 05:29:36 -07:00
glDisable ( GL_DEPTH_TEST ) ;
2007-12-24 14:11:18 -08:00
if ( glIsEnabled ( GL_TEXTURE_2D ) )
{
glDisable ( GL_TEXTURE_2D ) ;
bTextured = true ;
}
2007-10-24 05:29:36 -07:00
glColor4ub ( 128 , 0 , 0 , 255 ) ;
2007-12-24 14:11:18 -08:00
glEnableClientState ( GL_VERTEX_ARRAY ) ;
glVertexPointer ( 3 , GL_FLOAT , 0 , this - > m_VerticesHLCache ) ;
glDrawArrays ( GL_QUADS , 0 , m_vertHLCount * 4 ) ;
//glDrawElements(GL_QUADS, m_vertHLCount, GL_FLOAT, this->m_VerticesHLCache);
glDisableClientState ( GL_VERTEX_ARRAY ) ;
/*
2007-12-24 14:50:45 -08:00
Uint16 i ;
2007-12-24 14:11:18 -08:00
2007-10-24 05:29:36 -07:00
for ( i = 0 ; i < m_vertCount ; i + + )
{
if ( m_Vertices [ i ] )
{
glBegin ( GL_QUADS ) ;
glVertex3f ( m_Vertices [ i ] - > vertice . x , m_Vertices [ i ] - > vertice . y + 1.0f , m_Vertices [ i ] - > vertice . z ) ;
glVertex3f ( m_Vertices [ i ] - > vertice . x + 1.0f , m_Vertices [ i ] - > vertice . y , m_Vertices [ i ] - > vertice . z ) ;
glVertex3f ( m_Vertices [ i ] - > vertice . x , m_Vertices [ i ] - > vertice . y - 1.0f , m_Vertices [ i ] - > vertice . z ) ;
glVertex3f ( m_Vertices [ i ] - > vertice . x - 1.0f , m_Vertices [ i ] - > vertice . y , m_Vertices [ i ] - > vertice . z ) ;
glEnd ( ) ;
}
}
2007-12-24 14:11:18 -08:00
*/
2007-10-24 05:29:36 -07:00
glColor4ub ( 255 , 255 , 255 , 255 ) ;
glEnable ( GL_DEPTH_TEST ) ;
2007-12-24 14:11:18 -08:00
if ( bTextured )
{
glEnable ( GL_TEXTURE_2D ) ;
}
NextSubHighLightVertices :
if ( this - > m_nextSub )
{
this - > m_nextSub - > highLightVertices ( ) ;
}
2007-10-24 05:29:36 -07:00
}
void CPieInternal : : highLightConnectors ( void ) {
2007-12-24 14:11:18 -08:00
bool bTextured = false ;
if ( ! this - > m_connCount | |
! this - > m_Visible ) {
goto NextSubHighLightConnectors ;
}
2007-10-24 05:29:36 -07:00
glDisable ( GL_DEPTH_TEST ) ;
2007-12-24 14:11:18 -08:00
if ( glIsEnabled ( GL_TEXTURE_2D ) )
{
glDisable ( GL_TEXTURE_2D ) ;
bTextured = true ;
}
2007-10-24 05:29:36 -07:00
glColor4ub ( 0 , 128 , 0 , 255 ) ;
2007-12-24 14:11:18 -08:00
glEnableClientState ( GL_VERTEX_ARRAY ) ;
glVertexPointer ( 3 , GL_FLOAT , 0 , this - > m_ConnectorsHLCache ) ;
//glDrawElements(GL_TRIANGLES, m_connHLCount, GL_FLOAT, this->m_ConnectorsHLCache);
glDrawArrays ( GL_TRIANGLES , 0 , m_connHLCount * 3 ) ;
glDisableClientState ( GL_VERTEX_ARRAY ) ;
/*
2007-12-24 14:50:45 -08:00
Uint16 i ;
2007-12-24 14:11:18 -08:00
2007-10-24 05:29:36 -07:00
for ( i = 0 ; i < m_connCount ; i + + )
{
if ( m_Connectors [ i ] )
{
2007-12-24 14:11:18 -08:00
glBegin ( GL_TRIANGLES ) ;
2007-10-24 05:29:36 -07:00
glVertex3f ( m_Connectors [ i ] - > connector . x , m_Connectors [ i ] - > connector . z + 1.0f , m_Connectors [ i ] - > connector . y ) ;
glVertex3f ( m_Connectors [ i ] - > connector . x + 1.0f , m_Connectors [ i ] - > connector . z - 1.0f , m_Connectors [ i ] - > connector . y ) ;
glVertex3f ( m_Connectors [ i ] - > connector . x - 1.0f , m_Connectors [ i ] - > connector . z - 1.0f , m_Connectors [ i ] - > connector . y ) ;
glEnd ( ) ;
}
}
2007-12-24 14:11:18 -08:00
*/
2007-10-24 05:29:36 -07:00
glColor4ub ( 255 , 255 , 255 , 255 ) ;
glEnable ( GL_DEPTH_TEST ) ;
2007-12-24 14:11:18 -08:00
if ( bTextured )
{
glEnable ( GL_TEXTURE_2D ) ;
}
NextSubHighLightConnectors :
if ( this - > m_nextSub )
{
this - > m_nextSub - > highLightConnectors ( ) ;
}
2007-10-24 05:29:36 -07:00
}
void CPieInternal : : highLightSelected ( void ) {
2007-12-24 14:50:45 -08:00
Uint16 i ;
2007-12-24 14:11:18 -08:00
bool bTextured = false ;
if ( ! this - > m_Visible ) {
goto NextSubHighLightSelected ;
}
2007-10-24 05:29:36 -07:00
glDisable ( GL_DEPTH_TEST ) ;
2007-12-24 14:11:18 -08:00
if ( glIsEnabled ( GL_TEXTURE_2D ) )
{
glDisable ( GL_TEXTURE_2D ) ;
bTextured = true ;
}
2007-10-24 05:29:36 -07:00
glColor4ub ( 255 , 255 , 0 , 255 ) ;
for ( i = 0 ; i < m_vertCount ; i + + )
{
if ( m_Vertices [ i ] & & m_Vertices [ i ] - > selected )
{
glBegin ( GL_QUADS ) ;
glVertex3f ( m_Vertices [ i ] - > vertice . x , m_Vertices [ i ] - > vertice . y + 1.0f , m_Vertices [ i ] - > vertice . z ) ;
glVertex3f ( m_Vertices [ i ] - > vertice . x + 1.0f , m_Vertices [ i ] - > vertice . y , m_Vertices [ i ] - > vertice . z ) ;
glVertex3f ( m_Vertices [ i ] - > vertice . x , m_Vertices [ i ] - > vertice . y - 1.0f , m_Vertices [ i ] - > vertice . z ) ;
glVertex3f ( m_Vertices [ i ] - > vertice . x - 1.0f , m_Vertices [ i ] - > vertice . y , m_Vertices [ i ] - > vertice . z ) ;
glEnd ( ) ;
}
}
for ( i = 0 ; i < m_connCount ; i + + )
{
if ( m_Connectors [ i ] & & m_Connectors [ i ] - > selected )
{
glBegin ( GL_TRIANGLE_FAN ) ;
glVertex3f ( m_Connectors [ i ] - > connector . x , m_Connectors [ i ] - > connector . z + 1.0f , m_Connectors [ i ] - > connector . y ) ;
glVertex3f ( m_Connectors [ i ] - > connector . x + 1.0f , m_Connectors [ i ] - > connector . z - 1.0f , m_Connectors [ i ] - > connector . y ) ;
glVertex3f ( m_Connectors [ i ] - > connector . x - 1.0f , m_Connectors [ i ] - > connector . z - 1.0f , m_Connectors [ i ] - > connector . y ) ;
glEnd ( ) ;
}
}
glColor4ub ( 255 , 255 , 255 , 255 ) ;
glEnable ( GL_DEPTH_TEST ) ;
2007-12-24 14:11:18 -08:00
if ( bTextured )
{
glEnable ( GL_TEXTURE_2D ) ;
}
NextSubHighLightSelected :
if ( this - > m_nextSub )
{
this - > m_nextSub - > highLightSelected ( ) ;
}
2007-10-24 05:29:36 -07:00
}
2007-12-24 14:50:45 -08:00
void CPieInternal : : bindTexture ( Sint32 num )
2007-10-24 05:29:36 -07:00
{
glBindTexture ( GL_TEXTURE_2D , _TEX_PAGE [ num ] . id ) ;
}
2007-12-24 14:11:18 -08:00
void CPieInternal : : logic ( void ) {
this - > constructSharedVerticeList ( ) ;
this - > buildHLCache ( ) ;
2007-10-24 05:29:36 -07:00
2007-12-24 14:50:45 -08:00
Uint16 i ;
2007-12-24 14:11:18 -08:00
for ( i = 0 ; i < m_numAnimFrames ; i + + )
{
if ( m_frames [ i ] . died )
{
this - > removeFrame ( i ) ;
break ;
}
}
2007-10-24 05:29:36 -07:00
2007-12-24 14:11:18 -08:00
if ( this - > m_nextSub )
{
this - > m_nextSub - > logic ( ) ;
}
}
2007-10-24 05:29:36 -07:00
2007-12-24 14:50:45 -08:00
void CPieInternal : : drawInterleaved ( INTERLEAVED_T2F_V3F * a_array , Uint32 count ) {
2007-12-24 14:11:18 -08:00
glInterleavedArrays ( GL_T2F_V3F , 0 , a_array ) ;
glDrawArrays ( GL_TRIANGLE_FAN , 0 , count ) ;
}
2007-10-24 05:29:36 -07:00
2007-12-24 14:50:45 -08:00
void CPieInternal : : cacheVBOPoly ( Uint32 count , Uint32 polyId ) {
2007-12-24 14:11:18 -08:00
if ( m_Polygons [ polyId ] - > hasVBO )
{
g_Screen . glDeleteBuffersARB ( 1 , & m_Polygons [ polyId ] - > VBOId ) ;
}
if ( g_Screen . glGenBuffersARB = = NULL )
{
g_Screen . glGenBuffersARB = ( PFNGLGENBUFFERSARBPROC ) SDL_GL_GetProcAddress ( " glGenBuffersARB " ) ;
}
g_Screen . glGenBuffersARB ( 1 , & m_Polygons [ polyId ] - > VBOId ) ;
g_Screen . glBindBufferARB ( GL_ARRAY_BUFFER_ARB , m_Polygons [ polyId ] - > VBOId ) ;
g_Screen . glBufferDataARB ( GL_ARRAY_BUFFER_ARB , count * sizeof ( INTERLEAVED_T2F_V3F ) , vaCache , GL_STATIC_DRAW_ARB ) ;
g_Screen . glBindBufferARB ( GL_ARRAY_BUFFER_ARB , 0 ) ;
m_Polygons [ polyId ] - > hasVBO = true ;
}
2007-10-24 05:29:36 -07:00
2007-12-24 14:50:45 -08:00
void CPieInternal : : drawVBOPoly ( Uint32 polyId ) {
2007-12-24 14:11:18 -08:00
g_Screen . glBindBufferARB ( GL_ARRAY_BUFFER_ARB , m_Polygons [ polyId ] - > VBOId ) ;
glTexCoordPointer ( 2 , GL_FLOAT , sizeof ( INTERLEAVED_T2F_V3F ) , ( char * ) 0 ) ;
glVertexPointer ( 3 , GL_FLOAT , sizeof ( INTERLEAVED_T2F_V3F ) , ( char * ) ( 0 + sizeof ( Vector2f ) ) ) ;
glDrawArrays ( GL_TRIANGLE_FAN , 0 , m_Polygons [ polyId ] - > polygon . npnts ) ;
g_Screen . glBindBufferARB ( GL_ARRAY_BUFFER_ARB , 0 ) ;
}
2007-10-24 05:29:36 -07:00
2007-12-24 14:11:18 -08:00
void CPieInternal : : flushVBOPolys ( void ) {
2007-12-24 14:50:45 -08:00
Uint32 i ;
2007-10-24 05:29:36 -07:00
for ( i = 0 ; i < m_polyCount ; i + + )
{
if ( m_Polygons [ i ] )
{
2007-12-24 14:11:18 -08:00
if ( m_Polygons [ i ] - > hasVBO )
2007-10-24 05:29:36 -07:00
{
2007-12-24 14:11:18 -08:00
g_Screen . glDeleteBuffersARB ( 1 , & m_Polygons [ i ] - > VBOId ) ;
m_Polygons [ i ] - > VBOId = 0xABABABAB ;
m_Polygons [ i ] - > hasVBO = false ;
}
}
}
if ( this - > m_nextSub )
{
this - > m_nextSub - > flushVBOPolys ( ) ;
}
}
void CPieInternal : : draw ( void ) {
//iIMDPoly *pPolys;
int i , n , vaCount = 0 ;
VERTEXID * index ;
bool bVerticeDrawn [ pie_MAX_VERTICES ] ;
bool bDrawTexture = false ;
GLdouble matrix [ 16 ] ;
if ( ! m_Visible )
{
if ( this - > m_nextSub )
{
if ( m_animMode = = ANIM3DFRAMES )
{
if ( ! m_drawAnim & & ! m_IsSub )
{
CPieInternal * temp = this - > m_nextSub ;
while ( temp )
{
temp - > draw ( ) ;
temp = temp - > m_nextSub ;
}
}
}
else
{
this - > m_nextSub - > draw ( ) ;
}
}
return ;
}
if ( m_framesVisible )
{
2007-12-24 14:50:45 -08:00
Uint32 frame ;
2007-12-24 14:11:18 -08:00
for ( frame = 0 ; frame < this - > m_numAnimFrames ; frame + + )
{
if ( m_frames [ frame ] . visible )
{
glGetDoublev ( GL_MODELVIEW_MATRIX , matrix ) ;
glTranslatef ( m_frames [ frame ] . offsetX / 1000.0f ,
m_frames [ frame ] . offsetZ / 1000.0f ,
m_frames [ frame ] . offsetY / 1000.0f ) ;
glRotatef ( - WTFScale ( m_frames [ frame ] . rotateX ) / 1000.0f , 1.0 , 0.0f , 0.0f ) ;
glRotatef ( - WTFScale ( m_frames [ frame ] . rotateZ ) / 1000.0f , 0.0 , 1.0f , 0.0f ) ;
glRotatef ( - WTFScale ( m_frames [ frame ] . rotateY ) / 1000.0f , 0.0 , 0.0f , 1.0f ) ;
glScalef ( m_frames [ frame ] . scaleX / 1000.0f ,
m_frames [ frame ] . scaleZ / 1000.0f ,
m_frames [ frame ] . scaleY / 1000.0f ) ;
glEnableClientState ( GL_VERTEX_ARRAY ) ;
glEnableClientState ( GL_TEXTURE_COORD_ARRAY ) ;
for ( i = 0 ; i < m_polyCount ; i + + )
{
//piePoly.flags = pPolys->flags;
if ( m_Polygons [ i ] )
{
vaCount = 0 ;
// No texture animation and has VBO
if ( g_Screen . m_useVBO & & m_Polygons [ i ] - > frame = = 0 & & m_Polygons [ i ] - > hasVBO )
{
this - > drawVBOPoly ( i ) ;
continue ;
}
for ( n = 0 , index = m_Polygons [ i ] - > polygon . pindex ;
n < m_Polygons [ i ] - > polygon . npnts ;
n + + , index + + )
{
if ( m_Polygons [ i ] - > frame > 0 )
{
//#define PROPER_TEXTURE_COORDS
# ifdef PROPER_TEXTURE_COORDS
vaCache [ vaCount ] . t . x = m_Polygons [ i ] - > polygon . texCoord [ n ] . x + ( m_Polygons [ i ] - > polygon . pTexAnim - > textureWidth * m_Polygons [ i ] - > frame ) / _TEX_PAGE [ m_TexpageId ] . w ;
vaCache [ vaCount ] . t . y = m_Polygons [ i ] - > polygon . texCoord [ n ] . y + ( m_Polygons [ i ] - > polygon . pTexAnim - > textureHeight * m_Polygons [ i ] - > frame ) / _TEX_PAGE [ m_TexpageId ] . h ;
# else
vaCache [ vaCount ] . t . x = m_Polygons [ i ] - > polygon . texCoord [ n ] . x + ( m_Polygons [ i ] - > polygon . pTexAnim - > textureWidth * m_Polygons [ i ] - > frame ) / 256.0f ;
vaCache [ vaCount ] . t . y = m_Polygons [ i ] - > polygon . texCoord [ n ] . y + ( m_Polygons [ i ] - > polygon . pTexAnim - > textureHeight * m_Polygons [ i ] - > frame ) / 256.0f ;
# endif
}
else
{
//#define PROPER_TEXTURE_COORDS
# ifdef PROPER_TEXTURE_COORDS
vaCache [ vaCount ] . t . x = m_Polygons [ i ] - > polygon . texCoord [ n ] . x / _TEX_PAGE [ m_TexpageId ] . w ;
vaCache [ vaCount ] . t . y = m_Polygons [ i ] - > polygon . texCoord [ n ] . y / _TEX_PAGE [ m_TexpageId ] . h ;
# else
vaCache [ vaCount ] . t . x = m_Polygons [ i ] - > polygon . texCoord [ n ] . x / 256.0f ;
vaCache [ vaCount ] . t . y = m_Polygons [ i ] - > polygon . texCoord [ n ] . y / 256.0f ;
# endif
}
vaCache [ vaCount ] . v . x = m_Vertices [ * index ] - > vertice . x ;
vaCache [ vaCount ] . v . y = m_Vertices [ * index ] - > vertice . y ;
vaCache [ vaCount ] . v . z = m_Vertices [ * index ] - > vertice . z ;
vaCount + + ;
}
//TODO:flags
if ( ! g_Screen . m_useVBO )
{
this - > drawInterleaved ( vaCache , vaCount ) ;
}
else
{
this - > cacheVBOPoly ( vaCount , i ) ;
this - > drawVBOPoly ( i ) ;
}
#if 0
glBegin ( GL_TRIANGLE_FAN ) ;
for ( n = 0 , index = m_Polygons [ i ] - > polygon . pindex ;
n < m_Polygons [ i ] - > polygon . npnts ;
n + + , index + + )
{
if ( m_Polygons [ i ] - > frame > 0 )
{
//#define PROPER_TEXTURE_COORDS
# ifdef PROPER_TEXTURE_COORDS
glTexCoord2f ( m_Polygons [ i ] - > polygon . texCoord [ n ] . x + ( m_Polygons [ i ] - > polygon . pTexAnim - > textureWidth * m_Polygons [ i ] - > frame ) / _TEX_PAGE [ m_TexpageId ] . w ,
m_Polygons [ i ] - > polygon . texCoord [ n ] . y + ( m_Polygons [ i ] - > polygon . pTexAnim - > textureHeight * m_Polygons [ i ] - > frame ) / _TEX_PAGE [ m_TexpageId ] . h ) ;
# else
glTexCoord2f ( m_Polygons [ i ] - > polygon . texCoord [ n ] . x + ( m_Polygons [ i ] - > polygon . pTexAnim - > textureWidth * m_Polygons [ i ] - > frame ) / 256.0f ,
m_Polygons [ i ] - > polygon . texCoord [ n ] . y + ( m_Polygons [ i ] - > polygon . pTexAnim - > textureHeight * m_Polygons [ i ] - > frame ) / 256.0f ) ;
# endif
}
else
{
//#define PROPER_TEXTURE_COORDS
# ifdef PROPER_TEXTURE_COORDS
glTexCoord2f ( m_Polygons [ i ] - > polygon . texCoord [ n ] . x / _TEX_PAGE [ m_TexpageId ] . w ,
m_Polygons [ i ] - > polygon . texCoord [ n ] . y / _TEX_PAGE [ m_TexpageId ] . h ) ;
# else
glTexCoord2f ( m_Polygons [ i ] - > polygon . texCoord [ n ] . x / 256.0f ,
m_Polygons [ i ] - > polygon . texCoord [ n ] . y / 256.0f ) ;
# endif
}
glVertex3f ( m_Vertices [ * index ] - > vertice . x ,
m_Vertices [ * index ] - > vertice . y ,
m_Vertices [ * index ] - > vertice . z ) ;
}
glEnd ( ) ;
# endif
}
}
glDisableClientState ( GL_VERTEX_ARRAY ) ;
glDisableClientState ( GL_TEXTURE_COORD_ARRAY ) ;
glLoadMatrixd ( matrix ) ;
}
}
//Dont draw base model as it's already drawn by frame 0
return ;
}
if ( m_drawAnim )
{
if ( m_animMode = = ANIM3DTRANS & & m_controlSubAnim )
{
CPieInternal * temp = this - > m_nextSub ;
while ( temp )
{
temp - > m_drawAnim = true ;
temp = temp - > m_nextSub ;
}
}
this - > bindTexture ( m_TexpageId ) ;
startAnim ( ) ;
glGetDoublev ( GL_MODELVIEW_MATRIX , matrix ) ;
glTranslatef ( m_frames [ m_currAnimFrame ] . offsetX / 1000.0f ,
m_frames [ m_currAnimFrame ] . offsetZ / 1000.0f ,
m_frames [ m_currAnimFrame ] . offsetY / 1000.0f ) ;
glRotatef ( - WTFScale ( m_frames [ m_currAnimFrame ] . rotateX ) / 1000.0f , 1.0 , 0.0f , 0.0f ) ;
glRotatef ( - WTFScale ( m_frames [ m_currAnimFrame ] . rotateZ ) / 1000.0f , 0.0 , 1.0f , 0.0f ) ;
glRotatef ( - WTFScale ( m_frames [ m_currAnimFrame ] . rotateY ) / 1000.0f , 0.0 , 0.0f , 1.0f ) ;
glScalef ( m_frames [ m_currAnimFrame ] . scaleX / 1000.0f ,
m_frames [ m_currAnimFrame ] . scaleZ / 1000.0f ,
m_frames [ m_currAnimFrame ] . scaleY / 1000.0f ) ;
}
else
{
if ( m_animMode = = ANIM3DTRANS & & m_controlSubAnim )
{
CPieInternal * temp = this - > m_nextSub ;
while ( temp )
{
temp - > m_drawAnim = false ;
temp = temp - > m_nextSub ;
}
}
stopAnim ( ) ;
}
if ( m_animMode = = ANIM3DFRAMES & & m_drawAnim & & ! m_IsSub )
{
2007-12-24 14:50:45 -08:00
Uint32 targetFrame = 0 ;
2007-12-24 14:11:18 -08:00
CPieInternal * temp = this ;
if ( m_currAnimFrame )
{
while ( targetFrame < m_currAnimFrame )
{
temp = temp - > m_nextSub ;
targetFrame + + ;
if ( temp = = NULL )
{
fprintf ( stderr , " WARNING:frame %d doesn't exist anymore \n " , targetFrame ) ;
return ;
}
}
temp - > draw ( ) ;
return ;
}
}
memset ( & bVerticeDrawn [ 0 ] , 0 , sizeof ( bool ) * m_vertCount ) ;
this - > bindTexture ( m_TexpageId ) ;
/*
glBegin ( GL_QUADS ) ;
glTexCoord2f ( 0.0f , 0.0f ) ;
glVertex3f ( 0.0f , 0.0f , 50.0f ) ;
glTexCoord2f ( 1.0f , 0.0f ) ;
glVertex3f ( 0.0f , 4.0f , 50.0f ) ;
glTexCoord2f ( 1.0f , 1.0f ) ;
glVertex3f ( 4.0f , 4.0f , 50.0f ) ;
glTexCoord2f ( 0.0f , 1.0f ) ;
glVertex3f ( 4.0f , 0.0f , 50.0f ) ;
glEnd ( ) ;
*/
glEnableClientState ( GL_VERTEX_ARRAY ) ;
glEnableClientState ( GL_TEXTURE_COORD_ARRAY ) ;
for ( i = 0 ; i < m_polyCount ; i + + )
{
//piePoly.flags = pPolys->flags;
if ( m_Polygons [ i ] )
{
vaCount = 0 ;
// No texture animation and has VBO
if ( g_Screen . m_useVBO & & m_Polygons [ i ] - > frame = = 0 & & m_Polygons [ i ] - > hasVBO )
{
// Also make sure vertices drawn flag is set
for ( n = 0 , index = m_Polygons [ i ] - > polygon . pindex ;
n < m_Polygons [ i ] - > polygon . npnts ;
n + + , index + + )
{
bVerticeDrawn [ * index ] = true ;
}
this - > drawVBOPoly ( i ) ;
continue ;
}
for ( n = 0 , index = m_Polygons [ i ] - > polygon . pindex ;
n < m_Polygons [ i ] - > polygon . npnts ;
n + + , index + + )
{
if ( m_Polygons [ i ] - > frame > 0 )
{
//#define PROPER_TEXTURE_COORDS
# ifdef PROPER_TEXTURE_COORDS
vaCache [ vaCount ] . t . x = m_Polygons [ i ] - > polygon . texCoord [ n ] . x + ( m_Polygons [ i ] - > polygon . pTexAnim - > textureWidth * m_Polygons [ i ] - > frame ) / _TEX_PAGE [ m_TexpageId ] . w ,
vaCache [ vaCount ] . t . y = m_Polygons [ i ] - > polygon . texCoord [ n ] . y + ( m_Polygons [ i ] - > polygon . pTexAnim - > textureHeight * m_Polygons [ i ] - > frame ) / _TEX_PAGE [ m_TexpageId ] . h ) ;
# else
vaCache [ vaCount ] . t . x = m_Polygons [ i ] - > polygon . texCoord [ n ] . x + ( m_Polygons [ i ] - > polygon . pTexAnim - > textureWidth * m_Polygons [ i ] - > frame ) / 256.0f ,
vaCache [ vaCount ] . t . y = m_Polygons [ i ] - > polygon . texCoord [ n ] . y + ( m_Polygons [ i ] - > polygon . pTexAnim - > textureHeight * m_Polygons [ i ] - > frame ) / 256.0f ;
# endif
}
else
{
//#define PROPER_TEXTURE_COORDS
# ifdef PROPER_TEXTURE_COORDS
vaCache [ vaCount ] . t . x = m_Polygons [ i ] - > polygon . texCoord [ n ] . x / _TEX_PAGE [ m_TexpageId ] . w ,
vaCache [ vaCount ] . t . y = m_Polygons [ i ] - > polygon . texCoord [ n ] . y / _TEX_PAGE [ m_TexpageId ] . h ) ;
# else
vaCache [ vaCount ] . t . x = m_Polygons [ i ] - > polygon . texCoord [ n ] . x / 256.0f ,
vaCache [ vaCount ] . t . y = m_Polygons [ i ] - > polygon . texCoord [ n ] . y / 256.0f ;
}
# endif
vaCache [ vaCount ] . v . x = m_Vertices [ * index ] - > vertice . x ;
vaCache [ vaCount ] . v . y = m_Vertices [ * index ] - > vertice . y ;
vaCache [ vaCount ] . v . z = m_Vertices [ * index ] - > vertice . z ;
vaCount + + ;
bVerticeDrawn [ * index ] = true ;
}
//TODO:flags
if ( ! g_Screen . m_useVBO )
{
this - > drawInterleaved ( vaCache , vaCount ) ;
}
else
{
this - > cacheVBOPoly ( vaCount , i ) ;
this - > drawVBOPoly ( i ) ;
}
}
}
#if 0
glBegin ( GL_TRIANGLE_FAN ) ;
for ( n = 0 , index = m_Polygons [ i ] - > polygon . pindex ;
n < m_Polygons [ i ] - > polygon . npnts ;
n + + , index + + )
{
if ( m_Polygons [ i ] - > frame > 0 )
{
//#define PROPER_TEXTURE_COORDS
# ifdef PROPER_TEXTURE_COORDS
glTexCoord2f ( m_Polygons [ i ] - > polygon . texCoord [ n ] . x / _TEX_PAGE [ m_TexpageId ] . w ,
m_Polygons [ i ] - > polygon . texCoord [ n ] . y / _TEX_PAGE [ m_TexpageId ] . h ) ;
# else
glTexCoord2f ( m_Polygons [ i ] - > polygon . texCoord [ n ] . x + ( m_Polygons [ i ] - > polygon . pTexAnim - > textureWidth * m_Polygons [ i ] - > frame ) / 256.0f ,
m_Polygons [ i ] - > polygon . texCoord [ n ] . y + ( m_Polygons [ i ] - > polygon . pTexAnim - > textureHeight * m_Polygons [ i ] - > frame ) / 256.0f ) ;
# endif
}
else
{
//#define PROPER_TEXTURE_COORDS
# ifdef PROPER_TEXTURE_COORDS
glTexCoord2f ( m_Polygons [ i ] - > polygon . texCoord [ n ] . x / _TEX_PAGE [ m_TexpageId ] . w ,
m_Polygons [ i ] - > polygon . texCoord [ n ] . y / _TEX_PAGE [ m_TexpageId ] . h ) ;
# else
glTexCoord2f ( m_Polygons [ i ] - > polygon . texCoord [ n ] . x / 256.0f ,
m_Polygons [ i ] - > polygon . texCoord [ n ] . y / 256.0f ) ;
}
# endif
2007-10-24 05:29:36 -07:00
glVertex3f ( m_Vertices [ * index ] - > vertice . x ,
m_Vertices [ * index ] - > vertice . y ,
m_Vertices [ * index ] - > vertice . z ) ;
2007-12-24 14:11:18 -08:00
2007-10-24 05:29:36 -07:00
bVerticeDrawn [ * index ] = true ;
}
glEnd ( ) ;
2007-12-24 14:11:18 -08:00
# endif
2007-10-24 05:29:36 -07:00
2007-12-24 14:11:18 -08:00
glDisable ( GL_DEPTH_TEST ) ;
glColor4ub ( 32 , 0 , 128 , 255 ) ;
for ( i = 0 ; i < m_polyCount ; i + + )
{
if ( m_Polygons [ i ] )
{
for ( n = 0 , index = m_Polygons [ i ] - > polygon . pindex ;
n < m_Polygons [ i ] - > polygon . npnts ;
n + + , index + + )
2007-10-24 05:29:36 -07:00
{
2007-12-24 14:11:18 -08:00
if ( m_Polygons [ i ] - > selected )
{
glBegin ( GL_LINE_LOOP ) ;
for ( n = 0 , index = m_Polygons [ i ] - > polygon . pindex ;
2007-10-24 05:29:36 -07:00
n < m_Polygons [ i ] - > polygon . npnts ;
n + + , index + + )
2007-12-24 14:11:18 -08:00
{
glVertex3f ( m_Vertices [ * index ] - > vertice . x ,
m_Vertices [ * index ] - > vertice . y ,
m_Vertices [ * index ] - > vertice . z ) ;
}
glEnd ( ) ;
2007-10-24 05:29:36 -07:00
}
}
}
}
2007-12-24 14:11:18 -08:00
glColor4ub ( 255 , 255 , 255 , 255 ) ;
glEnable ( GL_DEPTH_TEST ) ;
2007-10-24 05:29:36 -07:00
2007-12-24 14:11:18 -08:00
glDisableClientState ( GL_VERTEX_ARRAY ) ;
glDisableClientState ( GL_TEXTURE_COORD_ARRAY ) ;
if ( glIsEnabled ( GL_TEXTURE_2D ) )
{
glDisable ( GL_TEXTURE_2D ) ;
bDrawTexture = true ;
}
2007-10-24 05:29:36 -07:00
for ( i = 0 ; i < m_vertCount ; i + + )
{
if ( m_Vertices [ i ] & & ! bVerticeDrawn [ i ] )
{
glBegin ( GL_POINTS ) ;
glVertex3f ( m_Vertices [ i ] - > vertice . x , m_Vertices [ i ] - > vertice . y , m_Vertices [ i ] - > vertice . z ) ;
glEnd ( ) ;
}
}
2007-12-24 14:11:18 -08:00
if ( bDrawTexture )
{
glEnable ( GL_TEXTURE_2D ) ;
}
if ( m_drawAnim )
{
glLoadMatrixd ( matrix ) ;
}
if ( this - > m_nextSub )
{
if ( m_animMode = = ANIM3DFRAMES )
{
if ( ! m_drawAnim & & ! m_IsSub )
{
CPieInternal * temp = this - > m_nextSub ;
while ( temp )
{
temp - > draw ( ) ;
temp = temp - > m_nextSub ;
}
}
}
else
{
this - > m_nextSub - > draw ( ) ;
}
}
2007-10-24 05:29:36 -07:00
}
bool CPieInternal : : addGUI ( void ) {
2007-12-24 14:50:45 -08:00
Uint16 i , n , totalVertices = 0 ;
2007-10-24 05:29:36 -07:00
VERTEXID * index ;
char toolBarName [ 255 ] = " toolbar " ;
char toolBarDefine [ 255 ] ;
2007-12-24 14:11:18 -08:00
//Utility bar
if ( ! m_IsSub )
2007-10-24 05:29:36 -07:00
{
2007-12-24 14:11:18 -08:00
if ( this - > uid < 10 )
{
snprintf ( & toolBarName [ 7 ] , 1 , " 0 " ) ;
snprintf ( & toolBarName [ 8 ] , 1 , " %u " , this - > uid ) ;
strcpy ( toolBarDefine , toolBarName ) ;
snprintf ( & toolBarDefine [ 9 ] , 100 , " label = 'Pie %u ToolBar' position = '0 200' color = '%d %d %d %d' size = '%d %d' " ,
this - > uid , guiMajorAlpha , guiMajorRed , guiMajorGreen , guiMajorBlue , guiMajorWidth , guiMajorHeight ) ;
}
else if ( this - > uid < 100 )
{
snprintf ( & toolBarName [ 7 ] , 2 , " %2u " , this - > uid ) ;
strcpy ( toolBarDefine , toolBarName ) ;
snprintf ( & toolBarDefine [ 9 ] , 100 , " label = 'Pie %u ToolBar' position = '0 200' color = '%d %d %d %d' size = '%d %d' " ,
this - > uid , guiMajorAlpha , guiMajorRed , guiMajorGreen , guiMajorBlue , guiMajorWidth , guiMajorHeight ) ;
}
else
{
snprintf ( & toolBarName [ 7 ] , 3 , " %3u " , this - > uid ) ;
strcpy ( toolBarDefine , toolBarName ) ;
snprintf ( & toolBarDefine [ 10 ] , 100 , " label = 'Pie %u ToolBar' position = '0 200' color = '%d %d %d %d' size = '%d %d' " ,
this - > uid , guiMajorAlpha , guiMajorRed , guiMajorGreen , guiMajorBlue , guiMajorWidth , guiMajorHeight ) ;
}
2007-10-24 05:29:36 -07:00
}
else
{
2007-12-24 14:11:18 -08:00
snprintf ( toolBarName , 255 , " SubModel%4u " , this - > uid ) ;
snprintf ( toolBarDefine , 255 , " %s label = 'Pie %u ToolBar' position = '0 200' color = '%d %d %d %d' size = '%d %d' " ,
toolBarName , this - > uid , guiMajorAlpha , guiMajorRed , guiMajorGreen , guiMajorBlue , guiMajorWidth , guiMajorHeight ) ;
2007-10-24 05:29:36 -07:00
}
m_toolBar = TwNewBar ( toolBarName ) ;
TwDefine ( toolBarDefine ) ;
2007-12-24 14:11:18 -08:00
TwAddButton ( m_toolBar , " saveNow " , saveNowCB , & m_InstanceCallback , " label = 'Save Pie' group = 'General' " ) ;
TwAddButton ( m_toolBar , " removepie " , destructCB , & m_InstanceCallback , " label = 'Remove Pie' group = 'General' " ) ;
TwAddVarRW ( m_toolBar , " visible " , TW_TYPE_BOOLCPP , & m_Visible , " label = 'Visible' group = 'General' " ) ;
TwAddVarRW ( m_toolBar , " textureId " , TW_TYPE_INT32 , & m_TexpageId , " label = 'Page Id' min=0 max=100 step=1 group = 'General' " ) ;
TwAddButton ( m_toolBar , " showgui " , showGUICB , & m_InstanceCallback , " label = 'Show GUI' group = 'General' " ) ;
TwAddButton ( m_toolBar , " hidegui " , hideGUICB , & m_InstanceCallback , " label = 'Hide GUI' group = 'General' " ) ;
// Only non sub model can do this
if ( ! this - > m_IsSub )
{
TwAddButton ( m_toolBar , " addSubModel " , addSubModelCB , & m_InstanceCallback , " label = 'Add SubModel' group = 'SubModel and Animation' " ) ;
TwAddButton ( m_toolBar , " addSubModelFile " , addSubModelFileCB , & m_InstanceCallback , " label = 'SubModel From File' group = 'SubModel and Animation' " ) ;
TwAddButton ( m_toolBar , " readAnimFile " , readAnimFileCB , & m_InstanceCallback , " label = 'Anim From File' group = 'SubModel and Animation' " ) ;
TwAddButton ( m_toolBar , " writeAnimFile " , writeAnimFileCB , & m_InstanceCallback , " label = 'Write Anim File' group = 'SubModel and Animation' " ) ;
TwAddVarRW ( m_toolBar , " frameSpeed " , TW_TYPE_INT32 , & m_frameInterval , " label = 'Frame Speed' min=0 max=1000 step=1 group = 'SubModel and Animation' " ) ;
TwAddVarRW ( m_toolBar , " animMode " , TW_TYPE_INT32 , & m_animMode , " label = 'Anim Mode' min=0 max=1 step=1 group = 'Anim Mode' " ) ;
}
TwAddButton ( m_toolBar , " addFrame " , addFrameCB , & m_InstanceCallback , " label = 'Add Anim Frame' group = 'SubModel and Animation' " ) ;
TwAddVarRW ( m_toolBar , " controlSubAnim " , TW_TYPE_BOOLCPP , & m_controlSubAnim , " label = 'Control SubModel Anim' group = 'SubModel and Animation' " ) ;
TwAddVarRW ( m_toolBar , " drawAnim " , TW_TYPE_BOOLCPP , & m_drawAnim , " label = 'Draw Anim' group = 'SubModel and Animation' " ) ;
TwAddVarRW ( m_toolBar , " framesVisible " , TW_TYPE_BOOLCPP , & m_framesVisible , " label = 'Frames Visible' group = 'SubModel and Animation' " ) ;
TwAddButton ( m_toolBar , " selectAll " , selectAllCB , & m_InstanceCallback , " label = 'Select All' group = 'Selection and Move' " ) ;
TwAddButton ( m_toolBar , " unselectAll " , unselectAllCB , & m_InstanceCallback , " label = 'Unselect All' group = 'Selection and Move' " ) ;
TwAddButton ( m_toolBar , " moveVertices " , moveSelectedVertices , & m_InstanceCallback , " label = 'Move Selected' group = 'Selection and Move' " ) ;
TwAddVarRW ( m_toolBar , " VelocityX " , TW_TYPE_FLOAT , & m_VelocityX , " label = 'VelocityX' step = 0.1 group = 'Selection and Move' " ) ;
TwAddVarRW ( m_toolBar , " VelocityY " , TW_TYPE_FLOAT , & m_VelocityY , " label = 'VelocityY' step = 0.1 group = 'Selection and Move' " ) ;
TwAddVarRW ( m_toolBar , " VelocityZ " , TW_TYPE_FLOAT , & m_VelocityZ , " label = 'VelocityZ' step = 0.1 group = 'Selection and Move' " ) ;
TwAddButton ( m_toolBar , " removeVertices " , removeSelectedCB , & m_InstanceCallback , " label = 'Remove Selected' group = 'Selection and Move' " ) ;
TwAddVarRW ( m_toolBar , " DuplicateX " , TW_TYPE_FLOAT , & m_duplicateX , " label = 'DuplicateX' step = 0.1 group = 'Selection and Move' " ) ;
TwAddVarRW ( m_toolBar , " DuplicateY " , TW_TYPE_FLOAT , & m_duplicateY , " label = 'DuplicateY' step = 0.1 group = 'Selection and Move' " ) ;
TwAddVarRW ( m_toolBar , " DuplicateZ " , TW_TYPE_FLOAT , & m_duplicateZ , " label = 'DuplicateZ' step = 0.1 group = 'Selection and Move' " ) ;
TwAddButton ( m_toolBar , " duplicateVertices " , duplicateSelectedVertices , & m_InstanceCallback , " label = 'Duplicate Selected' group = 'Selection and Move' " ) ;
TwAddVarRW ( m_toolBar , " newVerticeX " , TW_TYPE_FLOAT , & m_newVerticeX , " label = 'New VerticeX' step = 0.1 group = 'New Vertice' " ) ;
TwAddVarRW ( m_toolBar , " newVerticeY " , TW_TYPE_FLOAT , & m_newVerticeY , " label = 'New VerticeY' step = 0.1 group = 'New Vertice' " ) ;
TwAddVarRW ( m_toolBar , " newVerticeZ " , TW_TYPE_FLOAT , & m_newVerticeZ , " label = 'New VerticeZ' step = 0.1 group = 'New Vertice' " ) ;
TwAddButton ( m_toolBar , " addVertice " , addVerticeCB , & m_AddVerticeCB , " label = 'Add Vertice' group = 'New Vertice' " ) ;
TwAddButton ( m_toolBar , " addConnector " , addVerticeCB , & m_AddConnectorCB , " label = 'Add Connector' group = 'New Vertice' " ) ;
2007-10-24 05:29:36 -07:00
//Vertices List bar
char vertBarName [ 255 ] ;
char vertBarDefine [ 255 ] ;
strncpy ( vertBarName , toolBarName , 255 ) ;
strcat ( vertBarName , " vertBar " ) ;
2007-10-24 06:43:01 -07:00
snprintf ( vertBarDefine , 255 , " %s label = 'Pie %u VerticeList' position = '%d %d' color = '%d %d %d %d' size = '%d %d' " ,
2007-12-24 14:11:18 -08:00
vertBarName , this - > uid , g_Screen . m_width , 0 , guiMajorAlpha , guiMajorRed ,
2007-10-24 05:29:36 -07:00
guiMajorGreen , guiMajorBlue , guiMajorWidth , guiMajorHeight ) ;
m_vertBar = TwNewBar ( vertBarName ) ;
TwDefine ( vertBarDefine ) ;
for ( i = 0 ; i < m_vertCount ; i + + )
{
if ( m_Vertices [ i ] )
{
char name [ 255 ] = " vert " ;
2007-10-24 06:43:01 -07:00
snprintf ( & name [ 4 ] , 3 , " %3u " , i ) ;
2007-12-24 14:11:18 -08:00
TwAddVarRW ( m_vertBar , name , g_tw_pieVertexType , m_Vertices [ i ] , " " ) ;
//TwAddVarCB(m_vertBar, name, g_tw_pieVertexType, setVarCB, getVarCB, &this->m_InstanceCallback, "");
2007-10-24 05:29:36 -07:00
}
}
//Connector list bar
char connBarName [ 255 ] ;
char connBarDefine [ 255 ] ;
strncpy ( connBarName , toolBarName , 255 ) ;
strcat ( connBarName , " connBar " ) ;
2007-10-24 06:43:01 -07:00
snprintf ( connBarDefine , 255 , " %s label = 'Pie %u ConnectorList' position = '%d %d' color = '%d %d %d %d' size = '%d %d' " ,
2007-12-24 14:11:18 -08:00
connBarName , this - > uid , g_Screen . m_width , g_Screen . m_height , guiMajorAlpha , guiMajorRed ,
2007-10-24 05:29:36 -07:00
guiMajorGreen , guiMajorBlue , guiMajorWidth , guiMajorHeight ) ;
m_connBar = TwNewBar ( connBarName ) ;
TwDefine ( connBarDefine ) ;
for ( i = 0 ; i < m_connCount ; i + + )
{
if ( m_Connectors [ i ] )
{
char name [ 255 ] = " conn " ;
2007-12-24 14:11:18 -08:00
char name2 [ 255 ] = " delconn " ;
2007-10-24 06:43:01 -07:00
snprintf ( & name [ 4 ] , 3 , " %3u " , i ) ;
2007-12-24 14:11:18 -08:00
snprintf ( & name2 [ 7 ] , 3 , " %3u " , i ) ;
TwAddButton ( m_connBar , name2 , removeConnectorAtCB , & m_Connectors [ i ] - > callback , " label = 'Remove' " ) ;
TwAddVarRW ( m_connBar , name , g_tw_pieVertexType , m_Connectors [ i ] , " " ) ;
//TwAddVarCB(m_connBar, name, g_tw_pieVertexType, setVarCB, getVarCB, &this->m_InstanceCallback, "");
2007-10-24 05:29:36 -07:00
}
}
for ( i = 0 ; i < m_polyCount ; i + + )
{
//multiple polygon names format poly[pie uid][poly uid]
char tmpString [ 255 ] = " poly " ;
char tmpString2 [ 255 ] ;
2007-12-24 14:11:18 -08:00
if ( ! this - > m_IsSub )
2007-10-24 05:29:36 -07:00
{
2007-12-24 14:11:18 -08:00
//FIXME:capped to 1000(3 digi)
//assert(this->uid < 1000);
//utterly hack to add zero's to make Bar names unique -_-
if ( i < 10 )
2007-10-24 05:29:36 -07:00
{
2007-12-24 14:11:18 -08:00
snprintf ( & tmpString [ 4 ] , 1 , " 0 " ) ;
snprintf ( & tmpString [ 5 ] , 1 , " %u " , i ) ;
2007-10-24 05:29:36 -07:00
2007-12-24 14:11:18 -08:00
if ( this - > uid < 10 )
{
snprintf ( & tmpString [ 6 ] , 1 , " 0 " ) ;
snprintf ( & tmpString [ 7 ] , 1 , " %u " , this - > uid ) ;
strcpy ( tmpString2 , tmpString ) ;
snprintf ( & tmpString2 [ 8 ] , 100 , " label = 'Pie %u Poly %u' position = '0 400' color = '%d %d %d %d' size = '%d %d' " ,
this - > uid , i , guiMinorAlpha , guiMinorRed , guiMinorGreen , guiMinorBlue , guiMinorWidth , guiMinorHeight ) ;
}
else if ( this - > uid < 100 )
{
snprintf ( & tmpString [ 6 ] , 2 , " %2u " , this - > uid ) ;
strcpy ( tmpString2 , tmpString ) ;
snprintf ( & tmpString2 [ 8 ] , 100 , " label = 'Pie %u Poly %u' position = '0 400' color = '%d %d %d %d' size = '%d %d' " ,
this - > uid , i , guiMinorAlpha , guiMinorRed , guiMinorGreen , guiMinorBlue , guiMinorWidth , guiMinorHeight ) ;
}
else
{
snprintf ( & tmpString [ 6 ] , 3 , " 3%u " , this - > uid ) ;
strcpy ( tmpString2 , tmpString ) ;
snprintf ( & tmpString2 [ 9 ] , 100 , " label = 'Pie %u Poly %u' position = '0 400' color = '%d %d %d %d' size = '%d %d' " ,
this - > uid , i , guiMinorAlpha , guiMinorRed , guiMinorGreen , guiMinorBlue , guiMinorWidth , guiMinorHeight ) ;
}
2007-10-24 05:29:36 -07:00
strcpy ( tmpString2 , tmpString ) ;
2007-10-24 06:43:01 -07:00
snprintf ( & tmpString2 [ 8 ] , 100 , " label = 'Pie %u Poly %u' position = '0 400' color = '%d %d %d %d' size = '%d %d' " ,
2007-12-24 14:11:18 -08:00
this - > uid , i , guiMinorAlpha , guiMinorRed , guiMinorGreen , guiMinorBlue , guiMinorWidth , guiMinorHeight ) ;
2007-10-24 05:29:36 -07:00
}
2007-12-24 14:11:18 -08:00
else if ( i < 100 )
2007-10-24 05:29:36 -07:00
{
2007-12-24 14:11:18 -08:00
snprintf ( & tmpString [ 4 ] , 2 , " %2u " , i ) ;
if ( this - > uid < 10 )
{
snprintf ( & tmpString [ 6 ] , 1 , " 0 " ) ;
snprintf ( & tmpString [ 7 ] , 1 , " %u " , this - > uid ) ;
strcpy ( tmpString2 , tmpString ) ;
snprintf ( & tmpString2 [ 8 ] , 100 , " label = 'Pie %u Poly %u' position = '0 400' color = '%d %d %d %d' size = '%d %d' " ,
this - > uid , i , guiMinorAlpha , guiMinorRed , guiMinorGreen , guiMinorBlue , guiMinorWidth , guiMinorHeight ) ;
}
else if ( this - > uid < 100 )
{
snprintf ( & tmpString [ 6 ] , 2 , " %2u " , this - > uid ) ;
strcpy ( tmpString2 , tmpString ) ;
snprintf ( & tmpString2 [ 8 ] , 100 , " label = 'Pie %u Poly %u' position = '0 400' color = '%d %d %d %d' size = '%d %d' " ,
this - > uid , i , guiMinorAlpha , guiMinorRed , guiMinorGreen , guiMinorBlue , guiMinorWidth , guiMinorHeight ) ;
}
else
{
snprintf ( & tmpString [ 6 ] , 3 , " 3%u " , this - > uid ) ;
strcpy ( tmpString2 , tmpString ) ;
snprintf ( & tmpString2 [ 9 ] , 100 , " label = 'Pie %u Poly %u' position = '0 400' color = '%d %d %d %d' size = '%d %d' " ,
this - > uid , i , guiMinorAlpha , guiMinorRed , guiMinorGreen , guiMinorBlue , guiMinorWidth , guiMinorHeight ) ;
}
2007-10-24 05:29:36 -07:00
}
else
{
2007-12-24 14:11:18 -08:00
snprintf ( & tmpString [ 4 ] , 3 , " %3u " , i ) ;
if ( this - > uid < 10 )
{
snprintf ( & tmpString [ 7 ] , 1 , " 0 " ) ;
snprintf ( & tmpString [ 8 ] , 1 , " %u " , this - > uid ) ;
strcpy ( tmpString2 , tmpString ) ;
snprintf ( & tmpString2 [ 9 ] , 100 , " label = 'Pie %u Poly %u' position = '0 400' color = '%d %d %d %d' size = '%d %d' " ,
this - > uid , i , guiMinorAlpha , guiMinorRed , guiMinorGreen , guiMinorBlue , guiMinorWidth , guiMinorHeight ) ;
}
else if ( this - > uid < 100 )
{
snprintf ( & tmpString [ 7 ] , 2 , " %2u " , this - > uid ) ;
strcpy ( tmpString2 , tmpString ) ;
snprintf ( & tmpString2 [ 9 ] , 100 , " label = 'Pie %u Poly %u' position = '0 400' color = '%d %d %d %d' size = '%d %d' " ,
this - > uid , i , guiMinorAlpha , guiMinorRed , guiMinorGreen , guiMinorBlue , guiMinorWidth , guiMinorHeight ) ;
}
else
{
snprintf ( & tmpString [ 7 ] , 3 , " 3%u " , this - > uid ) ;
strcpy ( tmpString2 , tmpString ) ;
snprintf ( & tmpString2 [ 10 ] , 100 , " label = 'Pie %u Poly %u' position = '0 400' color = '%d %d %d %d' size = '%d %d' " ,
this - > uid , i , guiMinorAlpha , guiMinorRed , guiMinorGreen , guiMinorBlue , guiMinorWidth , guiMinorHeight ) ;
}
2007-10-24 05:29:36 -07:00
}
}
else
{
2007-12-24 14:11:18 -08:00
snprintf ( tmpString , 255 , " SubModel%dPoly%d " , this - > uid , i ) ;
snprintf ( tmpString2 , 255 , " %s label = 'Pie %u Poly %u' position = '0 400' color = '%d %d %d %d' size = '%d %d' " ,
tmpString , this - > uid , i , guiMinorAlpha , guiMinorRed , guiMinorGreen , guiMinorBlue , guiMinorWidth , guiMinorHeight ) ;
2007-10-24 05:29:36 -07:00
}
m_polyBars [ i ] = TwNewBar ( tmpString ) ;
TwDefine ( tmpString2 ) ;
2007-12-24 14:11:18 -08:00
TwAddButton ( m_polyBars [ i ] , " duplicatePoly " , duplicatePolyCB , & m_Polygons [ i ] - > callback , " label = 'Duplicate this' " ) ;
2007-10-24 05:29:36 -07:00
TwAddVarRW ( m_polyBars [ i ] , " polyselected " , TW_TYPE_BOOLCPP , & m_Polygons [ i ] - > selected , " label = 'Poly Selected' " ) ;
2007-12-24 14:11:18 -08:00
TwAddVarRW ( m_polyBars [ i ] , " flags " , TW_TYPE_UINT32 , & m_Polygons [ i ] - > polygon . flags , " label = 'Flags' " ) ;
if ( m_Polygons [ i ] - > polygon . pTexAnim )
{
TwAddVarRW ( m_polyBars [ i ] , " texAnimFrame " , TW_TYPE_UINT16 , & m_Polygons [ i ] - > frame , " label = 'TexAnim Frame' min = 0 max = 7 step = 1 group = 'TexAnim' " ) ;
TwAddVarRW ( m_polyBars [ i ] , " texHeight " , TW_TYPE_UINT16 , & m_Polygons [ i ] - > polygon . pTexAnim - > textureHeight , " label = 'Height' min = 0 max = 31 step = 1 group = 'TexAnim' " ) ;
TwAddVarRW ( m_polyBars [ i ] , " texWidth " , TW_TYPE_UINT16 , & m_Polygons [ i ] - > polygon . pTexAnim - > textureWidth , " label = 'Width' min = 0 max = 31 step = 1 group = 'TexAnim' " ) ;
TwAddVarRW ( m_polyBars [ i ] , " textPlayRate " , TW_TYPE_UINT16 , & m_Polygons [ i ] - > polygon . pTexAnim - > playbackRate , " label = 'Height' min = 0 step = 1 group = 'TexAnim' " ) ;
TwAddVarRW ( m_polyBars [ i ] , " texFrames " , TW_TYPE_UINT16 , & m_Polygons [ i ] - > polygon . pTexAnim - > nFrames , " label = 'Width' min = 0 max = 7 step = 1 group = 'TexAnim' " ) ;
}
2007-10-24 05:29:36 -07:00
for ( n = m_Polygons [ i ] - > polygon . npnts , index = m_Polygons [ i ] - > polygon . pindex + ( m_Polygons [ i ] - > polygon . npnts - 1 ) ;
n > 0 ;
n - - , index - - )
{
char stringTemp [ 255 ] = " vert " ;
2007-12-24 14:11:18 -08:00
char stringTemp2 [ 255 ] = " delvert " ;
2007-10-24 05:29:36 -07:00
2007-10-24 06:43:01 -07:00
snprintf ( & stringTemp [ 4 ] , 55 , " id%3u uid%3u " , * index , totalVertices + + ) ;
2007-10-24 05:29:36 -07:00
2007-12-24 14:11:18 -08:00
snprintf ( & stringTemp2 [ 7 ] , 55 , " id%3u uid%3u " , * index , totalVertices ) ;
TwAddButton ( m_polyBars [ i ] , stringTemp2 , removeVerticeAtCB , & m_Vertices [ * index ] - > callback , " label = 'Remove' " ) ;
TwAddVarRW ( m_polyBars [ i ] , stringTemp , g_tw_pieVertexType , m_Vertices [ * index ] , " " ) ;
//TwAddVarCB(m_polyBars[i], stringTemp, g_tw_pieVertexType, setVarCB, getVarCB, &this->m_InstanceCallback, "");
2007-10-24 05:29:36 -07:00
#if 0
char stringX [ 255 ] = " verticeX " ;
char stringY [ 255 ] = " verticeY " ;
char stringZ [ 255 ] = " verticeZ " ;
char stringBool [ 255 ] = " bool " ;
2007-10-24 06:43:01 -07:00
snprintf ( & stringX [ 8 ] , 9 , " vert%3u " , + + totalVertices ) ;
snprintf ( & stringY [ 8 ] , 9 , " vert%3u " , + + totalVertices ) ;
snprintf ( & stringZ [ 8 ] , 9 , " vert%3u " , + + totalVertices ) ;
snprintf ( & stringBool [ 4 ] , 9 , " bool%3u " , totalVertices ) ;
2007-10-24 05:29:36 -07:00
TwAddVarRW ( m_polyBars [ i ] , stringX , TW_TYPE_FLOAT , & m_Vertices [ * index ] - > vertice . x , " label = 'Vertice X' step = 0.1 " ) ;
TwAddVarRW ( m_polyBars [ i ] , stringY , TW_TYPE_FLOAT , & m_Vertices [ * index ] - > vertice . y , " label = 'Vertice Y' step = 0.1 " ) ;
TwAddVarRW ( m_polyBars [ i ] , stringZ , TW_TYPE_FLOAT , & m_Vertices [ * index ] - > vertice . z , " label = 'Vertice Z' step = 0.1 " ) ;
TwAddVarRW ( m_polyBars [ i ] , stringBool , TW_TYPE_BOOLCPP , & m_Vertices [ * index ] - > selected , " label = 'Selected' " ) ;
# endif
}
}
2007-12-24 14:11:18 -08:00
//Animation Frame list bar
char animBarName [ 255 ] ;
strncpy ( animBarName , toolBarName , 255 ) ;
strcat ( animBarName , " animBar " ) ;
for ( i = 0 ; i < m_numAnimFrames ; i + + )
{
char frameName [ 255 ] ;
char animBarDefine [ 255 ] ;
snprintf ( frameName , 255 , " %sframe%d " , animBarName , i ) ;
TwDeleteBar ( m_frames [ i ] . Bar ) ;
m_frames [ i ] . Bar = TwNewBar ( frameName ) ;
strncpy ( m_frames [ i ] . BarName , frameName , 255 ) ;
snprintf ( animBarDefine , 255 , " %s label = 'Pie%u Frame%d' position = '%d %d' color = '%d %d %d %d' size = '%d %d' " ,
frameName , this - > uid , i , g_Screen . m_width , g_Screen . m_height , guiMajorAlpha , guiMajorRed ,
guiMajorGreen , guiMajorBlue , guiMajorWidth , guiMajorHeight ) ;
TwDefine ( animBarDefine ) ;
strncpy ( m_frames [ i ] . BarName , frameName , 255 ) ;
TwAddButton ( m_frames [ i ] . Bar , " removeFrame " , removeFrameCB , & m_frames [ i ] , " label = 'Remove Anim Frame' " ) ;
TwAddVarRW ( m_frames [ i ] . Bar , " visible " , TW_TYPE_BOOLCPP , & m_frames [ i ] . visible , " label = 'Visible' " ) ;
TwAddVarRW ( m_frames [ i ] . Bar , " id " , TW_TYPE_UINT32 , & m_frames [ i ] . frameId , " label = 'FrameId' " ) ;
TwAddVarRW ( m_frames [ i ] . Bar , " offsetX " , TW_TYPE_FLOAT , & m_frames [ i ] . offsetX , " label = 'OffsetX' step = 100 " ) ;
TwAddVarRW ( m_frames [ i ] . Bar , " offsetY " , TW_TYPE_FLOAT , & m_frames [ i ] . offsetY , " label = 'OffsetY' step = 100 " ) ;
TwAddVarRW ( m_frames [ i ] . Bar , " offsetZ " , TW_TYPE_FLOAT , & m_frames [ i ] . offsetZ , " label = 'OffsetZ' step = 100 " ) ;
TwAddVarRW ( m_frames [ i ] . Bar , " rotateX " , TW_TYPE_FLOAT , & m_frames [ i ] . rotateX , " label = 'rotateX' step = 100 " ) ;
TwAddVarRW ( m_frames [ i ] . Bar , " rotateY " , TW_TYPE_FLOAT , & m_frames [ i ] . rotateY , " label = 'rotateY' step = 100 " ) ;
TwAddVarRW ( m_frames [ i ] . Bar , " rotateZ " , TW_TYPE_FLOAT , & m_frames [ i ] . rotateZ , " label = 'rotateZ' step = 100 " ) ;
TwAddVarRW ( m_frames [ i ] . Bar , " scaleX " , TW_TYPE_FLOAT , & m_frames [ i ] . scaleX , " label = 'ScaleX' step = 10 " ) ;
TwAddVarRW ( m_frames [ i ] . Bar , " scaleY " , TW_TYPE_FLOAT , & m_frames [ i ] . scaleY , " label = 'ScaleY' step = 10 " ) ;
TwAddVarRW ( m_frames [ i ] . Bar , " scaleZ " , TW_TYPE_FLOAT , & m_frames [ i ] . scaleZ , " label = 'ScaleZ' step = 10 " ) ;
}
2007-10-24 05:29:36 -07:00
return true ;
}
void CPieInternal : : updateGUI ( void ) {
2007-12-24 14:50:45 -08:00
Uint16 i , n , totalVertices = 0 ;
2007-10-24 05:29:36 -07:00
VERTEXID * index ;
//Utility bar
char toolBarName [ 255 ] = " toolbar " ;
char toolBarDefine [ 255 ] ;
2007-12-24 14:11:18 -08:00
//Utility bar
if ( ! m_IsSub )
2007-10-24 05:29:36 -07:00
{
2007-12-24 14:11:18 -08:00
if ( this - > uid < 10 )
{
snprintf ( & toolBarName [ 7 ] , 1 , " 0 " ) ;
snprintf ( & toolBarName [ 8 ] , 1 , " %u " , this - > uid ) ;
strcpy ( toolBarDefine , toolBarName ) ;
snprintf ( & toolBarDefine [ 9 ] , 100 , " label = 'Pie %u ToolBar' position = '0 200' color = '%d %d %d %d' size = '%d %d' " ,
this - > uid , guiMajorAlpha , guiMajorRed , guiMajorGreen , guiMajorBlue , guiMajorWidth , guiMajorHeight ) ;
}
else if ( this - > uid < 100 )
{
snprintf ( & toolBarName [ 7 ] , 2 , " %2u " , this - > uid ) ;
strcpy ( toolBarDefine , toolBarName ) ;
snprintf ( & toolBarDefine [ 9 ] , 100 , " label = 'Pie %u ToolBar' position = '0 200' color = '%d %d %d %d' size = '%d %d' " ,
this - > uid , guiMajorAlpha , guiMajorRed , guiMajorGreen , guiMajorBlue , guiMajorWidth , guiMajorHeight ) ;
}
else
{
snprintf ( & toolBarName [ 7 ] , 3 , " %3u " , this - > uid ) ;
strcpy ( toolBarDefine , toolBarName ) ;
snprintf ( & toolBarDefine [ 10 ] , 100 , " label = 'Pie %u ToolBar' position = '0 200' color = '%d %d %d %d' size = '%d %d' " ,
this - > uid , guiMajorAlpha , guiMajorRed , guiMajorGreen , guiMajorBlue , guiMajorWidth , guiMajorHeight ) ;
}
2007-10-24 05:29:36 -07:00
}
else
{
2007-12-24 14:11:18 -08:00
snprintf ( toolBarName , 255 , " SubModel%4u " , this - > uid ) ;
snprintf ( toolBarDefine , 255 , " %s label = 'Pie %u ToolBar' position = '0 200' color = '%d %d %d %d' size = '%d %d' " ,
toolBarName , this - > uid , guiMajorAlpha , guiMajorRed , guiMajorGreen , guiMajorBlue , guiMajorWidth , guiMajorHeight ) ;
2007-10-24 05:29:36 -07:00
}
//Vertice list bar
char vertBarName [ 255 ] ;
char vertBarDefine [ 255 ] ;
strncpy ( vertBarName , toolBarName , 255 ) ;
strcat ( vertBarName , " vertBar " ) ;
2007-10-24 06:43:01 -07:00
snprintf ( vertBarDefine , 255 , " %s label = 'Pie %u VerticeList' position = '%d %d' color = '%d %d %d %d' size = '%d %d' " ,
2007-12-24 14:11:18 -08:00
vertBarName , this - > uid , g_Screen . m_width , 0 , guiMajorAlpha , guiMajorRed ,
2007-10-24 05:29:36 -07:00
guiMajorGreen , guiMajorBlue , guiMajorWidth , guiMajorHeight ) ;
2007-12-24 14:11:18 -08:00
//TwDeleteBar(m_vertBar);
if ( ! m_vertBar )
{
m_vertBar = TwNewBar ( vertBarName ) ;
TwDefine ( vertBarDefine ) ;
}
TwRemoveAllVars ( m_vertBar ) ;
2007-10-24 05:29:36 -07:00
for ( i = 0 ; i < m_vertCount ; i + + )
{
if ( m_Vertices [ i ] )
{
char name [ 255 ] = " vert " ;
2007-10-24 06:43:01 -07:00
snprintf ( & name [ 4 ] , 3 , " %3u " , i ) ;
2007-12-24 14:11:18 -08:00
if ( ! TwAddVarRW ( m_vertBar , name , g_tw_pieVertexType , m_Vertices [ i ] , " " ) )
//|| !TwAddVarCB(m_vertBar, name, g_tw_pieVertexType, setVarCB, getVarCB, &this->m_InstanceCallback, ""))
2007-10-24 05:29:36 -07:00
{
fprintf ( stderr , TwGetLastError ( ) ) ;
}
}
}
//Connector list bar
char connBarName [ 255 ] ;
char connBarDefine [ 255 ] ;
strncpy ( connBarName , toolBarName , 255 ) ;
strcat ( connBarName , " connBar " ) ;
2007-10-24 06:43:01 -07:00
snprintf ( connBarDefine , 255 , " %s label = 'Pie %u ConnectorList' position = '%d %d' color = '%d %d %d %d' size = '%d %d' " ,
2007-12-24 14:11:18 -08:00
connBarName , this - > uid , g_Screen . m_width , 400 , guiMajorAlpha , guiMajorRed ,
2007-10-24 05:29:36 -07:00
guiMajorGreen , guiMajorBlue , guiMajorWidth , guiMajorHeight ) ;
2007-12-24 14:11:18 -08:00
//TwDeleteBar(m_connBar);
if ( ! m_connBar )
{
m_connBar = TwNewBar ( connBarName ) ;
TwDefine ( connBarDefine ) ;
}
TwRemoveAllVars ( m_connBar ) ;
2007-10-24 05:29:36 -07:00
for ( i = 0 ; i < m_connCount ; i + + )
{
if ( m_Connectors [ i ] )
{
char name [ 255 ] = " conn " ;
2007-12-24 14:11:18 -08:00
char name2 [ 255 ] = " delconn " ;
2007-10-24 06:43:01 -07:00
snprintf ( & name [ 4 ] , 3 , " %3u " , i ) ;
2007-12-24 14:11:18 -08:00
snprintf ( & name2 [ 7 ] , 3 , " %3u " , i ) ;
TwAddButton ( m_connBar , name2 , removeConnectorAtCB , & m_Connectors [ i ] - > callback , " label = 'Remove' " ) ;
TwAddVarRW ( m_connBar , name , g_tw_pieVertexType , m_Connectors [ i ] , " " ) ;
//TwAddVarCB(m_connBar, name, g_tw_pieVertexType, setVarCB, getVarCB, &this->m_InstanceCallback, "");
2007-10-24 05:29:36 -07:00
}
}
for ( i = 0 ; i < m_polyCount ; i + + )
{
if ( m_Polygons [ i ] = = NULL )
{
//skip NULL polygons
continue ;
}
//multiple polygon names format poly[pie uid][poly uid]
char tmpString [ 255 ] = " poly " ;
char tmpString2 [ 255 ] ;
2007-12-24 14:11:18 -08:00
//FIXME:capped to 1000(3 digi)
//assert(this->uid < 1000);
//utterly hack to add zero's to make Bar names unique -_-
if ( ! this - > m_IsSub )
2007-10-24 05:29:36 -07:00
{
2007-12-24 14:11:18 -08:00
if ( i < 10 )
2007-10-24 05:29:36 -07:00
{
2007-12-24 14:11:18 -08:00
snprintf ( & tmpString [ 4 ] , 1 , " 0 " ) ;
snprintf ( & tmpString [ 5 ] , 1 , " %u " , i ) ;
2007-10-24 05:29:36 -07:00
2007-12-24 14:11:18 -08:00
if ( this - > uid < 10 )
{
snprintf ( & tmpString [ 6 ] , 1 , " 0 " ) ;
snprintf ( & tmpString [ 7 ] , 1 , " %u " , this - > uid ) ;
strcpy ( tmpString2 , tmpString ) ;
snprintf ( & tmpString2 [ 8 ] , 100 , " label = 'Pie %u Poly %u' position = '0 400' color = '%d %d %d %d' size = '%d %d' " ,
this - > uid , i , guiMinorAlpha , guiMinorRed , guiMinorGreen , guiMinorBlue , guiMinorWidth , guiMinorHeight ) ;
}
else if ( this - > uid < 100 )
{
snprintf ( & tmpString [ 6 ] , 2 , " %2u " , this - > uid ) ;
strcpy ( tmpString2 , tmpString ) ;
snprintf ( & tmpString2 [ 8 ] , 100 , " label = 'Pie %u Poly %u' position = '0 400' color = '%d %d %d %d' size = '%d %d' " ,
this - > uid , i , guiMinorAlpha , guiMinorRed , guiMinorGreen , guiMinorBlue , guiMinorWidth , guiMinorHeight ) ;
}
else
{
snprintf ( & tmpString [ 6 ] , 3 , " 3%u " , this - > uid ) ;
strcpy ( tmpString2 , tmpString ) ;
snprintf ( & tmpString2 [ 9 ] , 100 , " label = 'Pie %u Poly %u' position = '0 400' color = '%d %d %d %d' size = '%d %d' " ,
this - > uid , i , guiMinorAlpha , guiMinorRed , guiMinorGreen , guiMinorBlue , guiMinorWidth , guiMinorHeight ) ;
}
2007-10-24 05:29:36 -07:00
strcpy ( tmpString2 , tmpString ) ;
2007-10-24 06:43:01 -07:00
snprintf ( & tmpString2 [ 8 ] , 100 , " label = 'Pie %u Poly %u' position = '0 400' color = '%d %d %d %d' size = '%d %d' " ,
2007-12-24 14:11:18 -08:00
this - > uid , i , guiMinorAlpha , guiMinorRed , guiMinorGreen , guiMinorBlue , guiMinorWidth , guiMinorHeight ) ;
2007-10-24 05:29:36 -07:00
}
2007-12-24 14:11:18 -08:00
else if ( i < 100 )
2007-10-24 05:29:36 -07:00
{
2007-12-24 14:11:18 -08:00
snprintf ( & tmpString [ 4 ] , 2 , " %2u " , i ) ;
if ( this - > uid < 10 )
{
snprintf ( & tmpString [ 6 ] , 1 , " 0 " ) ;
snprintf ( & tmpString [ 7 ] , 1 , " %u " , this - > uid ) ;
strcpy ( tmpString2 , tmpString ) ;
snprintf ( & tmpString2 [ 8 ] , 100 , " label = 'Pie %u Poly %u' position = '0 400' color = '%d %d %d %d' size = '%d %d' " ,
this - > uid , i , guiMinorAlpha , guiMinorRed , guiMinorGreen , guiMinorBlue , guiMinorWidth , guiMinorHeight ) ;
}
else if ( this - > uid < 100 )
{
snprintf ( & tmpString [ 6 ] , 2 , " %2u " , this - > uid ) ;
strcpy ( tmpString2 , tmpString ) ;
snprintf ( & tmpString2 [ 8 ] , 100 , " label = 'Pie %u Poly %u' position = '0 400' color = '%d %d %d %d' size = '%d %d' " ,
this - > uid , i , guiMinorAlpha , guiMinorRed , guiMinorGreen , guiMinorBlue , guiMinorWidth , guiMinorHeight ) ;
}
else
{
snprintf ( & tmpString [ 6 ] , 3 , " 3%u " , this - > uid ) ;
strcpy ( tmpString2 , tmpString ) ;
snprintf ( & tmpString2 [ 9 ] , 100 , " label = 'Pie %u Poly %u' position = '0 400' color = '%d %d %d %d' size = '%d %d' " ,
this - > uid , i , guiMinorAlpha , guiMinorRed , guiMinorGreen , guiMinorBlue , guiMinorWidth , guiMinorHeight ) ;
}
2007-10-24 05:29:36 -07:00
}
else
{
2007-12-24 14:11:18 -08:00
snprintf ( & tmpString [ 4 ] , 3 , " %3u " , i ) ;
if ( this - > uid < 10 )
{
snprintf ( & tmpString [ 7 ] , 1 , " 0 " ) ;
snprintf ( & tmpString [ 8 ] , 1 , " %u " , this - > uid ) ;
strcpy ( tmpString2 , tmpString ) ;
snprintf ( & tmpString2 [ 9 ] , 100 , " label = 'Pie %u Poly %u' position = '0 400' color = '%d %d %d %d' size = '%d %d' " ,
this - > uid , i , guiMinorAlpha , guiMinorRed , guiMinorGreen , guiMinorBlue , guiMinorWidth , guiMinorHeight ) ;
}
else if ( this - > uid < 100 )
{
snprintf ( & tmpString [ 7 ] , 2 , " %2u " , this - > uid ) ;
strcpy ( tmpString2 , tmpString ) ;
snprintf ( & tmpString2 [ 9 ] , 100 , " label = 'Pie %u Poly %u' position = '0 400' color = '%d %d %d %d' size = '%d %d' " ,
this - > uid , i , guiMinorAlpha , guiMinorRed , guiMinorGreen , guiMinorBlue , guiMinorWidth , guiMinorHeight ) ;
}
else
{
snprintf ( & tmpString [ 7 ] , 3 , " 3%u " , this - > uid ) ;
strcpy ( tmpString2 , tmpString ) ;
snprintf ( & tmpString2 [ 10 ] , 100 , " label = 'Pie %u Poly %u' position = '0 400' color = '%d %d %d %d' size = '%d %d' " ,
this - > uid , i , guiMinorAlpha , guiMinorRed , guiMinorGreen , guiMinorBlue , guiMinorWidth , guiMinorHeight ) ;
}
2007-10-24 05:29:36 -07:00
}
}
else
{
2007-12-24 14:11:18 -08:00
snprintf ( tmpString , 255 , " SubModel%dPoly%d " , this - > uid , i ) ;
snprintf ( tmpString2 , 255 , " %s label = 'Pie %u Poly %u' position = '0 400' color = '%d %d %d %d' size = '%d %d' " ,
tmpString , this - > uid , i , guiMinorAlpha , guiMinorRed , guiMinorGreen , guiMinorBlue , guiMinorWidth , guiMinorHeight ) ;
2007-10-24 05:29:36 -07:00
}
2007-12-24 14:11:18 -08:00
//TwDeleteBar(m_polyBars[i]);
if ( ! m_polyBars [ i ] )
{
m_polyBars [ i ] = TwNewBar ( tmpString ) ;
2007-10-24 05:29:36 -07:00
2007-12-24 14:11:18 -08:00
TwDefine ( tmpString2 ) ;
}
TwRemoveAllVars ( m_polyBars [ i ] ) ;
2007-10-24 05:29:36 -07:00
2007-12-24 14:11:18 -08:00
TwAddButton ( m_polyBars [ i ] , " duplicatePoly " , duplicatePolyCB , & m_Polygons [ i ] - > callback , " label = 'Duplicate this' " ) ;
2007-10-24 05:29:36 -07:00
TwAddVarRW ( m_polyBars [ i ] , " polyselected " , TW_TYPE_BOOLCPP , & m_Polygons [ i ] - > selected , " label = 'Poly Selected' " ) ;
2007-12-24 14:11:18 -08:00
TwAddVarRW ( m_polyBars [ i ] , " flags " , TW_TYPE_UINT32 , & m_Polygons [ i ] - > polygon . flags , " label = 'Flags' " ) ;
if ( m_Polygons [ i ] - > polygon . pTexAnim )
{
TwAddVarRW ( m_polyBars [ i ] , " texAnimFrame " , TW_TYPE_UINT32 , & m_Polygons [ i ] - > frame , " label = 'TexAnim Frame' min = 0 max = 7 step = 1 group = 'TexAnim' " ) ;
TwAddVarRW ( m_polyBars [ i ] , " texHeight " , TW_TYPE_UINT16 , & m_Polygons [ i ] - > polygon . pTexAnim - > textureHeight , " label = 'Height' min = 0 max = 31 step = 1 group = 'TexAnim' " ) ;
TwAddVarRW ( m_polyBars [ i ] , " texWidth " , TW_TYPE_UINT16 , & m_Polygons [ i ] - > polygon . pTexAnim - > textureWidth , " label = 'Width' min = 0 max = 31 step = 1 group = 'TexAnim' " ) ;
TwAddVarRW ( m_polyBars [ i ] , " textPlayRate " , TW_TYPE_UINT16 , & m_Polygons [ i ] - > polygon . pTexAnim - > playbackRate , " label = 'Height' min = 0 step = 1 group = 'TexAnim' " ) ;
TwAddVarRW ( m_polyBars [ i ] , " texFrames " , TW_TYPE_UINT16 , & m_Polygons [ i ] - > polygon . pTexAnim - > nFrames , " label = 'Width' min = 0 max = 7 step = 1 group = 'TexAnim' " ) ;
}
2007-10-24 05:29:36 -07:00
for ( n = m_Polygons [ i ] - > polygon . npnts , index = m_Polygons [ i ] - > polygon . pindex + ( m_Polygons [ i ] - > polygon . npnts - 1 ) ;
n > 0 ;
n - - , index - - )
{
char stringTemp [ 255 ] = " vert " ;
2007-12-24 14:11:18 -08:00
char stringTemp2 [ 255 ] = " delvert " ;
2007-10-24 05:29:36 -07:00
2007-10-24 06:43:01 -07:00
snprintf ( & stringTemp [ 4 ] , 55 , " id%3u uid%3u " , * index , totalVertices + + ) ;
2007-10-24 05:29:36 -07:00
2007-12-24 14:11:18 -08:00
snprintf ( & stringTemp2 [ 7 ] , 55 , " id%3u uid%3u " , * index , totalVertices ) ;
TwAddButton ( m_polyBars [ i ] , stringTemp2 , removeVerticeAtCB , & m_Vertices [ * index ] - > callback , " label = 'Remove' " ) ;
TwAddVarRW ( m_polyBars [ i ] , stringTemp , g_tw_pieVertexType , m_Vertices [ * index ] , " " ) ;
//TwAddVarCB(m_polyBars[i], stringTemp, g_tw_pieVertexType, setVarCB, getVarCB, &this->m_InstanceCallback, "");
}
}
//Animation Frame list bar
char animBarName [ 255 ] ;
strncpy ( animBarName , toolBarName , 255 ) ;
strcat ( animBarName , " animBar " ) ;
for ( i = 0 ; i < m_numAnimFrames ; i + + )
{
char frameName [ 255 ] ;
char animBarDefine [ 255 ] ;
snprintf ( frameName , 255 , " %sframe%d " , animBarName , i ) ;
//TwDeleteBar(m_frames[i].Bar);
if ( ! m_frames [ i ] . Bar )
{
m_frames [ i ] . Bar = TwNewBar ( m_frames [ i ] . BarName ) ;
//strncpy(m_frames[i].BarName, frameName, 255);
snprintf ( animBarDefine , 255 , " %s label = 'Pie%u Frame%d' position = '%d %d' color = '%d %d %d %d' size = '%d %d' " ,
m_frames [ i ] . BarName , this - > uid , i , g_Screen . m_width , g_Screen . m_height , guiMajorAlpha , guiMajorRed ,
guiMajorGreen , guiMajorBlue , guiMajorWidth , guiMajorHeight ) ;
TwDefine ( animBarDefine ) ;
}
if ( m_frames [ i ] . died )
{
continue ;
2007-10-24 05:29:36 -07:00
}
2007-12-24 14:11:18 -08:00
TwRemoveAllVars ( m_frames [ i ] . Bar ) ;
TwAddButton ( m_frames [ i ] . Bar , " duplicateFrame " , duplicateFrameCB , & m_frames [ i ] . callback , " label = 'Duplicate Anim Frame' " ) ;
TwAddButton ( m_frames [ i ] . Bar , " removeFrame " , removeFrameCB , & m_frames [ i ] , " label = 'Remove Anim Frame' " ) ;
TwAddVarRW ( m_frames [ i ] . Bar , " visible " , TW_TYPE_BOOLCPP , & m_frames [ i ] . visible , " label = 'Visible' " ) ;
TwAddVarRW ( m_frames [ i ] . Bar , " id " , TW_TYPE_UINT32 , & m_frames [ i ] . frameId , " label = 'Frameid' " ) ;
TwAddVarRW ( m_frames [ i ] . Bar , " offsetX " , TW_TYPE_FLOAT , & m_frames [ i ] . offsetX , " label = 'OffsetX' step = 100 " ) ;
TwAddVarRW ( m_frames [ i ] . Bar , " offsetY " , TW_TYPE_FLOAT , & m_frames [ i ] . offsetY , " label = 'OffsetY' step = 100 " ) ;
TwAddVarRW ( m_frames [ i ] . Bar , " offsetZ " , TW_TYPE_FLOAT , & m_frames [ i ] . offsetZ , " label = 'OffsetZ' step = 100 " ) ;
TwAddVarRW ( m_frames [ i ] . Bar , " rotateX " , TW_TYPE_FLOAT , & m_frames [ i ] . rotateX , " label = 'rotateX step = 100 " ) ;
TwAddVarRW ( m_frames [ i ] . Bar , " rotateY " , TW_TYPE_FLOAT , & m_frames [ i ] . rotateY , " label = 'rotateY' step = 100 " ) ;
TwAddVarRW ( m_frames [ i ] . Bar , " rotateZ " , TW_TYPE_FLOAT , & m_frames [ i ] . rotateZ , " label = 'rotateZ' step = 100 " ) ;
TwAddVarRW ( m_frames [ i ] . Bar , " scaleX " , TW_TYPE_FLOAT , & m_frames [ i ] . scaleX , " label = 'ScaleX' step = 10 " ) ;
TwAddVarRW ( m_frames [ i ] . Bar , " scaleY " , TW_TYPE_FLOAT , & m_frames [ i ] . scaleY , " label = 'ScaleY' step = 10 " ) ;
TwAddVarRW ( m_frames [ i ] . Bar , " scaleZ " , TW_TYPE_FLOAT , & m_frames [ i ] . scaleZ , " label = 'ScaleZ' step = 10 " ) ;
2007-10-24 05:29:36 -07:00
}
}
void CPieInternal : : hideGUI ( void ) {
2007-12-24 14:50:45 -08:00
Uint16 i ;
2007-10-24 05:29:36 -07:00
//Utility bar
char toolBarName [ 255 ] = " toolbar " ;
char toolBarDefine [ 255 ] ;
2007-12-24 14:11:18 -08:00
if ( ! this - > m_IsSub )
2007-10-24 05:29:36 -07:00
{
2007-12-24 14:11:18 -08:00
if ( this - > uid < 10 )
{
snprintf ( & toolBarName [ 7 ] , 1 , " 0 " ) ;
snprintf ( & toolBarName [ 8 ] , 1 , " %u " , this - > uid ) ;
strcpy ( toolBarDefine , toolBarName ) ;
snprintf ( & toolBarDefine [ 9 ] , 100 , " hide " ) ;
}
else if ( this - > uid < 100 )
{
snprintf ( & toolBarName [ 7 ] , 2 , " %2u " , this - > uid ) ;
strcpy ( toolBarDefine , toolBarName ) ;
snprintf ( & toolBarDefine [ 9 ] , 100 , " hide " ) ;
}
else
{
snprintf ( & toolBarName [ 7 ] , 3 , " 3%u " , this - > uid ) ;
strcpy ( toolBarDefine , toolBarName ) ;
snprintf ( & toolBarDefine [ 10 ] , 100 , " hide " ) ;
}
2007-10-24 05:29:36 -07:00
}
else
{
2007-12-24 14:11:18 -08:00
snprintf ( toolBarName , 255 , " SubModel%4u " , this - > uid ) ;
snprintf ( toolBarDefine , 255 , " %s label = 'Pie %u ToolBar' position = '0 200' color = '%d %d %d %d' size = '%d %d' " ,
toolBarName , this - > uid , guiMajorAlpha , guiMajorRed , guiMajorGreen , guiMajorBlue , guiMajorWidth , guiMajorHeight ) ;
2007-10-24 05:29:36 -07:00
}
//Vertice list bar
char vertBarName [ 255 ] ;
char vertBarDefine [ 255 ] ;
strncpy ( vertBarName , toolBarName , 255 ) ;
strcat ( vertBarName , " vertBar " ) ;
2007-10-24 06:43:01 -07:00
snprintf ( vertBarDefine , 255 , " %s hide " ,
2007-10-24 05:29:36 -07:00
vertBarName ) ;
TwDefine ( vertBarDefine ) ;
//Connector list bar
char connBarName [ 255 ] ;
char connBarDefine [ 255 ] ;
strncpy ( connBarName , toolBarName , 255 ) ;
strcat ( connBarName , " connBar " ) ;
2007-10-24 06:43:01 -07:00
snprintf ( connBarDefine , 255 , " %s hide " ,
2007-10-24 05:29:36 -07:00
connBarName ) ;
TwDefine ( connBarDefine ) ;
for ( i = 0 ; i < m_polyCount ; i + + )
{
if ( m_Polygons [ i ] = = NULL )
{
//skip NULL polygons
continue ;
}
//multiple polygon names format poly[pie uid][poly uid]
char tmpString [ 255 ] = " poly " ;
char tmpString2 [ 255 ] ;
2007-12-24 14:11:18 -08:00
if ( ! this - > m_IsSub )
2007-10-24 05:29:36 -07:00
{
2007-12-24 14:11:18 -08:00
//FIXME:capped to 1000(3 digi)
//assert(this->uid < 1000);
//utterly hack to add zero's to make Bar names unique -_-
if ( i < 10 )
2007-10-24 05:29:36 -07:00
{
2007-12-24 14:11:18 -08:00
snprintf ( & tmpString [ 4 ] , 1 , " 0 " ) ;
snprintf ( & tmpString [ 5 ] , 1 , " %u " , i ) ;
2007-10-24 05:29:36 -07:00
2007-12-24 14:11:18 -08:00
if ( this - > uid < 10 )
{
snprintf ( & tmpString [ 6 ] , 1 , " 0 " ) ;
snprintf ( & tmpString [ 7 ] , 1 , " %u " , this - > uid ) ;
strcpy ( tmpString2 , tmpString ) ;
snprintf ( & tmpString2 [ 8 ] , 100 , " hide " ) ;
}
else if ( this - > uid < 100 )
{
snprintf ( & tmpString [ 6 ] , 2 , " %2u " , this - > uid ) ;
strcpy ( tmpString2 , tmpString ) ;
snprintf ( & tmpString2 [ 8 ] , 100 , " hide " ) ;
}
else
{
snprintf ( & tmpString [ 6 ] , 3 , " 3%u " , this - > uid ) ;
strcpy ( tmpString2 , tmpString ) ;
snprintf ( & tmpString2 [ 9 ] , 100 , " hide " ) ;
}
2007-10-24 05:29:36 -07:00
strcpy ( tmpString2 , tmpString ) ;
2007-10-24 06:43:01 -07:00
snprintf ( & tmpString2 [ 8 ] , 100 , " hide " ) ;
2007-10-24 05:29:36 -07:00
}
2007-12-24 14:11:18 -08:00
else if ( i < 100 )
2007-10-24 05:29:36 -07:00
{
2007-12-24 14:11:18 -08:00
snprintf ( & tmpString [ 4 ] , 2 , " %2u " , i ) ;
if ( this - > uid < 10 )
{
snprintf ( & tmpString [ 6 ] , 1 , " 0 " ) ;
snprintf ( & tmpString [ 7 ] , 1 , " %u " , this - > uid ) ;
strcpy ( tmpString2 , tmpString ) ;
snprintf ( & tmpString2 [ 8 ] , 100 , " hide " ) ;
}
else if ( this - > uid < 100 )
{
snprintf ( & tmpString [ 6 ] , 2 , " %2u " , this - > uid ) ;
strcpy ( tmpString2 , tmpString ) ;
snprintf ( & tmpString2 [ 8 ] , 100 , " hide " ) ;
}
else
{
snprintf ( & tmpString [ 6 ] , 3 , " 3%u " , this - > uid ) ;
strcpy ( tmpString2 , tmpString ) ;
snprintf ( & tmpString2 [ 9 ] , 100 , " hide " ) ;
}
2007-10-24 05:29:36 -07:00
}
else
{
2007-12-24 14:11:18 -08:00
snprintf ( & tmpString [ 4 ] , 3 , " %3u " , i ) ;
if ( this - > uid < 10 )
{
snprintf ( & tmpString [ 7 ] , 1 , " 0 " ) ;
snprintf ( & tmpString [ 8 ] , 1 , " %u " , this - > uid ) ;
strcpy ( tmpString2 , tmpString ) ;
snprintf ( & tmpString2 [ 9 ] , 100 , " hide " ) ;
}
else if ( this - > uid < 100 )
{
snprintf ( & tmpString [ 7 ] , 2 , " %2u " , this - > uid ) ;
strcpy ( tmpString2 , tmpString ) ;
snprintf ( & tmpString2 [ 9 ] , 100 , " hide " ) ;
}
else
{
snprintf ( & tmpString [ 7 ] , 3 , " 3%u " , this - > uid ) ;
strcpy ( tmpString2 , tmpString ) ;
snprintf ( & tmpString2 [ 10 ] , 100 , " hide " ) ;
}
2007-10-24 05:29:36 -07:00
}
}
else
{
2007-12-24 14:11:18 -08:00
snprintf ( tmpString , 255 , " SubModel%dPoly%d " , this - > uid , i ) ;
snprintf ( tmpString2 , 255 , " %s label = 'Pie %u Poly %u' position = '0 400' color = '%d %d %d %d' size = '%d %d' " ,
tmpString , this - > uid , i , guiMinorAlpha , guiMinorRed , guiMinorGreen , guiMinorBlue , guiMinorWidth , guiMinorHeight ) ;
2007-10-24 05:29:36 -07:00
}
TwDefine ( tmpString2 ) ;
}
}
void CPieInternal : : showGUI ( void ) {
2007-12-24 14:50:45 -08:00
Uint16 i ;
2007-10-24 05:29:36 -07:00
//Utility bar
char toolBarName [ 255 ] = " toolbar " ;
char toolBarDefine [ 255 ] ;
2007-12-24 14:11:18 -08:00
if ( ! this - > m_IsSub )
2007-10-24 05:29:36 -07:00
{
2007-12-24 14:11:18 -08:00
if ( this - > uid < 10 )
{
snprintf ( & toolBarName [ 7 ] , 1 , " 0 " ) ;
snprintf ( & toolBarName [ 8 ] , 1 , " %u " , this - > uid ) ;
strcpy ( toolBarDefine , toolBarName ) ;
snprintf ( & toolBarDefine [ 9 ] , 100 , " show " ) ;
}
else if ( this - > uid < 100 )
{
snprintf ( & toolBarName [ 7 ] , 2 , " %2u " , this - > uid ) ;
strcpy ( toolBarDefine , toolBarName ) ;
snprintf ( & toolBarDefine [ 9 ] , 100 , " show " ) ;
}
else
{
snprintf ( & toolBarName [ 7 ] , 3 , " 3%u " , this - > uid ) ;
strcpy ( toolBarDefine , toolBarName ) ;
snprintf ( & toolBarDefine [ 10 ] , 100 , " show " ) ;
}
2007-10-24 05:29:36 -07:00
}
else
{
2007-12-24 14:11:18 -08:00
snprintf ( toolBarName , 255 , " SubModel%4u " , this - > uid ) ;
snprintf ( toolBarDefine , 255 , " %s label = 'Pie %u ToolBar' position = '0 200' color = '%d %d %d %d' size = '%d %d' " ,
toolBarName , this - > uid , guiMajorAlpha , guiMajorRed , guiMajorGreen , guiMajorBlue , guiMajorWidth , guiMajorHeight ) ;
2007-10-24 05:29:36 -07:00
}
TwDefine ( toolBarDefine ) ;
//Vertice list bar
char vertBarName [ 255 ] ;
char vertBarDefine [ 255 ] ;
strncpy ( vertBarName , toolBarName , 255 ) ;
strcat ( vertBarName , " vertBar " ) ;
2007-10-24 06:43:01 -07:00
snprintf ( vertBarDefine , 255 , " %s show " ,
2007-10-24 05:29:36 -07:00
vertBarName ) ;
TwDefine ( vertBarDefine ) ;
//Connector list bar
char connBarName [ 255 ] ;
char connBarDefine [ 255 ] ;
strncpy ( connBarName , toolBarName , 255 ) ;
strcat ( connBarName , " connBar " ) ;
2007-10-24 06:43:01 -07:00
snprintf ( connBarDefine , 255 , " %s show " ,
2007-10-24 05:29:36 -07:00
connBarName ) ;
TwDefine ( connBarDefine ) ;
for ( i = 0 ; i < m_polyCount ; i + + )
{
if ( m_Polygons [ i ] = = NULL )
{
//skip NULL polygons
continue ;
}
//multiple polygon names format poly[pie uid][poly uid]
char tmpString [ 255 ] = " poly " ;
char tmpString2 [ 255 ] ;
2007-12-24 14:11:18 -08:00
if ( ! this - > m_IsSub )
2007-10-24 05:29:36 -07:00
{
2007-12-24 14:11:18 -08:00
//FIXME:capped to 1000(3 digi)
//assert(this->uid < 1000);
//utterly hack to add zero's to make Bar names unique -_-
if ( i < 10 )
2007-10-24 05:29:36 -07:00
{
2007-12-24 14:11:18 -08:00
snprintf ( & tmpString [ 4 ] , 1 , " 0 " ) ;
snprintf ( & tmpString [ 5 ] , 1 , " %u " , i ) ;
if ( this - > uid < 10 )
{
snprintf ( & tmpString [ 6 ] , 1 , " 0 " ) ;
snprintf ( & tmpString [ 7 ] , 1 , " %u " , this - > uid ) ;
strcpy ( tmpString2 , tmpString ) ;
snprintf ( & tmpString2 [ 8 ] , 100 , " show " ) ;
}
else if ( this - > uid < 100 )
{
snprintf ( & tmpString [ 6 ] , 2 , " %2u " , this - > uid ) ;
strcpy ( tmpString2 , tmpString ) ;
snprintf ( & tmpString2 [ 8 ] , 100 , " show " ) ;
}
else
{
snprintf ( & tmpString [ 6 ] , 3 , " 3%u " , this - > uid ) ;
strcpy ( tmpString2 , tmpString ) ;
snprintf ( & tmpString2 [ 9 ] , 100 , " show " ) ;
}
2007-10-24 05:29:36 -07:00
strcpy ( tmpString2 , tmpString ) ;
2007-10-24 06:43:01 -07:00
snprintf ( & tmpString2 [ 8 ] , 100 , " show " ) ;
2007-10-24 05:29:36 -07:00
}
2007-12-24 14:11:18 -08:00
else if ( i < 100 )
2007-10-24 05:29:36 -07:00
{
2007-12-24 14:11:18 -08:00
snprintf ( & tmpString [ 4 ] , 2 , " %2u " , i ) ;
if ( this - > uid < 10 )
{
snprintf ( & tmpString [ 6 ] , 1 , " 0 " ) ;
snprintf ( & tmpString [ 7 ] , 1 , " %u " , this - > uid ) ;
strcpy ( tmpString2 , tmpString ) ;
snprintf ( & tmpString2 [ 8 ] , 100 , " show " ) ;
}
else if ( this - > uid < 100 )
{
snprintf ( & tmpString [ 6 ] , 2 , " %2u " , this - > uid ) ;
strcpy ( tmpString2 , tmpString ) ;
snprintf ( & tmpString2 [ 8 ] , 100 , " show " ) ;
}
else
{
snprintf ( & tmpString [ 6 ] , 3 , " 3%u " , this - > uid ) ;
strcpy ( tmpString2 , tmpString ) ;
snprintf ( & tmpString2 [ 9 ] , 100 , " show " ) ;
}
2007-10-24 05:29:36 -07:00
}
else
{
2007-12-24 14:11:18 -08:00
snprintf ( & tmpString [ 4 ] , 3 , " %3u " , i ) ;
2007-10-24 05:29:36 -07:00
2007-12-24 14:11:18 -08:00
if ( this - > uid < 10 )
{
snprintf ( & tmpString [ 7 ] , 1 , " 0 " ) ;
snprintf ( & tmpString [ 8 ] , 1 , " %u " , this - > uid ) ;
strcpy ( tmpString2 , tmpString ) ;
snprintf ( & tmpString2 [ 9 ] , 100 , " show " ) ;
}
else if ( this - > uid < 100 )
{
snprintf ( & tmpString [ 7 ] , 2 , " %2u " , this - > uid ) ;
strcpy ( tmpString2 , tmpString ) ;
snprintf ( & tmpString2 [ 9 ] , 100 , " show " ) ;
}
else
{
snprintf ( & tmpString [ 7 ] , 3 , " 3%u " , this - > uid ) ;
strcpy ( tmpString2 , tmpString ) ;
snprintf ( & tmpString2 [ 10 ] , 100 , " show " ) ;
}
}
2007-10-24 05:29:36 -07:00
}
2007-12-24 14:11:18 -08:00
else
2007-10-24 05:29:36 -07:00
{
2007-12-24 14:11:18 -08:00
snprintf ( tmpString , 255 , " SubModel%dPoly%d " , this - > uid , i ) ;
snprintf ( tmpString2 , 255 , " %s label = 'Pie %u Poly %u' position = '0 400' color = '%d %d %d %d' size = '%d %d' " ,
tmpString , this - > uid , i , guiMinorAlpha , guiMinorRed , guiMinorGreen , guiMinorBlue , guiMinorWidth , guiMinorHeight ) ;
}
2007-10-24 05:29:36 -07:00
2007-12-24 14:11:18 -08:00
TwDefine ( tmpString2 ) ;
}
}
bool CPieInternal : : addSub ( const char * name ) {
CPieInternal * temp = this ;
while ( temp - > m_nextSub )
{
temp = temp - > m_nextSub ;
}
// Reached the end of linked list
CPieInternal * newSub ;
newSub = new CPieInternal ( g_SubModelIndex , name , this - > m_TexpageId , true , this ) ;
if ( newSub = = NULL )
{
fprintf ( stderr , " error creating submodel \n " ) ;
return false ;
}
temp - > m_nextSub = newSub ;
g_SubModelIndex + + ;
return true ;
}
bool CPieInternal : : addSubFromFile ( const char * filename ) {
CPieInternal * temp = this ;
while ( temp - > m_nextSub )
{
temp = temp - > m_nextSub ;
}
// Reached the end of linked list
CPieInternal * newSub ;
iIMDShape * newIMD = iV_ProcessIMD ( filename ) ;
newSub = new CPieInternal ( g_SubModelIndex , newIMD , filename , true , this ) ;
if ( newSub = = NULL )
{
fprintf ( stderr , " error creating submodel from file %s \n " , filename ) ;
return false ;
}
temp - > m_nextSub = newSub ;
g_SubModelIndex + + ;
return true ;
}
bool CPieInternal : : addFrame ( void ) {
//assert(m_numAnimFrames < MAX_ANIM_FRAMES);
m_frames [ m_numAnimFrames ] . died = false ;
m_frames [ m_numAnimFrames ] . visible = true ;
m_frames [ m_numAnimFrames ] . frameId = m_numAnimFrames ;
m_frames [ m_numAnimFrames ] . offsetX = 0.0f ;
m_frames [ m_numAnimFrames ] . offsetY = 0.0f ;
m_frames [ m_numAnimFrames ] . offsetZ = 0.0f ;
m_frames [ m_numAnimFrames ] . rotateX = 0.0f ;
m_frames [ m_numAnimFrames ] . rotateY = 0.0f ;
m_frames [ m_numAnimFrames ] . rotateZ = 0.0f ;
m_frames [ m_numAnimFrames ] . scaleX = 1000.0f ;
m_frames [ m_numAnimFrames ] . scaleY = 1000.0f ;
m_frames [ m_numAnimFrames ] . scaleZ = 1000.0f ;
m_frames [ m_numAnimFrames ] . callback . Id = m_numAnimFrames ;
m_frames [ m_numAnimFrames ] . callback . pInstance = ( void * ) this ;
snprintf ( m_frames [ m_numAnimFrames ] . BarName , 255 , " Pie%dAnim%dBar " , this - > uid , m_frames [ m_numAnimFrames ] . frameId ) ;
m_frames [ m_numAnimFrames ] . Bar = NULL ;
m_numAnimFrames + + ;
this - > updateGUI ( ) ;
return true ;
}
2007-12-24 14:50:45 -08:00
bool CPieInternal : : removeFrame ( Uint16 id ) {
2007-12-24 14:11:18 -08:00
//assert(id < MAX_ANIM_FRAMES);
//assert(m_numAnimFrames > 0);
if ( id > = MAX_ANIM_FRAMES )
{
fprintf ( stderr , " frame id is too large \n " ) ;
return false ;
}
TwDeleteBar ( m_frames [ id ] . Bar ) ;
m_frames [ id ] . Bar = NULL ;
m_frames [ id ] . died = false ;
2007-12-24 14:50:45 -08:00
Uint16 i ;
2007-12-24 14:11:18 -08:00
for ( i = m_numAnimFrames - 1 ; i > id ; i - - )
{
m_frames [ i - 1 ] . visible = m_frames [ i ] . visible ;
m_frames [ i - 1 ] . offsetX = m_frames [ i ] . offsetX ;
m_frames [ i - 1 ] . offsetY = m_frames [ i ] . offsetY ;
m_frames [ i - 1 ] . offsetZ = m_frames [ i ] . offsetZ ;
m_frames [ i - 1 ] . rotateX = m_frames [ i ] . rotateX ;
m_frames [ i - 1 ] . rotateY = m_frames [ i ] . rotateY ;
m_frames [ i - 1 ] . rotateZ = m_frames [ i ] . rotateZ ;
m_frames [ i - 1 ] . scaleX = m_frames [ i ] . scaleX ;
m_frames [ i - 1 ] . scaleY = m_frames [ i ] . scaleY ;
m_frames [ i - 1 ] . scaleZ = m_frames [ i ] . scaleZ ;
m_frames [ i - 1 ] . callback . Id = m_frames [ i ] . callback . Id ;
m_frames [ i - 1 ] . callback . pInstance = m_frames [ i ] . callback . pInstance ;
//strncpy(m_frames[i - 1].BarName, m_frames[i].BarName, 255);
//m_frames[i - 1].Bar = m_frames[i].Bar;
TwDeleteBar ( m_frames [ i ] . Bar ) ;
m_frames [ i ] . Bar = NULL ;
}
m_numAnimFrames - - ;
this - > updateGUI ( ) ;
return true ;
}
2007-12-24 14:50:45 -08:00
bool CPieInternal : : duplicateFrame ( Uint16 id ) {
2007-12-24 14:11:18 -08:00
//assert(id < MAX_ANIM_FRAMES);
m_frames [ m_numAnimFrames ] . died = false ;
m_frames [ m_numAnimFrames ] . visible = true ;
m_frames [ m_numAnimFrames ] . frameId = m_numAnimFrames ;
m_frames [ m_numAnimFrames ] . offsetX = m_frames [ id ] . offsetX ;
m_frames [ m_numAnimFrames ] . offsetY = m_frames [ id ] . offsetY ;
m_frames [ m_numAnimFrames ] . offsetZ = m_frames [ id ] . offsetZ ;
m_frames [ m_numAnimFrames ] . rotateX = m_frames [ id ] . rotateX ;
m_frames [ m_numAnimFrames ] . rotateY = m_frames [ id ] . rotateY ;
m_frames [ m_numAnimFrames ] . rotateZ = m_frames [ id ] . rotateZ ;
m_frames [ m_numAnimFrames ] . scaleX = m_frames [ id ] . scaleX ;
m_frames [ m_numAnimFrames ] . scaleY = m_frames [ id ] . scaleY ;
m_frames [ m_numAnimFrames ] . scaleZ = m_frames [ id ] . scaleZ ;
m_frames [ m_numAnimFrames ] . callback . Id = m_numAnimFrames ;
m_frames [ m_numAnimFrames ] . callback . pInstance = ( void * ) this ;
snprintf ( m_frames [ m_numAnimFrames ] . BarName , 255 , " Pie%dAnim%dBar " , this - > uid , m_frames [ m_numAnimFrames ] . frameId ) ;
m_frames [ m_numAnimFrames ] . Bar = NULL ;
m_numAnimFrames + + ;
this - > updateGUI ( ) ;
return true ;
}
bool CPieInternal : : readAnimFile ( const char * filename )
{
FILE * file ;
char newFileName [ 255 ] ;
const char * extension = strstr ( filename , " .pie " ) ;
if ( extension )
{
sscanf ( filename , " %[^'.'] " , newFileName ) ;
strcat ( newFileName , " .ani " ) ;
file = fopen ( newFileName , " rb " ) ;
}
else
{
strncpy ( newFileName , filename , 255 ) ;
file = fopen ( newFileName , " rb " ) ;
}
if ( ! file )
{
fprintf ( stderr , " Erorr opening anim file %s \n " , newFileName ) ;
return false ;
}
char * buffer = ( char * ) malloc ( sizeof ( char ) * 1024 * 1024 ) ; //1MB
char * temp = buffer ;
2007-12-24 14:50:45 -08:00
Uint32 count , quantity = fread ( buffer , 1 , 1024 * 1024 , file ) ;
Uint32 objIndex ;
2007-12-24 14:11:18 -08:00
CPieInternal * target = this ;
fclose ( file ) ;
count = 0 ;
while ( count < quantity )
{
if ( * buffer = = ' / ' & & * ( buffer + 1 ) = = ' * ' )
{
count + = 2 ;
buffer + = 2 ;
while ( true )
2007-10-24 05:29:36 -07:00
{
2007-12-24 14:11:18 -08:00
if ( * buffer = = ' \n ' )
{
count + + ;
buffer + + ;
break ;
}
count + + ;
buffer + + ;
2007-10-24 05:29:36 -07:00
}
2007-12-24 14:11:18 -08:00
continue ;
}
if ( * buffer = = ' \n ' )
{
count + + ;
buffer + + ;
continue ;
}
char Line [ 512 ] ;
2007-12-24 14:50:45 -08:00
Uint32 LineLength ;
2007-12-24 14:11:18 -08:00
sscanf ( buffer , " %[^' \n ']%n " , Line , & LineLength ) ;
count + = LineLength + 1 ;
buffer + = LineLength + 1 ;
if ( Line [ 0 ] = = ' { ' | | Line [ 1 ] = = ' { ' | |
Line [ 0 ] = = ' } ' | | Line [ 1 ] = = ' } ' )
{
continue ;
2007-10-24 05:29:36 -07:00
}
else
{
2007-12-24 14:11:18 -08:00
char tag [ 256 ] , dummy [ 256 ] , dummy2 [ 256 ] ;
sscanf ( Line , " %s %s " , tag , dummy ) ;
2007-10-24 05:29:36 -07:00
2007-12-24 14:11:18 -08:00
if ( ! strcmp ( tag , " ANIM3DFRAMES " ) )
2007-10-24 05:29:36 -07:00
{
2007-12-24 14:50:45 -08:00
Uint32 count , total = 0 ;
2007-12-24 14:11:18 -08:00
sscanf ( Line , " %s%n " , dummy , & count ) ;
total + = count ;
sscanf ( & Line [ total ] , " \" %[^' \" ']%n " , dummy2 , & count ) ;
total + = count ;
sscanf ( & Line [ total ] , " \" %d %d " , & target - > m_numAnimFrames , & target - > m_frameInterval ) ;
target - > m_animMode = ANIM3DFRAMES ;
CPieInternal * temp = target - > m_nextSub ;
while ( temp )
{
temp - > m_animMode = ANIM3DFRAMES ;
temp - > m_numAnimFrames = 0 ;
temp - > m_frameInterval = target - > m_numAnimFrames ;
temp = temp - > m_nextSub ;
}
2007-10-24 05:29:36 -07:00
}
2007-12-24 14:11:18 -08:00
else if ( ! strcmp ( tag , " ANIM3DTRANS " ) )
2007-10-24 05:29:36 -07:00
{
2007-12-24 14:50:45 -08:00
Uint32 dummyInt , count , total = 0 ;
2007-12-24 14:11:18 -08:00
sscanf ( Line , " %s%n " , dummy , & count ) ;
total + = count ;
sscanf ( & Line [ total ] , " \" %[^' \" ']%n " , dummy2 , & count ) ;
total + = count ;
sscanf ( & Line [ total ] , " \" %d %d %d " , & target - > m_numAnimFrames , & target - > m_frameInterval , & dummyInt ) ;
target - > m_animMode = ANIM3DTRANS ;
CPieInternal * temp = target - > m_nextSub ;
while ( temp )
{
temp - > m_animMode = ANIM3DTRANS ;
temp - > m_numAnimFrames = target - > m_numAnimFrames ;
temp - > m_frameInterval = target - > m_numAnimFrames ;
temp = temp - > m_nextSub ;
}
}
else if ( ! strcmp ( tag , " ANIMOBJECT " ) )
{
sscanf ( Line , " %s %d %s " , dummy , & objIndex , dummy2 ) ;
CPieInternal * temp = this ;
2007-12-24 14:50:45 -08:00
Uint32 i = 0 ;
2007-12-24 14:11:18 -08:00
while ( i < objIndex )
{
temp = temp - > m_nextSub ;
if ( temp = = NULL )
{
fprintf ( stderr , " Pie %s Level %d doesnt exist \n " , m_Name , objIndex ) ;
return false ;
}
i + + ;
}
target = temp ;
2007-10-24 05:29:36 -07:00
}
else
{
2007-12-24 14:50:45 -08:00
Uint32 frameId ;
2007-12-24 14:11:18 -08:00
float x , y , z , rotx , roty , rotz , scalex , scaley , scalez ;
sscanf ( Line , " %d %f %f %f %f %f %f %f %f %f " ,
& frameId , & x , & y , & z , & rotx , & roty , & rotz , & scalex , & scaley , & scalez ) ;
target - > m_frames [ frameId ] . died = false ;
target - > m_frames [ frameId ] . visible = true ;
target - > m_frames [ frameId ] . frameId = frameId ;
target - > m_frames [ frameId ] . offsetX = x ;
target - > m_frames [ frameId ] . offsetY = y ;
target - > m_frames [ frameId ] . offsetZ = z ;
target - > m_frames [ frameId ] . rotateX = rotx ;
target - > m_frames [ frameId ] . rotateY = roty ;
target - > m_frames [ frameId ] . rotateZ = rotz ;
target - > m_frames [ frameId ] . scaleX = scalex ;
target - > m_frames [ frameId ] . scaleY = scaley ;
target - > m_frames [ frameId ] . scaleZ = scalez ;
target - > m_frames [ frameId ] . callback . Id = frameId ;
target - > m_frames [ frameId ] . callback . pInstance = ( void * ) target ;
target - > m_frames [ frameId ] . Bar = NULL ;
snprintf ( target - > m_frames [ frameId ] . BarName , 255 , " Pie%dAnim%dBar " , target - > uid , m_frames [ frameId ] . frameId ) ;
2007-10-24 05:29:36 -07:00
}
}
2007-12-24 14:11:18 -08:00
}
free ( temp ) ;
return true ;
}
2007-10-24 05:29:36 -07:00
2007-12-24 14:11:18 -08:00
void CPieInternal : : startAnim ( ) {
if ( m_currAnimFrame = = 0xFFFFFFFF )
{
m_currAnimFrame = 0 ;
m_animStartTime = SDL_GetTicks ( ) ;
2007-10-24 05:29:36 -07:00
}
2007-12-24 14:11:18 -08:00
else
{
2007-12-24 14:50:45 -08:00
Uint32 currTime = SDL_GetTicks ( ) ;
2007-12-24 14:11:18 -08:00
if ( currTime - m_animStartTime > m_frameInterval )
{
m_currAnimFrame + + ;
if ( m_currAnimFrame > = m_numAnimFrames )
{
m_currAnimFrame = 0 ;
}
m_animStartTime = currTime ;
}
}
}
void CPieInternal : : stopAnim ( ) {
m_currAnimFrame = 0xFFFFFFFF ;
m_animStartTime = 0 ;
}
bool CPieInternal : : writeAnimFileTrans ( const char * filename ) {
FILE * file = fopen ( filename , " w+ " ) ;
if ( ! file )
{
fprintf ( stderr , " Error creating anim file %s \n " , filename ) ;
return false ;
}
CPieInternal * temp = this ;
2007-12-24 14:50:45 -08:00
Uint32 index = 0 ;
2007-12-24 14:11:18 -08:00
fprintf ( file , " ANIM3DTRANS \" %s \" %d %d %d \n " , temp - > m_Name , temp - > m_numAnimFrames , temp - > m_frameInterval , temp - > m_levels + 1 ) ;
fprintf ( file , " { \n " ) ;
while ( temp )
{
fprintf ( file , " \t ANIMOBJECT %d \" SubModel%d \" \n " , index , index ) ;
fprintf ( file , " \t { \n " ) ;
2007-12-24 14:50:45 -08:00
Uint32 i ;
2007-12-24 14:11:18 -08:00
for ( i = 0 ; i < temp - > m_numAnimFrames ; i + + )
{
fprintf ( file , " \t \t %d %d %d %d %d %d %d %d %d %d \n " ,
2007-12-24 14:50:45 -08:00
i , ( Sint32 ) temp - > m_frames [ i ] . offsetX , ( Sint32 ) temp - > m_frames [ i ] . offsetY , ( Sint32 ) temp - > m_frames [ i ] . offsetZ ,
( Sint32 ) temp - > m_frames [ i ] . rotateX , ( Sint32 ) temp - > m_frames [ i ] . rotateY , ( Sint32 ) temp - > m_frames [ i ] . rotateZ ,
( Sint32 ) temp - > m_frames [ i ] . scaleX , ( Sint32 ) temp - > m_frames [ i ] . scaleY , ( Sint32 ) temp - > m_frames [ i ] . scaleZ ) ;
2007-12-24 14:11:18 -08:00
}
fprintf ( file , " \t } \n \n " ) ;
temp = temp - > m_nextSub ;
index + + ;
}
fprintf ( file , " } \n " ) ;
fclose ( file ) ;
return true ;
}
bool CPieInternal : : writeAnimFileFrames ( const char * filename ) {
FILE * file = fopen ( filename , " w+ " ) ;
if ( ! file )
{
fprintf ( stderr , " Error creating anim file %s \n " , filename ) ;
return false ;
}
CPieInternal * temp = this ;
2007-12-24 14:50:45 -08:00
Uint32 i ;
2007-12-24 14:11:18 -08:00
fprintf ( file , " ANIM3DFRAMES \" %s \" %d %d \n " , temp - > m_Name , temp - > m_numAnimFrames , temp - > m_frameInterval ) ;
fprintf ( file , " { \n " ) ;
for ( i = 0 ; i < temp - > m_numAnimFrames ; i + + )
{
fprintf ( file , " \t %d %d %d %d %d %d %d %d %d %d \n " ,
2007-12-24 14:50:45 -08:00
i , ( Sint32 ) temp - > m_frames [ i ] . offsetX , ( Sint32 ) temp - > m_frames [ i ] . offsetY , ( Sint32 ) temp - > m_frames [ i ] . offsetZ ,
( Sint32 ) temp - > m_frames [ i ] . rotateX , ( Sint32 ) temp - > m_frames [ i ] . rotateY , ( Sint32 ) temp - > m_frames [ i ] . rotateZ ,
( Sint32 ) temp - > m_frames [ i ] . scaleX , ( Sint32 ) temp - > m_frames [ i ] . scaleY , ( Sint32 ) temp - > m_frames [ i ] . scaleZ ) ;
2007-12-24 14:11:18 -08:00
}
fprintf ( file , " } \n " ) ;
fclose ( file ) ;
return true ;
2007-10-24 05:29:36 -07:00
}