From 0b38ff0e5b8f665d51c0d31076e15040cb81ff95 Mon Sep 17 00:00:00 2001 From: Pan7 Date: Sun, 21 Aug 2016 12:02:15 +0200 Subject: [PATCH 01/28] Fix gcc warning suggest explicit braces to avoid ambiguous --- plugins/vfspk3/unzip.cpp | 14 ++++++++------ plugins/vfsqlpk3/unzip.cpp | 14 ++++++++------ 2 files changed, 16 insertions(+), 12 deletions(-) diff --git a/plugins/vfspk3/unzip.cpp b/plugins/vfspk3/unzip.cpp index 1ef15059..aa5c2246 100644 --- a/plugins/vfspk3/unzip.cpp +++ b/plugins/vfspk3/unzip.cpp @@ -1618,12 +1618,12 @@ static int unzlocal_GetCurrentFileInfoInternal (unzFile file, /* we check the magic */ - if (err==UNZ_OK) + if (err==UNZ_OK) { if (unzlocal_getLong(s->file,&uMagic) != UNZ_OK) err=UNZ_ERRNO; else if (uMagic!=0x02014b50) err=UNZ_BADZIPFILE; - + } if (unzlocal_getShort(s->file,&file_info.version) != UNZ_OK) err=UNZ_ERRNO; @@ -1698,11 +1698,12 @@ static int unzlocal_GetCurrentFileInfoInternal (unzFile file, else uSizeRead = extraFieldBufferSize; - if (lSeek!=0) + if (lSeek!=0) { if (fseek(s->file,lSeek,SEEK_CUR)==0) lSeek=0; else err=UNZ_ERRNO; + } if ((file_info.size_file_extra>0) && (extraFieldBufferSize>0)) if (fread(extraField,(uInt)uSizeRead,1,s->file)!=1) err=UNZ_ERRNO; @@ -1723,11 +1724,12 @@ static int unzlocal_GetCurrentFileInfoInternal (unzFile file, else uSizeRead = commentBufferSize; - if (lSeek!=0) + if (lSeek!=0) { if (fseek(s->file,lSeek,SEEK_CUR)==0) lSeek=0; else err=UNZ_ERRNO; + } if ((file_info.size_file_comment>0) && (commentBufferSize>0)) if (fread(szComment,(uInt)uSizeRead,1,s->file)!=1) err=UNZ_ERRNO; @@ -1889,12 +1891,12 @@ static int unzlocal_CheckCurrentFileCoherencyHeader (unz_s* s, uInt* piSizeVar, return UNZ_ERRNO; - if (err==UNZ_OK) + if (err==UNZ_OK) { if (unzlocal_getLong(s->file,&uMagic) != UNZ_OK) err=UNZ_ERRNO; else if (uMagic!=0x04034b50) err=UNZ_BADZIPFILE; - + } if (unzlocal_getShort(s->file,&uData) != UNZ_OK) err=UNZ_ERRNO; /* diff --git a/plugins/vfsqlpk3/unzip.cpp b/plugins/vfsqlpk3/unzip.cpp index cc1f13d5..b263c320 100644 --- a/plugins/vfsqlpk3/unzip.cpp +++ b/plugins/vfsqlpk3/unzip.cpp @@ -1615,12 +1615,12 @@ static int unzlocal_GetCurrentFileInfoInternal (unzFile file, /* we check the magic */ - if (err==UNZ_OK) + if (err==UNZ_OK) { if (unzlocal_getLong(s->file,&uMagic) != UNZ_OK) err=UNZ_ERRNO; else if (uMagic!=0x02014b50) err=UNZ_BADZIPFILE; - + } if (unzlocal_getShort(s->file,&file_info.version) != UNZ_OK) err=UNZ_ERRNO; @@ -1695,11 +1695,12 @@ static int unzlocal_GetCurrentFileInfoInternal (unzFile file, else uSizeRead = extraFieldBufferSize; - if (lSeek!=0) + if (lSeek!=0) { if (fseek(s->file,lSeek,SEEK_CUR)==0) lSeek=0; else err=UNZ_ERRNO; + } if ((file_info.size_file_extra>0) && (extraFieldBufferSize>0)) if (fread_ql(extraField,(uInt)uSizeRead,1,s->file)!=1) err=UNZ_ERRNO; @@ -1720,11 +1721,12 @@ static int unzlocal_GetCurrentFileInfoInternal (unzFile file, else uSizeRead = commentBufferSize; - if (lSeek!=0) + if (lSeek!=0) { if (fseek(s->file,lSeek,SEEK_CUR)==0) lSeek=0; else err=UNZ_ERRNO; + } if ((file_info.size_file_comment>0) && (commentBufferSize>0)) if (fread_ql(szComment,(uInt)uSizeRead,1,s->file)!=1) err=UNZ_ERRNO; @@ -1886,12 +1888,12 @@ static int unzlocal_CheckCurrentFileCoherencyHeader (unz_s* s, uInt* piSizeVar, return UNZ_ERRNO; - if (err==UNZ_OK) + if (err==UNZ_OK) { if (unzlocal_getLong(s->file,&uMagic) != UNZ_OK) err=UNZ_ERRNO; else if (uMagic!=0x04034b50) err=UNZ_BADZIPFILE; - + } if (unzlocal_getShort(s->file,&uData) != UNZ_OK) err=UNZ_ERRNO; /* From 282f33d813e896b25f0465c916bdfa369f2da6dd Mon Sep 17 00:00:00 2001 From: Pan7 Date: Sun, 21 Aug 2016 21:35:42 +0200 Subject: [PATCH 02/28] Fix for potentially using uninitialized variable --- libs/picomodel/lwo/envelope.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/libs/picomodel/lwo/envelope.c b/libs/picomodel/lwo/envelope.c index db7000ad..4510dade 100644 --- a/libs/picomodel/lwo/envelope.c +++ b/libs/picomodel/lwo/envelope.c @@ -75,6 +75,8 @@ lwEnvelope *lwGetEnvelope( picoMemStream_t *fp, int cksize ){ goto Fail; } + key = NULL; + /* process subchunks as they're encountered */ while ( 1 ) { From c346d43ae06f23084bbdb9bac943eca700ed141e Mon Sep 17 00:00:00 2001 From: Pan7 Date: Mon, 22 Aug 2016 08:48:01 +0200 Subject: [PATCH 03/28] Fix gcc warning i may be used uninitialized --- libs/picomodel/lwo/lwob.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/libs/picomodel/lwo/lwob.c b/libs/picomodel/lwo/lwob.c index 57cc0c52..b98c81a1 100644 --- a/libs/picomodel/lwo/lwob.c +++ b/libs/picomodel/lwo/lwob.c @@ -382,16 +382,17 @@ lwSurface *lwGetSurface5( picoMemStream_t *fp, int cksize, lwObject *obj ){ case ID_TFLG: flags = getU2( fp ); + //only one of the three axis bits should be set if ( flags & 1 ) { - i = 0; + tex->axis = 0; } - if ( flags & 2 ) { - i = 1; + else if ( flags & 2 ) { + tex->axis = 1; } - if ( flags & 4 ) { - i = 2; + else if ( flags & 4 ) { + tex->axis = 2; } - tex->axis = i; + if ( tex->type == ID_IMAP ) { tex->param.imap.axis = i; } From d089ba94541eb7a22aef6d4fb4dca17a2adb9303 Mon Sep 17 00:00:00 2001 From: Pan7 Date: Mon, 22 Aug 2016 10:41:34 +0200 Subject: [PATCH 04/28] Fix gcc warning shdr may be used uninitialized --- libs/picomodel/lwo/lwob.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/libs/picomodel/lwo/lwob.c b/libs/picomodel/lwo/lwob.c index 57cc0c52..d59b8f07 100644 --- a/libs/picomodel/lwo/lwob.c +++ b/libs/picomodel/lwo/lwob.c @@ -244,6 +244,8 @@ lwSurface *lwGetSurface5( picoMemStream_t *fp, int cksize, lwObject *obj ){ goto Fail; } + shdr = NULL; + /* process subchunks as they're encountered */ while ( 1 ) { @@ -494,6 +496,9 @@ lwSurface *lwGetSurface5( picoMemStream_t *fp, int cksize, lwObject *obj ){ break; case ID_SDAT: + if ( !shdr ) { + goto Fail; + } shdr->data = getbytes( fp, sz ); break; From 5b342944e62d2cacdcfcec835e01f89ce60c5689 Mon Sep 17 00:00:00 2001 From: Pan7 Date: Tue, 23 Aug 2016 13:49:43 +0200 Subject: [PATCH 05/28] Fix gcc warning item may be used uninitialized in this function --- radiant/mainframe.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/radiant/mainframe.cpp b/radiant/mainframe.cpp index 4fb3b198..211f2da4 100644 --- a/radiant/mainframe.cpp +++ b/radiant/mainframe.cpp @@ -7172,6 +7172,7 @@ void MainFrame::OnGridPrev(){ case 64: item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_grid_64" ) ); break; case 128: item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_grid_128" ) ); break; case 256: item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_grid_256" ) ); break; + default: return; } } From 3c9676f4286937985cb4ce277a5032331e314740 Mon Sep 17 00:00:00 2001 From: Pan7 Date: Wed, 24 Aug 2016 11:28:08 +0200 Subject: [PATCH 06/28] m4_submat modification --- libs/mathlib/m4x4.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/libs/mathlib/m4x4.c b/libs/mathlib/m4x4.c index 5dfdd10d..6f3e75ab 100644 --- a/libs/mathlib/m4x4.c +++ b/libs/mathlib/m4x4.c @@ -702,27 +702,31 @@ void m4_submat( m4x4_t mr, m3x3_t mb, int i, int j ){ idst = 0; for ( ti = 0; ti < 4; ti++ ) { + if ( ti == i ) { + continue; + } if ( ti < i ) { idst = ti; } else - if ( ti > i ) { + { idst = ti - 1; } for ( tj = 0; tj < 4; tj++ ) { + if ( tj == j ) { + continue; + } if ( tj < j ) { jdst = tj; } else - if ( tj > j ) { + { jdst = tj - 1; } - if ( ti != i && tj != j ) { - mb[idst * 3 + jdst] = mr[ti * 4 + tj ]; - } + mb[idst * 3 + jdst] = mr[ti * 4 + tj ]; } } } From 70b90a60c70adcf480ce6c67d5f591304f7e7139 Mon Sep 17 00:00:00 2001 From: Pan7 Date: Thu, 25 Aug 2016 17:47:34 +0200 Subject: [PATCH 07/28] Fix gcc warning sizeof on array function parameter src will return size of float (*)[3] --- libs/splines/math_matrix.h | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/libs/splines/math_matrix.h b/libs/splines/math_matrix.h index 41216ee0..a6dabb89 100644 --- a/libs/splines/math_matrix.h +++ b/libs/splines/math_matrix.h @@ -84,7 +84,11 @@ ID_INLINE mat3_t::mat3_t() { } ID_INLINE mat3_t::mat3_t( float src[ 3 ][ 3 ] ) { - memcpy( mat, src, sizeof( src ) ); + for( unsigned int i = 0; i < 3; i++ ) { + mat[i].x = src[i][0]; + mat[i].y = src[i][1]; + mat[i].z = src[i][2]; + } } ID_INLINE mat3_t::mat3_t( idVec3 const &x, idVec3 const &y, idVec3 const &z ) { From cdc2dbff32259155d417c8aa08b5e46a246e8021 Mon Sep 17 00:00:00 2001 From: Jay Dolan Date: Thu, 15 Sep 2016 16:27:55 -0400 Subject: [PATCH 08/28] More texture suffix checks for DarkPlaces effect texture names. --- radiant/texwindow.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/radiant/texwindow.cpp b/radiant/texwindow.cpp index ec20e357..4e459065 100644 --- a/radiant/texwindow.cpp +++ b/radiant/texwindow.cpp @@ -780,7 +780,11 @@ void Texture_ShowDirectory(){ g_str_has_suffix( name, "_h" ) || g_str_has_suffix( name, "_local" ) || g_str_has_suffix( name, "_nm" ) || - g_str_has_suffix( name, "_s" )) { + g_str_has_suffix( name, "_s" ) || + g_str_has_suffix( name, "_bump" ) || + g_str_has_suffix( name, "_gloss" ) || + g_str_has_suffix( name, "_luma" ) || + g_str_has_suffix( name, "_norm" ) ) { continue; } From cd222b361829f226802b2bc78e0279a4dd9963a1 Mon Sep 17 00:00:00 2001 From: Timothee Besset Date: Thu, 29 Sep 2016 14:20:56 -0500 Subject: [PATCH 09/28] misc cleanup --- include/qerplugin.h | 119 --------------------------- libs/synapse.h | 30 +++---- libs/synapse/synapse.vcxproj | 3 + libs/synapse/synapse.vcxproj.filters | 5 ++ 4 files changed, 23 insertions(+), 134 deletions(-) diff --git a/include/qerplugin.h b/include/qerplugin.h index ee24c29c..ce40f3ff 100644 --- a/include/qerplugin.h +++ b/include/qerplugin.h @@ -137,16 +137,6 @@ struct _QERModelLoad //========================================= // plugin functions -#if 0 -// NOTE TTimo: hack to make old plugin tech and new plugin tech live together -#ifndef _IPLUGIN_H_ -// toolkit-independant interface, cast hwndMain to GtkWidget* -typedef const char* ( WINAPI * PFN_QERPLUG_INIT )( void* hApp, void* hwndMain ); -typedef const char* ( WINAPI * PFN_QERPLUG_GETNAME )(); -typedef const char* ( WINAPI * PFN_QERPLUG_GETCOMMANDLIST )(); -typedef void ( WINAPI * PFN_QERPLUG_DISPATCH )( const char* p, vec3_t vMin, vec3_t vMax, bool bSingleBrush ); -#endif -#endif typedef char* ( WINAPI * PFN_QERPLUG_GETFUNCTABLE )(); @@ -275,115 +265,6 @@ typedef char* ( WINAPI * PFN_QERAPP_PROFILE_LOADSTR )( const char *filename, con // To use the active or selected brush lists, you must first allocate them (which returns a count) and then // release them when you are finish manipulating brushes in one of those lists. -//++timo NOTE : the #defines here are never used, but can help finding where things are done in the editor -#if 0 -// brush manipulation routines -#define QERAPP_CREATEBRUSH "QERApp_CreateBrush" -#define QERAPP_CREATEBRUSHHANDLE "QERApp_CreateBrushHandle" -#define QERAPP_DELETEBRUSHHANDLE "QERApp_DeleteBrushHandle" -#define QERAPP_COMMITBRUSHHANDLETOMAP "QERApp_CommitBrushHandleToMap" -//++timo not implemented .. remove -// #define QERAPP_BINDHANDLESTOENTITY "QERApp_BindHandlesToEntity" -#define QERAPP_ADDFACE "QERApp_AddFace" -#define QERAPP_ADDFACEDATA "QERApp_AddFaceData" -#define QERAPP_GETFACECOUNT "QERApp_GetFaceCount" -#define QERAPP_GETFACEDATA "QERApp_GetFaceData" -#define QERAPP_SETFACEDATA "QERApp_SetFaceData" -#define QERAPP_DELETEFACE "QERApp_DeleteFace" -#define QERAPP_TEXTUREBRUSH "QERApp_TextureBrush" -#define QERAPP_BUILDBRUSH "QERApp_BuildBrush" // PGM -#define QERAPP_SELECTEDBRUSHCOUNT "QERApp_SelectedBrushCount" -#define QERAPP_ALLOCATESELECTEDBRUSHHANDLES "QERApp_AllocateSelectedBrushHandles" -#define QERAPP_RELEASESELECTEDBRUSHHANDLES "QERApp_ReleaseSelectedBrushHandles" -#define QERAPP_GETSELECTEDBRUSHHANDLE "QERApp_GetSelectedBrushHandle" -#define QERAPP_ACTIVEBRUSHCOUNT "QERApp_ActiveBrushCount" -#define QERAPP_ALLOCATEACTIVEBRUSHHANDLES "QERApp_AllocateActiveBrushHandles" -#define QERAPP_RELEASEACTIVEBRUSHHANDLES "QERApp_ReleaseActiveBrushHandles" -#define QERAPP_GETACTIVEBRUSHHANDLE "QERApp_GetActiveBrushHandle" - -// texture stuff -#define QERAPP_TEXTURECOUNT "QERApp_TextureCount" -#define QERAPP_GETTEXTURE "QERApp_GetTexture" -#define QERAPP_GETCURRENTTEXTURE "QERApp_GetCurrentTexture" -#define QERAPP_SETCURRENTTEXTURE "QERApp_SetCurrentTexture" - -// selection -#define QERAPP_DELETESELECTION "QERApp_DeleteSelection" -#define QERAPP_SELECTBRUSH "QERApp_SelectBrush" // PGM -#define QERAPP_DESELECTBRUSH "QERApp_DeselectBrush" // PGM -#define QERAPP_DESELECTALLBRUSHES "QERApp_DeselectAllBrushes" // PGM - -// data gathering -#define QERAPP_GETPOINTS "QERApp_GetPoints" -#define QERAPP_SELECTBRUSHES "QERApp_GetBrushes" - -// entity class stuff -// the entity handling is very basic for 1.0 -#define QERAPP_GETECLASSCOUNT "QERApp_GetEClassCount" -#define QERAPP_GETECLASS "QERApp_GetEClass" - -// misc -#define QERAPP_SYSMSG "QERApp_SysMsg" -#define QERAPP_INFOMSG "QERApp_InfoMsg" -#define QERAPP_HIDEINFOMSG "QERApp_HideInfoMsg" -#define QERAPP_RESET_PLUGINS "QERApp_ResetPlugins" - -// texture loading -#define QERAPP_LOADTEXTURERGBA "QERApp_LoadTextureRGBA" - -// FIXME: the following are not implemented yet -// hook registrations -#define QERAPP_REGISTER_MAPLOADFUNC "QERApp_Register_MapLoadFunc" -#define QERAPP_REGISTER_MAPSAVEFUNC "QERApp_Register_MapSaveFunc" - -// FIXME: the following are not implemented yet -#define QERAPP_REGISTER_PROJECTLOADFUNC "QERApp_Register_ProjectLoadFunc" -#define QERAPP_REGISTER_MOUSEHANDLER "QERApp_Register_MouseHandler" -#define QERAPP_REGISTER_KEYHANDLER "QERApp_Register_KeyHandler" - -// FIXME: new primtives do not work in v1.00 -// primitives are new types of things in the map -// for instance, the Q3 curves could have been done as -// primitives instead of being built in -// it will be a plugins responsibility to hook the map load and save funcs to load -// and/or save any additional data (like new primitives of some type) -// the editor will call each registered renderer during the rendering process to repaint -// any primitives the plugin owns -// each primitive object has a temporary sibling brush that lives in the map -// FIXME: go backwards on this a bit.. orient it more towards the temp brush mode as it will be cleaner -// basically a plugin will hook the map load and save and will add the primitives to the map.. this will -// produce a temporary 'primitive' brush and the appropriate renderer will be called as well as the -// edit handler (for edge drags, sizes, rotates, etc.. ) and the vertex maker will be called when vertex -// mode is attemped on the brush.. there will need to be a GetPrimitiveBounds callback in the edit handler -// so the brush can resize appropriately as needed.. this might be the plugins responsibility to set the -// sibling brushes size.. it will then be the plugins responsibility to hook map save to save the primitives -// as the editor will discard any temp primitive brushes.. (there probably needs to be some kind of sanity check -// here as far as keeping the brushes and the plugin in sync.. i suppose the edit handler can deal with all of that -// crap but it looks like a nice place for a mess) -#define QERAPP_REGISTER_PRIMITIVE "QERApp_Register_Primitive" -#define QERAPP_REGISTER_RENDERER "QERApp_Register_Renderer" -#define QERAPP_REGISTER_EDITHANDLER "QERApp_Register_EditHandler" -#define QERAPP_REGISTER_VERTEXMAKER "QERApp_Register_VertexMaker" -#define QERAPP_ADDPRIMITIVE "QERApp_AddPrimitive" - -// v1.70 -#define QERAPP_GETENTITYCOUNT "QERApp_GetEntityCount" -#define QERAPP_GETENTITYHANDLE "QERApp_GetEntityHandle" -//++timo not implemented for the moment -// #define QERAPP_GETENTITYINFO "QERApp_GetEntityInfo" -//++timo does the keyval need some more funcs to add/remove ? -// get the pointer and do the changes yourself -#define QERAPP_ALLOCATEEPAIR "QERApp_AllocateEpair" -#define QERAPP_ALLOCATEENTITYBRUSHHANDLES "QERApp_AllocateEntityBrushHandles" -#define QERAPP_RELEASEENTITYBRUSHHANDLES "QERApp_ReleaseEntityBrushHandles" -#define QERAPP_GETENTITYBRUSHHANDLE "QERApp_GetEntityBrushHandle" -#define QERAPP_CREATEENTITYHANDLE "QERApp_CreateEntityHandle" -#define QERAPP_COMMITBRUSHHANDLETOENTITY "QERApp_CommitBrushHandleToEntity" -#define QERAPP_COMMITENTITYHANDLETOMAP "QERApp_CommitEntityHandleToMap" -#define QERAPP_SETSCREENUPDATE "QERApp_SetScreenUpdate" -#define QERAPP_BUILDBRUSH2 "QERApp_BuildBrush2" -#endif - // v1.80 #define QERAPP_GETDISPATCHPARAMS "QERApp_GetDispatchParams" diff --git a/libs/synapse.h b/libs/synapse.h index 4f7e9aab..1c1f93b7 100644 --- a/libs/synapse.h +++ b/libs/synapse.h @@ -91,7 +91,7 @@ /*! ======================================================================= diagnostic printing facility - independently from any API negociation stuff, + independently from any API negotiation stuff, we need a diagnostic facility that's available at all times ======================================================================= */ @@ -219,7 +219,7 @@ void SetType( EAPIManagerType type ) { mType = type; } set the API matching pattern supported syntax: any minor for a given major, for instance: PLUGIN_MAJOR, "*" - a space seperated list of minors for a given major: IMAGE_MAJOR, "tga jpg" + a space separated list of minors for a given major: IMAGE_MAJOR, "tga jpg" */ void SetMatchAPI( const char *major, const char *minor ); @@ -236,8 +236,8 @@ static APIDescriptor_t* PrepareRequireAPI( APIDescriptor_t *pAPI ); bool CheckSetActive(); /*! - the manager answers wether it wants to load this or not - we provide a default implementation, but this can be completely overriden if needed + the manager answers whether it wants to load this or not + we provide a default implementation, but this can be completely overridden if needed see SetMatchAPI for the documentation of the default implementation NOTE: this should only be called on API_MATCH type of managers */ @@ -279,8 +279,8 @@ class CSynapseServer; // forward declare class CSynapseClient : public IRefCounted { /*! - this flag indicates wether this client is active - i.e. wether you can ask it for interfaces + this flag indicates whether this client is active + i.e. whether you can ask it for interfaces this is either a client for which all required interfaces have been filled in or a client we are trying to resolve (i.e. load with all it's stuff) */ @@ -324,7 +324,7 @@ APIDescriptor_t* GetAPIDescriptor( int ) const; ///< retrieve specific informati SYN_PROVIDE: means this is an API we provide if anyone needs it SYN_REQUIRE: means this is an API we will require for operation SYN_REQUIRE_ANY: means this is an API we want to load *any* minor found - (for instance a list of image fornats, or the plugins) + (for instance a list of image formats, or the plugins) \param pTable the function table @@ -363,7 +363,7 @@ CSynapseAPIManager* GetManagerList( int ); ///< get corresponding API manager virtual bool RequestAPI( APIDescriptor_t *pAPI ) = 0; /*! - return the build date, can be overriden by client module + return the build date, can be overridden by client module */ virtual const char* GetInfo(); @@ -405,7 +405,7 @@ virtual bool OnActivate() { return true; } \param client_name, the name of the client node to look for. If NULL, use GetName() - \return wether all APIs given were successfully found in the config + \return whether all APIs given were successfully found in the config */ bool ConfigXML( CSynapseServer *pServer, const char *client_name, const XMLConfigEntry_t entries[] ); @@ -451,7 +451,7 @@ typedef enum { SYN_SO, SYN_BUILTIN } EClientType; /*! server side slot for a synapse client - is OS dependant, except for the ISynapseClient part + is OS dependent, except for the ISynapseClient part */ class CSynapseClientSlot { @@ -517,7 +517,7 @@ gchar *m_content; /*! push required interfaces for this client into the stack of things to be resolved - it is possible that several mathing interfaces be in the stack at the same time + it is possible that several matching interfaces be in the stack at the same time (for instance several modules that want to get the VFS) but we should never have the same APIDescriptor_t twice NOTE: as this function is called repeatedly during the resolve (because the list of required things is refining), @@ -567,8 +567,8 @@ void AddSearchPath( char* ); ///< add a new directory to the module search path /*! do the big thing, scan for modules, scan their APIs, load up everything providing pf is optional, will set the diagnostics printing - \param conf_file is the XML configuration file for the intialization (see docs/runtime.txt) - \return false if the init failed (for instance not found/invalid conf file + \param conf_file is the XML configuration file for the initialization (see docs/runtime.txt) + \return false if the init failed (for instance not found/invalid configuration file */ bool Initialize( const char* conf_file = NULL, PFN_SYN_PRINTF_VA pf = NULL ); @@ -593,8 +593,8 @@ bool Resolve( CSynapseClient *pClient ); /*! \brief shutdown all the clients. Should only be called when the core is about to exit - this will force all clients to shutdown. it may destroy refcounted APIs and stuff - \todo hafta use the release/refresh code before doing actual shutdown + this will force all clients to shutdown. it may destroy refcounted APIs and such + \todo have to use the release/refresh code before doing actual shutdown (i.e. when that code is written later on) we need to 'broadcast' to all the clients .. that all the modules are going to be reloaded sorta should clear up as many interfaces as possible to avoid unexpected crashes in the final stages of app exit diff --git a/libs/synapse/synapse.vcxproj b/libs/synapse/synapse.vcxproj index 151ec567..c3dd5d1d 100644 --- a/libs/synapse/synapse.vcxproj +++ b/libs/synapse/synapse.vcxproj @@ -123,6 +123,9 @@ + + + diff --git a/libs/synapse/synapse.vcxproj.filters b/libs/synapse/synapse.vcxproj.filters index 06d28361..0843c886 100644 --- a/libs/synapse/synapse.vcxproj.filters +++ b/libs/synapse/synapse.vcxproj.filters @@ -11,4 +11,9 @@ src + + + src + + \ No newline at end of file From 9102a0cdf68816a478aa53bc779a1ec01ac255b8 Mon Sep 17 00:00:00 2001 From: Timothee Besset Date: Fri, 30 Sep 2016 10:19:43 -0500 Subject: [PATCH 10/28] add bspc as submodule --- .gitmodules | 3 +++ bspc | 1 + 2 files changed, 4 insertions(+) create mode 100644 .gitmodules create mode 160000 bspc diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 00000000..04728f9d --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "bspc"] + path = bspc + url = git@github.com:TTimo/bspc.git diff --git a/bspc b/bspc new file mode 160000 index 00000000..a1287590 --- /dev/null +++ b/bspc @@ -0,0 +1 @@ +Subproject commit a1287590f17c35a612f33708aeec5815402866b8 From 5432b04490c3eade36c9bcce8092f21428359b7f Mon Sep 17 00:00:00 2001 From: Timothee Besset Date: Fri, 30 Sep 2016 10:24:25 -0500 Subject: [PATCH 11/28] update git ignores --- install/.gitignore | 7 +++++++ libs/.gitignore | 1 + tools/.gitignore | 3 +++ 3 files changed, 11 insertions(+) create mode 100644 install/.gitignore create mode 100644 libs/.gitignore create mode 100644 tools/.gitignore diff --git a/install/.gitignore b/install/.gitignore new file mode 100644 index 00000000..7c16a3dc --- /dev/null +++ b/install/.gitignore @@ -0,0 +1,7 @@ +*.dll +*.pdb +*.exp +*.ilk +*.pdb +*.lib +*.exe diff --git a/libs/.gitignore b/libs/.gitignore new file mode 100644 index 00000000..e9b6ac45 --- /dev/null +++ b/libs/.gitignore @@ -0,0 +1 @@ +x64 diff --git a/tools/.gitignore b/tools/.gitignore new file mode 100644 index 00000000..fccb064c --- /dev/null +++ b/tools/.gitignore @@ -0,0 +1,3 @@ +x64 +Debug +Release From 1342e8ae5f7b871a0f3608c4551e1a9be580e238 Mon Sep 17 00:00:00 2001 From: Rudolf Polzer Date: Fri, 16 Sep 2011 06:55:21 +0200 Subject: [PATCH 12/28] fix two obvious typos --- tools/quake3/q3map2/bsp.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/quake3/q3map2/bsp.c b/tools/quake3/q3map2/bsp.c index 384933d6..231db0ad 100644 --- a/tools/quake3/q3map2/bsp.c +++ b/tools/quake3/q3map2/bsp.c @@ -778,7 +778,7 @@ int BSPMain( int argc, char **argv ){ else if ( !strcmp( argv[ i ], "-np" ) ) { npDegrees = atof( argv[ i + 1 ] ); if ( npDegrees < 0.0f ) { - shadeAngleDegrees = 0.0f; + npDegrees = 0.0f; } else if ( npDegrees > 0.0f ) { Sys_Printf( "Forcing nonplanar surfaces with a breaking angle of %f degrees\n", npDegrees ); From 75e2a7082343c6650a43d80a89c49e18e8758f2f Mon Sep 17 00:00:00 2001 From: Thomas Debesse Date: Sat, 15 Oct 2016 20:05:27 +0200 Subject: [PATCH 13/28] More: Using Sys_FPrintf with SYS_WRN and SYS_ERR MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This commit do the same as “Using Sys_FPrintf with SYS_WRN and SYS_ERR” commit by @Pan7 (5105fc5) for occurrences that were left untouched (tools/ subtree only). --- tools/quake2/q2map/brushbsp.c | 2 +- tools/quake2/q2map/faces.c | 2 +- tools/quake2/q2map/lightmap.c | 2 +- tools/quake2/q2map/main.c | 2 +- tools/quake2/q2map/portals.c | 8 ++++---- tools/quake2/q2map/qvis.c | 2 +- tools/quake3/common/aselib.c | 2 +- 7 files changed, 10 insertions(+), 10 deletions(-) diff --git a/tools/quake2/q2map/brushbsp.c b/tools/quake2/q2map/brushbsp.c index 179899a3..3ca734bb 100644 --- a/tools/quake2/q2map/brushbsp.c +++ b/tools/quake2/q2map/brushbsp.c @@ -1293,7 +1293,7 @@ tree_t *BrushBSP( bspbrush_t *brushlist, vec3_t mins, vec3_t maxs ){ volume = BrushVolume( b ); if ( volume < microvolume ) { - Sys_Printf( "WARNING: entity %i, brush %i: microbrush\n", + Sys_FPrintf( SYS_WRN, "WARNING: entity %i, brush %i: microbrush\n", b->original->entitynum, b->original->brushnum ); } diff --git a/tools/quake2/q2map/faces.c b/tools/quake2/q2map/faces.c index f43f641c..15bb095f 100644 --- a/tools/quake2/q2map/faces.c +++ b/tools/quake2/q2map/faces.c @@ -653,7 +653,7 @@ int GetEdge2( int v1, int v2, face_t *f ){ } #if 0 if ( v1 == edge->v[0] && v2 == edge->v[1] ) { - Sys_Printf( "WARNING: multiple forward edge\n" ); + Sys_FPrintf( SYS_WRN, "WARNING: multiple forward edge\n" ); return i; } #endif diff --git a/tools/quake2/q2map/lightmap.c b/tools/quake2/q2map/lightmap.c index 849b6b72..8d82b6da 100644 --- a/tools/quake2/q2map/lightmap.c +++ b/tools/quake2/q2map/lightmap.c @@ -874,7 +874,7 @@ void CreateDirectLights( void ){ if ( target[0] ) { // point towards target e2 = FindTargetEntity( target ); if ( !e2 ) { - Sys_Printf( "WARNING: light at (%i %i %i) has missing target\n", + Sys_FPrintf( SYS_WRN, "WARNING: light at (%i %i %i) has missing target\n", (int)dl->origin[0], (int)dl->origin[1], (int)dl->origin[2] ); } else diff --git a/tools/quake2/q2map/main.c b/tools/quake2/q2map/main.c index dbd8c0de..fb85403b 100644 --- a/tools/quake2/q2map/main.c +++ b/tools/quake2/q2map/main.c @@ -649,7 +649,7 @@ int main( int argc, char **argv ){ Sys_Printf( "Game: %s\n", game ); if ( !do_info && !do_bsp && !do_vis && !do_rad ) { - Sys_Printf( "ERROR: -bsp, -vis, -light, nor -info specified.\nWhat to you want me to do?\n\n" ); + Sys_FPrintf( SYS_ERR, "ERROR: -bsp, -vis, -light, nor -info specified.\nWhat to you want me to do?\n\n" ); } else { diff --git a/tools/quake2/q2map/portals.c b/tools/quake2/q2map/portals.c index d4e1127f..d2d96527 100644 --- a/tools/quake2/q2map/portals.c +++ b/tools/quake2/q2map/portals.c @@ -554,13 +554,13 @@ void MakeTreePortals_r( node_t *node ){ CalcNodeBounds( node ); if ( node->mins[0] >= node->maxs[0] ) { - Sys_Printf( "WARNING: node without a volume\n" ); + Sys_FPrintf( SYS_WRN, "WARNING: node without a volume\n" ); } for ( i = 0 ; i < 3 ; i++ ) { if ( node->mins[i] < -8000 || node->maxs[i] > 8000 ) { - Sys_Printf( "WARNING: node with unbounded volume\n" ); + Sys_FPrintf( SYS_WRN, "WARNING: node with unbounded volume\n" ); break; } } @@ -756,7 +756,7 @@ void FloodAreas_r( node_t *node ){ // note the current area as bounding the portal if ( e->portalareas[1] ) { - Sys_Printf( "WARNING: areaportal entity %i touches > 2 areas\n", b->original->entitynum ); + Sys_FPrintf( SYS_WRN, "WARNING: areaportal entity %i touches > 2 areas\n", b->original->entitynum ); return; } if ( e->portalareas[0] ) { @@ -854,7 +854,7 @@ void SetAreaPortalAreas_r( node_t *node ){ e = &entities[b->original->entitynum]; node->area = e->portalareas[0]; if ( !e->portalareas[1] ) { - Sys_Printf( "WARNING: areaportal entity %i doesn't touch two areas\n", b->original->entitynum ); + Sys_FPrintf( SYS_WRN, "WARNING: areaportal entity %i doesn't touch two areas\n", b->original->entitynum ); return; } } diff --git a/tools/quake2/q2map/qvis.c b/tools/quake2/q2map/qvis.c index f3f86da6..ce1dd103 100644 --- a/tools/quake2/q2map/qvis.c +++ b/tools/quake2/q2map/qvis.c @@ -209,7 +209,7 @@ void ClusterMerge( int leafnum ){ numvis = LeafVectorFromPortalVector( portalvector, uncompressed ); if ( uncompressed[leafnum >> 3] & ( 1 << ( leafnum & 7 ) ) ) { - Sys_Printf( "WARNING: Leaf portals saw into leaf\n" ); + Sys_FPrintf( SYS_WRN, "WARNING: Leaf portals saw into leaf\n" ); } uncompressed[leafnum >> 3] |= ( 1 << ( leafnum & 7 ) ); diff --git a/tools/quake3/common/aselib.c b/tools/quake3/common/aselib.c index 50f970f6..ef1ecac0 100644 --- a/tools/quake3/common/aselib.c +++ b/tools/quake3/common/aselib.c @@ -472,7 +472,7 @@ static void ASE_KeyMAP_DIFFUSE( const char *token ){ else { sprintf( ase.materials[ase.numMaterials].name, "(not converted: '%s')", bitmap ); - Sys_Printf( "WARNING: illegal material name '%s'\n", bitmap ); + Sys_FPrintf( SYS_WRN, "WARNING: illegal material name '%s'\n", bitmap ); } } else From 41f9d3a1e1ee86cafd7bf8de09418702c9718405 Mon Sep 17 00:00:00 2001 From: Christophe Mateos Date: Sun, 4 Dec 2016 01:43:28 +0100 Subject: [PATCH 14/28] Ported picomodel.c from 1.5 Improvements over 1.4/1.5 are in. --- libs/picomodel.h | 4 + libs/picomodel/picointernal.c | 29 +- libs/picomodel/picointernal.h | 2 +- libs/picomodel/picomodel.c | 780 +++++++++++++++++++++++++--------- 4 files changed, 593 insertions(+), 222 deletions(-) diff --git a/libs/picomodel.h b/libs/picomodel.h index 98d5452f..181d428a 100644 --- a/libs/picomodel.h +++ b/libs/picomodel.h @@ -105,6 +105,7 @@ struct picoSurface_s int numVertexes, maxVertexes; picoVec3_t *xyz; picoVec3_t *normal; + picoIndex_t *smoothingGroup; int numSTArrays, maxSTArrays; picoVec2_t **st; @@ -216,6 +217,9 @@ const picoModule_t **PicoModuleList( int *numModules ); picoModel_t *PicoLoadModel( char *name, int frameNum ); +typedef size_t(*PicoInputStreamReadFunc)(void* inputStream, unsigned char* buffer, size_t length); +picoModel_t* PicoModuleLoadModelStream(const picoModule_t* module, void* inputStream, PicoInputStreamReadFunc inputStreamRead, size_t streamLength, int frameNum); + /* model functions */ picoModel_t *PicoNewModel( void ); diff --git a/libs/picomodel/picointernal.c b/libs/picomodel/picointernal.c index d4fd8b44..931e0281 100644 --- a/libs/picomodel/picointernal.c +++ b/libs/picomodel/picointernal.c @@ -161,35 +161,22 @@ void *_pico_realloc( void **ptr, size_t oldSize, size_t newSize ){ * as custom clone size (the string is cropped to fit into mem * if needed). -sea */ -char *_pico_clone_alloc( char *str, int size ){ - char *cloned; - size_t cloneSize; +char *_pico_clone_alloc(const char *str) +{ + char* cloned; /* sanity check */ - if ( str == NULL ) { + if (str == NULL) return NULL; - } - - /* set real size of cloned string */ - cloneSize = ( size < 0 ) ? strlen( str ) : size; /* allocate memory */ - cloned = _pico_alloc( cloneSize + 1 ); /* bugfix! */ - if ( cloned == NULL ) { + cloned = _pico_alloc(strlen(str) + 1); + if (cloned == NULL) return NULL; - } - - /* zero out memory allocated by cloned string */ - memset( cloned,0,cloneSize ); /* copy input string to cloned string */ - if ( cloneSize < strlen( str ) ) { - memcpy( cloned,str,cloneSize ); - cloned[ cloneSize ] = '\0'; - } - else { - strcpy( cloned,str ); - } + strcpy(cloned, str); + /* return ptr to cloned string */ return cloned; } diff --git a/libs/picomodel/picointernal.h b/libs/picomodel/picointernal.h index 12b8cd7c..4dd75cad 100644 --- a/libs/picomodel/picointernal.h +++ b/libs/picomodel/picointernal.h @@ -116,7 +116,7 @@ extern void ( *_pico_ptr_print )( int, const char* ); void *_pico_alloc( size_t size ); void *_pico_calloc( size_t num, size_t size ); void *_pico_realloc( void **ptr, size_t oldSize, size_t newSize ); -char *_pico_clone_alloc( char *str, int size ); +char *_pico_clone_alloc( char *str/*, int size*/ ); void _pico_free( void *ptr ); /* files */ diff --git a/libs/picomodel/picomodel.c b/libs/picomodel/picomodel.c index 767fc74f..656ddbf2 100644 --- a/libs/picomodel/picomodel.c +++ b/libs/picomodel/picomodel.c @@ -143,7 +143,46 @@ void PicoSetPrintFunc( void ( *func )( int, const char* ) ){ } } +picoModel_t *PicoModuleLoadModel( const picoModule_t* pm, char* fileName, picoByte_t* buffer, int bufSize, int frameNum ){ + char *modelFileName, *remapFileName; + /* see whether this module can load the model file or not */ + if ( pm->canload( fileName, buffer, bufSize ) == PICO_PMV_OK ) { + /* use loader provided by module to read the model data */ + picoModel_t* model = pm->load( fileName, frameNum, buffer, bufSize ); + if ( model == NULL ) { + _pico_free_file( buffer ); + return NULL; + } + + /* assign pointer to file format module */ + model->module = pm; + + /* get model file name */ + modelFileName = PicoGetModelFileName( model ); + + /* apply model remappings from .remap */ + if ( strlen( modelFileName ) ) { + /* alloc copy of model file name */ + remapFileName = _pico_alloc( strlen( modelFileName ) + 20 ); + if ( remapFileName != NULL ) { + /* copy model file name and change extension */ + strcpy( remapFileName, modelFileName ); + _pico_setfext( remapFileName, "remap" ); + + /* try to remap model; we don't handle the result */ + PicoRemapModel( model, remapFileName ); + + /* free the remap file name string */ + _pico_free( remapFileName ); + } + } + + return model; + } + + return NULL; +} /* PicoLoadModel() @@ -155,7 +194,6 @@ picoModel_t *PicoLoadModel( char *fileName, int frameNum ){ picoModel_t *model; picoByte_t *buffer; int bufSize; - char *modelFileName, *remapFileName; /* init */ @@ -194,38 +232,8 @@ picoModel_t *PicoLoadModel( char *fileName, int frameNum ){ continue; } - /* see whether this module can load the model file or not */ - if ( pm->canload( fileName, buffer, bufSize ) == PICO_PMV_OK ) { - /* use loader provided by module to read the model data */ - model = pm->load( fileName, frameNum, buffer, bufSize ); - if ( model == NULL ) { - _pico_free_file( buffer ); - return NULL; - } - - /* assign pointer to file format module */ - model->module = pm; - - /* get model file name */ - modelFileName = PicoGetModelFileName( model ); - - /* apply model remappings from .remap */ - if ( strlen( modelFileName ) ) { - /* alloc copy of model file name */ - remapFileName = _pico_alloc( strlen( modelFileName ) + 20 ); - if ( remapFileName != NULL ) { - /* copy model file name and change extension */ - strcpy( remapFileName, modelFileName ); - _pico_setfext( remapFileName, "remap" ); - - /* try to remap model; we don't handle the result */ - PicoRemapModel( model, remapFileName ); - - /* free the remap file name string */ - _pico_free( remapFileName ); - } - } - + model = PicoModuleLoadModel( pm, fileName, buffer, bufSize, frameNum ); + if ( model != NULL ) { /* model was loaded, so break out of loop */ break; } @@ -236,7 +244,53 @@ picoModel_t *PicoLoadModel( char *fileName, int frameNum ){ _pico_free_file( buffer ); } - /* return */ + return model; +} + +/* + FIXME: From 1.5; Unused yet +*/ + +picoModel_t *PicoModuleLoadModelStream( const picoModule_t* module, void* inputStream, PicoInputStreamReadFunc inputStreamRead, size_t streamLength, int frameNum ) +{ + picoModel_t *model; + picoByte_t *buffer; + int bufSize; + + /* init */ + model = NULL; + + if ( inputStream == NULL ) + { + _pico_printf( PICO_ERROR, "PicoLoadModel: invalid input stream (inputStream == NULL)" ); + return NULL; + } + + if ( inputStreamRead == NULL ) + { + _pico_printf( PICO_ERROR, "PicoLoadModel: invalid input stream (inputStreamRead == NULL) "); + return NULL; + } + + buffer = _pico_alloc( streamLength + 1 ); + + bufSize = (int)inputStreamRead( inputStream, buffer, streamLength ); + buffer[ bufSize ] = '\0'; + + { + // dummy filename + char fileName[128]; + fileName[0] = '.'; + strncpy( fileName + 1, module->defaultExts[ 0 ], 126 ); + fileName[127] = '\0'; + model = PicoModuleLoadModel( module, fileName, buffer, bufSize, frameNum ); + } + + /* free memory used by file buffer */ + if ( model != 0 ) { + _pico_free( buffer ); + } + return model; } @@ -261,10 +315,10 @@ picoModel_t *PicoNewModel( void ){ } /* clear */ - memset( model,0,sizeof( picoModel_t ) ); + memset( model, 0, sizeof( picoModel_t ) ); /* model set up */ - _pico_zero_bounds( model->mins,model->maxs ); + _pico_zero_bounds( model->mins, model->maxs ); /* set initial frame count to 1 -sea */ model->numFrames = 1; @@ -283,7 +337,6 @@ picoModel_t *PicoNewModel( void ){ void PicoFreeModel( picoModel_t *model ){ int i; - /* sanity check */ if ( model == NULL ) { return; @@ -294,6 +347,10 @@ void PicoFreeModel( picoModel_t *model ){ _pico_free( model->name ); } + if ( model->fileName ) { + _pico_free( model->fileName ); + } + /* free shaders */ for ( i = 0; i < model->numShaders; i++ ) PicoFreeShader( model->shader[ i ] ); @@ -397,9 +454,9 @@ picoShader_t *PicoNewShader( picoModel_t *model ){ shader->model = model; } /* setup default shader colors */ - _pico_set_color( shader->ambientColor,0,0,0,0 ); - _pico_set_color( shader->diffuseColor,255,255,255,1 ); - _pico_set_color( shader->specularColor,0,0,0,0 ); + _pico_set_color( shader->ambientColor, 0, 0, 0, 0 ); + _pico_set_color( shader->diffuseColor, 255, 255, 255, 1 ); + _pico_set_color( shader->specularColor, 0, 0, 0, 0 ); /* no need to do this, but i do it anyway */ shader->transparency = 0; @@ -444,7 +501,6 @@ void PicoFreeShader( picoShader_t *shader ){ picoShader_t *PicoFindShader( picoModel_t *model, char *name, int caseSensitive ){ int i; - /* sanity checks */ if ( model == NULL || name == NULL ) { /* sea: null name fix */ return NULL; @@ -535,9 +591,14 @@ void PicoFreeSurface( picoSurface_t *surface ){ /* free bits */ _pico_free( surface->xyz ); _pico_free( surface->normal ); + _pico_free( surface->smoothingGroup ); _pico_free( surface->index ); _pico_free( surface->faceNormal ); + if ( surface->name ) { + _pico_free( surface->name ); + } + /* free arrays */ for ( i = 0; i < surface->numSTArrays; i++ ) _pico_free( surface->st[ i ] ); @@ -591,6 +652,9 @@ int PicoAdjustSurface( picoSurface_t *surface, int numVertexes, int numSTArrays, if ( !_pico_realloc( (void *) &surface->normal, surface->numVertexes * sizeof( *surface->normal ), surface->maxVertexes * sizeof( *surface->normal ) ) ) { return 0; } + if ( !_pico_realloc( (void *) &surface->smoothingGroup, surface->numVertexes * sizeof( *surface->smoothingGroup ), surface->maxVertexes * sizeof( *surface->smoothingGroup ) ) ) { + return 0; + } for ( i = 0; i < surface->numSTArrays; i++ ) if ( !_pico_realloc( (void*) &surface->st[ i ], surface->numVertexes * sizeof( *surface->st[ i ] ), surface->maxVertexes * sizeof( *surface->st[ i ] ) ) ) { return 0; @@ -720,7 +784,7 @@ void PicoSetModelName( picoModel_t *model, char *name ){ _pico_free( model->name ); } - model->name = _pico_clone_alloc( name,-1 ); + model->name = _pico_clone_alloc( name/*,-1*/ ); } @@ -733,7 +797,7 @@ void PicoSetModelFileName( picoModel_t *model, char *fileName ){ _pico_free( model->fileName ); } - model->fileName = _pico_clone_alloc( fileName,-1 ); + model->fileName = _pico_clone_alloc( fileName/*,-1*/ ); } @@ -773,7 +837,7 @@ void PicoSetShaderName( picoShader_t *shader, char *name ){ _pico_free( shader->name ); } - shader->name = _pico_clone_alloc( name,-1 ); + shader->name = _pico_clone_alloc( name/*,-1*/ ); } @@ -786,7 +850,7 @@ void PicoSetShaderMapName( picoShader_t *shader, char *mapName ){ _pico_free( shader->mapName ); } - shader->mapName = _pico_clone_alloc( mapName,-1 ); + shader->mapName = _pico_clone_alloc( mapName/*,-1*/ ); } @@ -887,7 +951,7 @@ void PicoSetSurfaceName( picoSurface_t *surface, char *name ){ _pico_free( surface->name ); } - surface->name = _pico_clone_alloc( name,-1 ); + surface->name = _pico_clone_alloc( name/*,-1*/ ); } @@ -990,6 +1054,15 @@ void PicoSetFaceNormal( picoSurface_t *surface, int num, picoVec3_t normal ){ _pico_copy_vec( normal, surface->faceNormal[ num ] ); } +void PicoSetSurfaceSmoothingGroup( picoSurface_t *surface, int num, picoIndex_t smoothingGroup ){ + if ( num < 0 ) { + return; + } + if ( !PicoAdjustSurface( surface, num + 1, 0, 0, 0, 0 ) ) { + return; + } + surface->smoothingGroup[ num ] = smoothingGroup; +} void PicoSetSurfaceSpecial( picoSurface_t *surface, int num, int special ){ if ( surface == NULL || num < 0 || num >= PICO_MAX_SPECIAL ) { @@ -1284,7 +1357,7 @@ picoVec_t *PicoGetSurfaceNormal( picoSurface_t *surface, int num ){ -picoVec_t *PicoGetSurfaceST( picoSurface_t *surface, int array, int num ){ +picoVec_t *PicoGetSurfaceST( picoSurface_t *surface, int array, int num ){ if ( surface == NULL || array < 0 || array > surface->numSTArrays || num < 0 || num > surface->numVertexes ) { return NULL; } @@ -1335,6 +1408,12 @@ picoVec_t *PicoGetFaceNormal( picoSurface_t *surface, int num ){ return surface->faceNormal[ num ]; } +picoIndex_t PicoGetSurfaceSmoothingGroup( picoSurface_t *surface, int num ){ + if ( surface == NULL || num < 0 || num > surface->numVertexes ) { + return -1; + } + return surface->smoothingGroup[ num ]; +} int PicoGetSurfaceSpecial( picoSurface_t *surface, int num ){ if ( surface == NULL || num < 0 || num >= PICO_MAX_SPECIAL ) { @@ -1535,7 +1614,7 @@ picoVertexCombinationHash_t *PicoAddVertexCombinationToHashTable( picoVertexComb fixme: needs non-naive algorithm */ -int PicoFindSurfaceVertexNum( picoSurface_t *surface, picoVec3_t xyz, picoVec3_t normal, int numSTs, picoVec2_t *st, int numColors, picoColor_t *color ){ +int PicoFindSurfaceVertexNum( picoSurface_t *surface, picoVec3_t xyz, picoVec3_t normal, int numSTs, picoVec2_t *st, int numColors, picoColor_t *color, picoIndex_t smoothingGroup ){ int i, j; @@ -1557,6 +1636,11 @@ int PicoFindSurfaceVertexNum( picoSurface_t *surface, picoVec3_t xyz, picoVec3_t continue; } + /* check normal */ + if ( surface->smoothingGroup[ i ] != smoothingGroup ) { + continue; + } + /* check st */ if ( numSTs > 0 && st != NULL ) { for ( j = 0; j < numSTs; j++ ) @@ -1598,125 +1682,419 @@ int PicoFindSurfaceVertexNum( picoSurface_t *surface, picoVec3_t xyz, picoVec3_t fixes broken normals (certain formats bork normals) */ -#define MAX_NORMAL_VOTES 128 -#define EQUAL_NORMAL_EPSILON 0.01 -#define BAD_NORMAL_EPSILON 0.5 +//#define MAX_NORMAL_VOTES 128 +//#define EQUAL_NORMAL_EPSILON 0.01 +//#define BAD_NORMAL_EPSILON 0.5 +// +//void PicoFixSurfaceNormals( picoSurface_t *surface ){ +// int i, j, k, a, b, c, numVotes, faceIndex; +// picoVec3_t votes[ MAX_NORMAL_VOTES ]; +// picoVec3_t *normals, diff; +// picoVec4_t plane; +// +// +// /* dummy check */ +// if ( surface == NULL || surface->numVertexes == 0 ) { +// return; +// } +// +// /* fixme: handle other surface types */ +// if ( surface->type != PICO_TRIANGLES ) { +// return; +// } +// +// /* allocate normal storage */ +// normals = _pico_alloc( surface->numVertexes * sizeof( *normals ) ); +// if ( normals == NULL ) { +// _pico_printf( PICO_ERROR, "PicoFixSurfaceNormals: Unable to allocate memory for temporary normal storage" ); +// return; +// } +// +// /* zero it out */ +// memset( normals, 0, surface->numVertexes * sizeof( *normals ) ); +// +// /* walk vertex list */ +// for ( i = 0; i < surface->numVertexes; i++ ) +// { +// /* zero out votes */ +// numVotes = 0; +// +// /* find all the triangles that reference this vertex */ +// for ( j = 0, faceIndex = 0; j < surface->numIndexes; j += 3, faceIndex++ ) +// { +// /* get triangle */ +// a = surface->index[ j ]; +// b = surface->index[ j + 1 ]; +// c = surface->index[ j + 2 ]; +// +// /* ignore degenerate triangles */ +// if ( a == b || b == c || c == a ) { +// continue; +// } +// +// /* ignore indexes out of range */ +// if ( a < 0 || a >= surface->numVertexes || +// b < 0 || b >= surface->numVertexes || +// c < 0 || c >= surface->numVertexes ) { +// continue; +// } +// +// /* test triangle */ +// if ( a == i || b == i || c == i ) { +// /* if this surface has face normals */ +// if ( surface->numFaceNormals && faceIndex < surface->numFaceNormals ) { +// _pico_copy_vec( surface->faceNormal[ faceIndex ], plane ); +// if ( plane[ 0 ] == 0.f && plane[ 1 ] == 0.f && plane[ 2 ] == 0.f ) { +// /* if null normal, make plane from the 3 points */ +// if ( _pico_calc_plane( plane, surface->xyz[ a ], surface->xyz[ b ], surface->xyz[ c ] ) == 0 ) { +// continue; +// } +// } +// } +// /* make a plane from the 3 points */ +// else if ( _pico_calc_plane( plane, surface->xyz[ a ], surface->xyz[ b ], surface->xyz[ c ] ) == 0 ) { +// continue; +// } +// +// /* see if this normal has already been voted */ +// for ( k = 0; k < numVotes; k++ ) +// { +// _pico_subtract_vec( plane, votes[ k ], diff ); +// if ( fabs( diff[ 0 ] ) < EQUAL_NORMAL_EPSILON && +// fabs( diff[ 1 ] ) < EQUAL_NORMAL_EPSILON && +// fabs( diff[ 2 ] ) < EQUAL_NORMAL_EPSILON ) { +// break; +// } +// } +// +// /* add a new vote? */ +// if ( k == numVotes && numVotes < MAX_NORMAL_VOTES ) { +// _pico_copy_vec( plane, votes[ numVotes ] ); +// numVotes++; +// } +// } +// } +// +// /* tally votes */ +// if ( numVotes > 0 ) { +// /* create average normal */ +// _pico_zero_vec( normals[ i ] ); +// for ( k = 0; k < numVotes; k++ ) +// _pico_add_vec( normals[ i ], votes[ k ], normals[ i ] ); +// +// /* normalize it */ +// if ( _pico_normalize_vec( normals[ i ] ) ) { +// /* test against actual normal */ +// if ( fabs( _pico_dot_vec( normals[ i ], surface->normal[ i ] ) - 1 ) > BAD_NORMAL_EPSILON ) { +// //% printf( "Normal %8d: (%f %f %f) -> (%f %f %f)\n", i, +// //% surface->normal[ i ][ 0 ], surface->normal[ i ][ 1 ], surface->normal[ i ][ 2 ], +// //% normals[ i ][ 0 ], normals[ i ][ 1 ], normals[ i ][ 2 ] ); +// _pico_copy_vec( normals[ i ], surface->normal[ i ] ); +// } +// } +// } +// } +// +// /* free normal storage */ +// _pico_free( normals ); +//} -void PicoFixSurfaceNormals( picoSurface_t *surface ){ - int i, j, k, a, b, c, numVotes, faceIndex; - picoVec3_t votes[ MAX_NORMAL_VOTES ]; - picoVec3_t *normals, diff; - picoVec4_t plane; +typedef struct _IndexArray IndexArray; +struct _IndexArray +{ + picoIndex_t* data; + picoIndex_t* last; +}; - - /* dummy check */ - if ( surface == NULL || surface->numVertexes == 0 ) { - return; - } - - /* fixme: handle other surface types */ - if ( surface->type != PICO_TRIANGLES ) { - return; - } - - /* allocate normal storage */ - normals = _pico_alloc( surface->numVertexes * sizeof( *normals ) ); - if ( normals == NULL ) { - _pico_printf( PICO_ERROR, "PicoFixSurfaceNormals: Unable to allocate memory for temporary normal storage" ); - return; - } - - /* zero it out */ - memset( normals, 0, surface->numVertexes * sizeof( *normals ) ); - - /* walk vertex list */ - for ( i = 0; i < surface->numVertexes; i++ ) - { - /* zero out votes */ - numVotes = 0; - - /* find all the triangles that reference this vertex */ - for ( j = 0, faceIndex = 0; j < surface->numIndexes; j += 3, faceIndex++ ) - { - /* get triangle */ - a = surface->index[ j ]; - b = surface->index[ j + 1 ]; - c = surface->index[ j + 2 ]; - - /* ignore degenerate triangles */ - if ( a == b || b == c || c == a ) { - continue; - } - - /* ignore indexes out of range */ - if ( a < 0 || a >= surface->numVertexes || - b < 0 || b >= surface->numVertexes || - c < 0 || c >= surface->numVertexes ) { - continue; - } - - /* test triangle */ - if ( a == i || b == i || c == i ) { - /* if this surface has face normals */ - if ( surface->numFaceNormals && faceIndex < surface->numFaceNormals ) { - _pico_copy_vec( surface->faceNormal[ faceIndex ], plane ); - if ( plane[ 0 ] == 0.f && plane[ 1 ] == 0.f && plane[ 2 ] == 0.f ) { - /* if null normal, make plane from the 3 points */ - if ( _pico_calc_plane( plane, surface->xyz[ a ], surface->xyz[ b ], surface->xyz[ c ] ) == 0 ) { - continue; - } - } - } - /* make a plane from the 3 points */ - else if ( _pico_calc_plane( plane, surface->xyz[ a ], surface->xyz[ b ], surface->xyz[ c ] ) == 0 ) { - continue; - } - - /* see if this normal has already been voted */ - for ( k = 0; k < numVotes; k++ ) - { - _pico_subtract_vec( plane, votes[ k ], diff ); - if ( fabs( diff[ 0 ] ) < EQUAL_NORMAL_EPSILON && - fabs( diff[ 1 ] ) < EQUAL_NORMAL_EPSILON && - fabs( diff[ 2 ] ) < EQUAL_NORMAL_EPSILON ) { - break; - } - } - - /* add a new vote? */ - if ( k == numVotes && numVotes < MAX_NORMAL_VOTES ) { - _pico_copy_vec( plane, votes[ numVotes ] ); - numVotes++; - } - } - } - - /* tally votes */ - if ( numVotes > 0 ) { - /* create average normal */ - _pico_zero_vec( normals[ i ] ); - for ( k = 0; k < numVotes; k++ ) - _pico_add_vec( normals[ i ], votes[ k ], normals[ i ] ); - - /* normalize it */ - if ( _pico_normalize_vec( normals[ i ] ) ) { - /* test against actual normal */ - if ( fabs( _pico_dot_vec( normals[ i ], surface->normal[ i ] ) - 1 ) > BAD_NORMAL_EPSILON ) { - //% printf( "Normal %8d: (%f %f %f) -> (%f %f %f)\n", i, - //% surface->normal[ i ][ 0 ], surface->normal[ i ][ 1 ], surface->normal[ i ][ 2 ], - //% normals[ i ][ 0 ], normals[ i ][ 1 ], normals[ i ][ 2 ] ); - _pico_copy_vec( normals[ i ], surface->normal[ i ] ); - } - } - } - } - - /* free normal storage */ - _pico_free( normals ); +void indexarray_push_back(IndexArray* self, picoIndex_t value) { + *self->last++ = value; } +size_t indexarray_size(IndexArray* self) { + return self->last - self->data; +} +void indexarray_reserve(IndexArray* self, size_t size) { + self->data = self->last = _pico_calloc(size, sizeof(picoIndex_t)); +} +void indexarray_clear(IndexArray* self) { + _pico_free(self->data); +} + +typedef struct _BinaryTreeNode BinaryTreeNode; +struct _BinaryTreeNode +{ + picoIndex_t left; + picoIndex_t right; +}; + +typedef struct _BinaryTree BinaryTree; +struct _BinaryTree +{ + BinaryTreeNode* data; + BinaryTreeNode* last; +}; + +void binarytree_extend(BinaryTree* self) { + self->last->left = 0; + self->last->right = 0; + ++self->last; +} + +size_t binarytree_size(BinaryTree* self) { + return self->last - self->data; +} + +void binarytree_reserve(BinaryTree* self, size_t size) { + self->data = self->last = _pico_calloc(size, sizeof(BinaryTreeNode)); +} + +void binarytree_clear(BinaryTree* self) { + _pico_free(self->data); +} + +typedef int(*LessFunc)(void*, picoIndex_t, picoIndex_t); + +typedef struct _UniqueIndices UniqueIndices; +struct _UniqueIndices +{ + BinaryTree tree; + IndexArray indices; + LessFunc lessFunc; + void* lessData; +}; + +size_t UniqueIndices_size(UniqueIndices* self) { + return binarytree_size(&self->tree); +} + +void UniqueIndices_reserve(UniqueIndices* self, size_t size) { + binarytree_reserve(&self->tree, size); + indexarray_reserve(&self->indices, size); +} + +void UniqueIndices_init(UniqueIndices* self, LessFunc lessFunc, void* lessData) { + self->lessFunc = lessFunc; + self->lessData = lessData; +} + +void UniqueIndices_destroy(UniqueIndices* self) { + binarytree_clear(&self->tree); + indexarray_clear(&self->indices); +} + +picoIndex_t UniqueIndices_find_or_insert(UniqueIndices* self, picoIndex_t value) { + picoIndex_t index = 0; + + for (;; ) + { + if (self->lessFunc(self->lessData, value, self->indices.data[index])) { + BinaryTreeNode* node = self->tree.data + index; + if (node->left != 0) { + index = node->left; + continue; + } + else + { + node->left = (picoIndex_t)binarytree_size(&self->tree); + binarytree_extend(&self->tree); + indexarray_push_back(&self->indices, value); + return node->left; + } + } + if (self->lessFunc(self->lessData, self->indices.data[index], value)) { + BinaryTreeNode* node = self->tree.data + index; + if (node->right != 0) { + index = node->right; + continue; + } + else + { + node->right = (picoIndex_t)binarytree_size(&self->tree); + binarytree_extend(&self->tree); + indexarray_push_back(&self->indices, value); + return node->right; + } + } + + return index; + } +} + +picoIndex_t UniqueIndices_insert(UniqueIndices* self, picoIndex_t value) { + if (self->tree.data == self->tree.last) { + binarytree_extend(&self->tree); + indexarray_push_back(&self->indices, value); + return 0; + } + else + { + return UniqueIndices_find_or_insert(self, value); + } +} + +typedef struct picoSmoothVertices_s picoSmoothVertices_t; +struct picoSmoothVertices_s +{ + picoVec3_t* xyz; + picoIndex_t* smoothingGroups; +}; + +int lessSmoothVertex(void* data, picoIndex_t first, picoIndex_t second) { + picoSmoothVertices_t* smoothVertices = data; + + if (smoothVertices->xyz[first][0] != smoothVertices->xyz[second][0]) { + return smoothVertices->xyz[first][0] < smoothVertices->xyz[second][0]; + } + if (smoothVertices->xyz[first][1] != smoothVertices->xyz[second][1]) { + return smoothVertices->xyz[first][1] < smoothVertices->xyz[second][1]; + } + if (smoothVertices->xyz[first][2] != smoothVertices->xyz[second][2]) { + return smoothVertices->xyz[first][2] < smoothVertices->xyz[second][2]; + } + if (smoothVertices->smoothingGroups[first] != smoothVertices->smoothingGroups[second]) { + return smoothVertices->smoothingGroups[first] < smoothVertices->smoothingGroups[second]; + } + return 0; +} + +void _pico_vertices_combine_shared_normals(picoVec3_t* xyz, picoIndex_t* smoothingGroups, picoVec3_t* normals, picoIndex_t numVertices) { + UniqueIndices vertices; + IndexArray indices; + picoSmoothVertices_t smoothVertices = { xyz, smoothingGroups }; + UniqueIndices_init(&vertices, lessSmoothVertex, &smoothVertices); + UniqueIndices_reserve(&vertices, numVertices); + indexarray_reserve(&indices, numVertices); + + { + picoIndex_t i = 0; + for (; i < numVertices; ++i) + { + size_t size = UniqueIndices_size(&vertices); + picoIndex_t index = UniqueIndices_insert(&vertices, i); + if ((size_t)index != size) { + float* normal = normals[vertices.indices.data[index]]; + _pico_add_vec(normal, normals[i], normal); + } + indexarray_push_back(&indices, index); + } + } + + { + picoIndex_t maxIndex = 0; + picoIndex_t* i = indices.data; + for (; i != indices.last; ++i) + { + if (*i <= maxIndex) { + _pico_copy_vec(normals[vertices.indices.data[*i]], normals[i - indices.data]); + } + else + { + maxIndex = *i; + } + } + } + + UniqueIndices_destroy(&vertices); + indexarray_clear(&indices); +} + +typedef picoVec3_t* picoNormalIter_t; +typedef picoIndex_t* picoIndexIter_t; + +#define THE_CROSSPRODUCTS_OF_ANY_PAIR_OF_EDGES_OF_A_GIVEN_TRIANGLE_ARE_EQUAL 1 + +void _pico_triangles_generate_weighted_normals(picoIndexIter_t first, picoIndexIter_t end, picoVec3_t* xyz, picoVec3_t* normals) { + for (; first != end; first += 3) + { +#if (THE_CROSSPRODUCTS_OF_ANY_PAIR_OF_EDGES_OF_A_GIVEN_TRIANGLE_ARE_EQUAL) + picoVec3_t weightedNormal; + { + float* a = xyz[*(first + 0)]; + float* b = xyz[*(first + 1)]; + float* c = xyz[*(first + 2)]; + picoVec3_t ba, ca; + _pico_subtract_vec(b, a, ba); + _pico_subtract_vec(c, a, ca); + _pico_cross_vec(ca, ba, weightedNormal); + } +#endif + { + int j = 0; + for (; j < 3; ++j) + { + float* normal = normals[*(first + j)]; +#if ( !THE_CROSSPRODUCTS_OF_ANY_PAIR_OF_EDGES_OF_A_GIVEN_TRIANGLE_ARE_EQUAL ) + picoVec3_t weightedNormal; + { + float* a = xyz[*(first + ((j + 0) % 3))]; + float* b = xyz[*(first + ((j + 1) % 3))]; + float* c = xyz[*(first + ((j + 2) % 3))]; + picoVec3_t ba, ca; + _pico_subtract_vec(b, a, ba); + _pico_subtract_vec(c, a, ca); + _pico_cross_vec(ca, ba, weightedNormal); + } +#endif + _pico_add_vec(weightedNormal, normal, normal); + } + } + } +} + +void _pico_normals_zero(picoNormalIter_t first, picoNormalIter_t last) { + for (; first != last; ++first) + { + _pico_zero_vec(*first); + } +} + +void _pico_normals_normalize(picoNormalIter_t first, picoNormalIter_t last) { + for (; first != last; ++first) + { + _pico_normalize_vec(*first); + } +} + +double _pico_length_vec(picoVec3_t vec) { + return sqrt(vec[0] * vec[0] + vec[1] * vec[1] + vec[2] * vec[2]); +} + +#define NORMAL_UNIT_LENGTH_EPSILON 0.01 +#define FLOAT_EQUAL_EPSILON( f, other, epsilon ) ( fabs( f - other ) < epsilon ) + +int _pico_normal_is_unit_length(picoVec3_t normal) { + return FLOAT_EQUAL_EPSILON(_pico_length_vec(normal), 1.0, NORMAL_UNIT_LENGTH_EPSILON); +} + +int _pico_normal_within_tolerance(picoVec3_t normal, picoVec3_t other) { + return _pico_dot_vec(normal, other) > 0.0f; +} + +void _pico_normals_assign_generated_normals(picoNormalIter_t first, picoNormalIter_t last, picoNormalIter_t generated) { + for (; first != last; ++first, ++generated) + { + if (!_pico_normal_is_unit_length(*first) || !_pico_normal_within_tolerance(*first, *generated)) { + _pico_copy_vec(*generated, *first); + } + } +} + +void PicoFixSurfaceNormals(picoSurface_t* surface) { + picoVec3_t* normals = (picoVec3_t*)_pico_calloc(surface->numVertexes, sizeof(picoVec3_t)); + + _pico_normals_zero(normals, normals + surface->numVertexes); + + _pico_triangles_generate_weighted_normals(surface->index, surface->index + surface->numIndexes, surface->xyz, normals); + _pico_vertices_combine_shared_normals(surface->xyz, surface->smoothingGroup, normals, surface->numVertexes); + + _pico_normals_normalize(normals, normals + surface->numVertexes); + + _pico_normals_assign_generated_normals(surface->normal, surface->normal + surface->numVertexes, normals); + + _pico_free(normals); +} /* PicoRemapModel() - sea @@ -1727,8 +2105,8 @@ void PicoFixSurfaceNormals( picoSurface_t *surface ){ #define _prm_error_return \ { \ - _pico_free_parser( p ); \ - _pico_free_file( remapBuffer ); \ + _pico_free_parser( p ); \ + _pico_free_file( remapBuffer ); \ return 0; \ } @@ -1744,7 +2122,7 @@ int PicoRemapModel( picoModel_t *model, char *remapFile ){ } /* load remap file contents */ - _pico_load_file( remapFile,&remapBuffer,&remapBufSize ); + _pico_load_file( remapFile, &remapBuffer, &remapBufSize ); /* check result */ if ( remapBufSize == 0 ) { @@ -1765,12 +2143,12 @@ int PicoRemapModel( picoModel_t *model, char *remapFile ){ while ( 1 ) { /* get next token in remap file */ - if ( !_pico_parse( p,1 ) ) { + if ( !_pico_parse( p, 1 ) ) { break; } /* skip over c++ style comment lines */ - if ( !_pico_stricmp( p->token,"//" ) ) { + if ( !_pico_stricmp( p->token, "//" ) ) { _pico_parse_skip_rest( p ); continue; } @@ -1781,7 +2159,7 @@ int PicoRemapModel( picoModel_t *model, char *remapFile ){ int level = 1; /* check bracket */ - if ( !_pico_parse_check( p,1,"{" ) ) { + if ( !_pico_parse_check( p, 1, "{" ) ) { _prm_error_return; } @@ -1793,13 +2171,13 @@ int PicoRemapModel( picoModel_t *model, char *remapFile ){ /* get material name */ - if ( _pico_parse( p,1 ) == NULL ) { + if ( _pico_parse( p, 1 ) == NULL ) { break; } if ( !strlen( p->token ) ) { continue; } - materialName = _pico_clone_alloc( p->token,-1 ); + materialName = _pico_clone_alloc( p->token/*,-1*/ ); if ( materialName == NULL ) { _prm_error_return; } @@ -1816,26 +2194,26 @@ int PicoRemapModel( picoModel_t *model, char *remapFile ){ } /* get next token (assignment token or shader name) */ - if ( !_pico_parse( p,0 ) ) { + if ( !_pico_parse( p, 0 ) ) { _pico_free( materialName ); _prm_error_return; } /* skip assignment token (if present) */ - if ( !strcmp( p->token,"=>" ) || - !strcmp( p->token,"->" ) || - !strcmp( p->token,"=" ) ) { + if ( !strcmp( p->token, "=>" ) || + !strcmp( p->token, "->" ) || + !strcmp( p->token, "=" ) ) { /* simply grab the next token */ - if ( !_pico_parse( p,0 ) ) { + if ( !_pico_parse( p, 0 ) ) { _pico_free( materialName ); _prm_error_return; } } /* try to find material by name */ - shader = PicoFindShader( model,materialName,0 ); + shader = PicoFindShader( model, materialName, 0 ); /* we've found a material matching the name */ if ( shader != NULL ) { - PicoSetShaderName( shader,p->token ); + PicoSetShaderName( shader, p->token ); } /* free memory used by material name */ _pico_free( materialName ); @@ -1846,29 +2224,29 @@ int PicoRemapModel( picoModel_t *model, char *remapFile ){ } /* block for detailed single material remappings */ /* materials[ "m" ] { key data... } */ - else if ( !_pico_stricmp( p->token,"materials[" ) ) { + else if ( !_pico_stricmp( p->token, "materials[" ) ) { picoShader_t *shader; char *tempMaterialName; int level = 1; /* get material name */ - if ( !_pico_parse( p,0 ) ) { + if ( !_pico_parse( p, 0 ) ) { _prm_error_return; } /* temporary copy of material name */ - tempMaterialName = _pico_clone_alloc( p->token,-1 ); + tempMaterialName = _pico_clone_alloc( p->token/*,-1*/ ); if ( tempMaterialName == NULL ) { _prm_error_return; } /* check square closing bracket */ - if ( !_pico_parse_check( p,0,"]" ) ) { + if ( !_pico_parse_check( p, 0, "]" ) ) { _prm_error_return; } /* try to find material by name */ - shader = PicoFindShader( model,tempMaterialName,0 ); + shader = PicoFindShader( model, tempMaterialName, 0 ); /* free memory used by temporary material name */ _pico_free( tempMaterialName ); @@ -1881,7 +2259,7 @@ int PicoRemapModel( picoModel_t *model, char *remapFile ){ continue; } /* check opening bracket */ - if ( !_pico_parse_check( p,1,"{" ) ) { + if ( !_pico_parse_check( p, 1, "{" ) ) { _prm_error_return; } @@ -1889,7 +2267,7 @@ int PicoRemapModel( picoModel_t *model, char *remapFile ){ while ( 1 ) { /* get key name */ - if ( _pico_parse( p,1 ) == NULL ) { + if ( _pico_parse( p, 1 ) == NULL ) { break; } if ( !strlen( p->token ) ) { @@ -1908,26 +2286,26 @@ int PicoRemapModel( picoModel_t *model, char *remapFile ){ } /* remap shader name */ - if ( !_pico_stricmp( p->token,"shader" ) ) { - if ( !_pico_parse( p,0 ) ) { + if ( !_pico_stricmp( p->token, "shader" ) ) { + if ( !_pico_parse( p, 0 ) ) { _prm_error_return; } - PicoSetShaderName( shader,p->token ); + PicoSetShaderName( shader, p->token ); } /* remap shader map name */ - else if ( !_pico_stricmp( p->token,"mapname" ) ) { - if ( !_pico_parse( p,0 ) ) { + else if ( !_pico_stricmp( p->token, "mapname" ) ) { + if ( !_pico_parse( p, 0 ) ) { _prm_error_return; } - PicoSetShaderMapName( shader,p->token ); + PicoSetShaderMapName( shader, p->token ); } /* remap shader's ambient color */ - else if ( !_pico_stricmp( p->token,"ambient" ) ) { + else if ( !_pico_stricmp( p->token, "ambient" ) ) { picoColor_t color; picoVec3_t v; /* get vector from parser */ - if ( !_pico_parse_vec( p,v ) ) { + if ( !_pico_parse_vec( p, v ) ) { _prm_error_return; } @@ -1938,15 +2316,15 @@ int PicoRemapModel( picoModel_t *model, char *remapFile ){ color[ 3 ] = 1; /* set new ambient color */ - PicoSetShaderAmbientColor( shader,color ); + PicoSetShaderAmbientColor( shader, color ); } /* remap shader's diffuse color */ - else if ( !_pico_stricmp( p->token,"diffuse" ) ) { + else if ( !_pico_stricmp( p->token, "diffuse" ) ) { picoColor_t color; picoVec3_t v; /* get vector from parser */ - if ( !_pico_parse_vec( p,v ) ) { + if ( !_pico_parse_vec( p, v ) ) { _prm_error_return; } @@ -1957,10 +2335,10 @@ int PicoRemapModel( picoModel_t *model, char *remapFile ){ color[ 3 ] = 1; /* set new ambient color */ - PicoSetShaderDiffuseColor( shader,color ); + PicoSetShaderDiffuseColor( shader, color ); } /* remap shader's specular color */ - else if ( !_pico_stricmp( p->token,"specular" ) ) { + else if ( !_pico_stricmp( p->token, "specular" ) ) { picoColor_t color; picoVec3_t v; @@ -1976,7 +2354,7 @@ int PicoRemapModel( picoModel_t *model, char *remapFile ){ color[ 3 ] = 1; /* set new ambient color */ - PicoSetShaderSpecularColor( shader,color ); + PicoSetShaderSpecularColor( shader, color ); } /* skip rest */ _pico_parse_skip_rest( p ); @@ -2002,8 +2380,8 @@ int PicoRemapModel( picoModel_t *model, char *remapFile ){ void PicoAddTriangleToModel( picoModel_t *model, picoVec3_t** xyz, picoVec3_t** normals, int numSTs, picoVec2_t **st, int numColors, picoColor_t **colors, - picoShader_t* shader ){ - int i,j; + picoShader_t* shader, picoIndex_t* smoothingGroup ){ + int i, j; int vertDataIndex; picoSurface_t* workSurface = NULL; @@ -2038,7 +2416,7 @@ void PicoAddTriangleToModel( picoModel_t *model, picoVec3_t** xyz, picoVec3_t** int newVertIndex = PicoGetSurfaceNumIndexes( workSurface ); /* get the index of the vertex that we're going to store at newVertIndex */ - vertDataIndex = PicoFindSurfaceVertexNum( workSurface, *xyz[i], *normals[i], numSTs, st[i], numColors, colors[i] ); + vertDataIndex = PicoFindSurfaceVertexNum( workSurface, *xyz[i], *normals[i], numSTs, st[i], numColors, colors[i], smoothingGroup[i] ); /* the vertex wasn't found, so create a new vertex in the pool from the data we have */ if ( vertDataIndex == -1 ) { @@ -2058,6 +2436,8 @@ void PicoAddTriangleToModel( picoModel_t *model, picoVec3_t** xyz, picoVec3_t** { PicoSetSurfaceST( workSurface, j, vertDataIndex, st[i][j] ); } + + PicoSetSurfaceSmoothingGroup( workSurface, vertDataIndex, smoothingGroup[ i ] ); } /* add this vertex to the triangle */ From 054cfcd15c57e1473429c2e1b074b05318852e1f Mon Sep 17 00:00:00 2001 From: Christophe Mateos Date: Sun, 4 Dec 2016 06:16:39 +0100 Subject: [PATCH 15/28] PicoModel: Cleanup, ASE support upgrade test, uncrustify Next to be tested is MD3... --- libs/picomodel.h | 4 +- libs/picomodel/picointernal.c | 13 + libs/picomodel/picointernal.h | 3 +- libs/picomodel/picomodel.c | 14 +- libs/picomodel/pm_ase.c | 483 +++++++++++++++++++--------------- libs/picomodel/pm_obj.c | 2 +- 6 files changed, 293 insertions(+), 226 deletions(-) diff --git a/libs/picomodel.h b/libs/picomodel.h index 181d428a..f33c6da6 100644 --- a/libs/picomodel.h +++ b/libs/picomodel.h @@ -334,12 +334,12 @@ picoVertexCombinationHash_t *PicoFindVertexCombinationInHashTable( picoVertexCom picoVertexCombinationHash_t *PicoAddVertexCombinationToHashTable( picoVertexCombinationHash_t **hashTable, picoVec3_t xyz, picoVec3_t normal, picoVec3_t st, picoColor_t color, picoIndex_t index ); /* specialized functions */ -int PicoFindSurfaceVertexNum( picoSurface_t *surface, picoVec3_t xyz, picoVec3_t normal, int numSTs, picoVec2_t *st, int numColors, picoColor_t *color ); +int PicoFindSurfaceVertexNum( picoSurface_t *surface, picoVec3_t xyz, picoVec3_t normal, int numSTs, picoVec2_t *st, int numColors, picoColor_t *color, picoIndex_t smoothingGroup ); void PicoFixSurfaceNormals( picoSurface_t *surface ); int PicoRemapModel( picoModel_t *model, char *remapFile ); -void PicoAddTriangleToModel( picoModel_t *model, picoVec3_t** xyz, picoVec3_t** normals, int numSTs, picoVec2_t **st, int numColors, picoColor_t **colors, picoShader_t* shader ); +void PicoAddTriangleToModel( picoModel_t *model, picoVec3_t** xyz, picoVec3_t** normals, int numSTs, picoVec2_t **st, int numColors, picoColor_t **colors, picoShader_t* shader, picoIndex_t* smoothingGroup ); /* end marker */ #ifdef __cplusplus diff --git a/libs/picomodel/picointernal.c b/libs/picomodel/picointernal.c index 931e0281..e98b4531 100644 --- a/libs/picomodel/picointernal.c +++ b/libs/picomodel/picointernal.c @@ -262,6 +262,19 @@ void _pico_printf( int level, const char *format, ... ){ _pico_ptr_print( level,str ); } +/* _pico_first_token: +* trims everything after the first whitespace-delimited token +*/ + +void _pico_first_token(char *str) +{ + if (!str || !*str) + return; + while (*str && !isspace(*str)) + *str++; + *str = '\0'; +} + /* _pico_strltrim: * left trims the given string -sea */ diff --git a/libs/picomodel/picointernal.h b/libs/picomodel/picointernal.h index 4dd75cad..8e9bba25 100644 --- a/libs/picomodel/picointernal.h +++ b/libs/picomodel/picointernal.h @@ -116,7 +116,7 @@ extern void ( *_pico_ptr_print )( int, const char* ); void *_pico_alloc( size_t size ); void *_pico_calloc( size_t num, size_t size ); void *_pico_realloc( void **ptr, size_t oldSize, size_t newSize ); -char *_pico_clone_alloc( char *str/*, int size*/ ); +char *_pico_clone_alloc( const char *str ); void _pico_free( void *ptr ); /* files */ @@ -124,6 +124,7 @@ void _pico_load_file( char *name, unsigned char **buffer, int *bufSiz void _pico_free_file( void *buffer ); /* strings */ +void _pico_first_token(char *str); char *_pico_strltrim( char *str ); char *_pico_strrtrim( char *str ); int _pico_strchcount( char *str, int ch ); diff --git a/libs/picomodel/picomodel.c b/libs/picomodel/picomodel.c index 656ddbf2..29e810a5 100644 --- a/libs/picomodel/picomodel.c +++ b/libs/picomodel/picomodel.c @@ -784,7 +784,7 @@ void PicoSetModelName( picoModel_t *model, char *name ){ _pico_free( model->name ); } - model->name = _pico_clone_alloc( name/*,-1*/ ); + model->name = _pico_clone_alloc( name ); } @@ -797,7 +797,7 @@ void PicoSetModelFileName( picoModel_t *model, char *fileName ){ _pico_free( model->fileName ); } - model->fileName = _pico_clone_alloc( fileName/*,-1*/ ); + model->fileName = _pico_clone_alloc( fileName ); } @@ -837,7 +837,7 @@ void PicoSetShaderName( picoShader_t *shader, char *name ){ _pico_free( shader->name ); } - shader->name = _pico_clone_alloc( name/*,-1*/ ); + shader->name = _pico_clone_alloc( name ); } @@ -850,7 +850,7 @@ void PicoSetShaderMapName( picoShader_t *shader, char *mapName ){ _pico_free( shader->mapName ); } - shader->mapName = _pico_clone_alloc( mapName/*,-1*/ ); + shader->mapName = _pico_clone_alloc( mapName ); } @@ -951,7 +951,7 @@ void PicoSetSurfaceName( picoSurface_t *surface, char *name ){ _pico_free( surface->name ); } - surface->name = _pico_clone_alloc( name/*,-1*/ ); + surface->name = _pico_clone_alloc( name ); } @@ -2177,7 +2177,7 @@ int PicoRemapModel( picoModel_t *model, char *remapFile ){ if ( !strlen( p->token ) ) { continue; } - materialName = _pico_clone_alloc( p->token/*,-1*/ ); + materialName = _pico_clone_alloc( p->token ); if ( materialName == NULL ) { _prm_error_return; } @@ -2235,7 +2235,7 @@ int PicoRemapModel( picoModel_t *model, char *remapFile ){ } /* temporary copy of material name */ - tempMaterialName = _pico_clone_alloc( p->token/*,-1*/ ); + tempMaterialName = _pico_clone_alloc( p->token ); if ( tempMaterialName == NULL ) { _prm_error_return; } diff --git a/libs/picomodel/pm_ase.c b/libs/picomodel/pm_ase.c index dc31dd5f..194f7381 100644 --- a/libs/picomodel/pm_ase.c +++ b/libs/picomodel/pm_ase.c @@ -105,6 +105,25 @@ static aseSubMaterial_t* _ase_get_submaterial( aseMaterial_t* list, int mtlIdPar return subMtl; } +aseSubMaterial_t* _ase_get_submaterial_or_default( aseMaterial_t* materials, int mtlIdParent, int subMtlId ){ + aseSubMaterial_t* subMtl = _ase_get_submaterial( materials, mtlIdParent, subMtlId ); + if ( subMtl != NULL ) { + return subMtl; + } + + /* ydnar: trying default submaterial */ + subMtl = _ase_get_submaterial( materials, mtlIdParent, 0 ); + if ( subMtl != NULL ) { + return subMtl; + } + + _pico_printf( PICO_ERROR, "Could not find material/submaterial for id %d/%d\n", mtlIdParent, subMtlId ); + return NULL; +} + + + + static aseMaterial_t* _ase_add_material( aseMaterial_t **list, int mtlIdParent ){ aseMaterial_t *mtl = _pico_calloc( 1, sizeof( aseMaterial_t ) ); mtl->mtlId = mtlIdParent; @@ -173,64 +192,6 @@ static void _ase_print_materials( aseMaterial_t *list ){ } #endif //DEBUG_PM_ASE -/* ASE Face management */ -/* These are used to keep an association between a submaterial and a face definition */ -/* They are kept in parallel with the current picoSurface, */ -/* and are used by _ase_submit_triangles to lookup the proper material/submaterial IDs */ -typedef struct aseFace_s -{ - struct aseFace_s* next; - int mtlId; - int subMtlId; - int index[9]; -} aseFace_t; - -/* ASE Face management functions */ -void _ase_add_face( aseFace_t **list, aseFace_t **tail, aseFace_t *newFace ){ - /* insert as head of list */ - if ( !( *list ) ) { - *list = newFace; - } - else - { - ( *tail )->next = newFace; - } - - *tail = newFace; - newFace->next = NULL; - - //tag the color indices so we can detect them and apply the default color to them - newFace->index[6] = -1; - newFace->index[7] = -1; - newFace->index[8] = -1; -} - -aseFace_t* _ase_get_face_for_index( aseFace_t *list, int index ){ - int counter = 0; - aseFace_t* face = list; - - while ( counter < index ) - { - face = face->next; - counter++; - } - return face; -} -static void _ase_free_faces( aseFace_t** list, aseFace_t** tail ){ - aseFace_t* face = *list; - aseFace_t* tempFace = NULL; - - while ( face ) - { - tempFace = face->next; - _pico_free( face ); - face = tempFace; - } - - ( *list ) = NULL; - ( *tail ) = NULL; -} - /* todo: * - apply material specific uv offsets to uv coordinates */ @@ -274,7 +235,65 @@ static int _ase_canload( PM_PARAMS_CANLOAD ){ return PICO_PMV_OK; } +typedef struct aseVertex_s aseVertex_t; +struct aseVertex_s +{ + picoVec3_t xyz; + picoVec3_t normal; + picoIndex_t id; +}; +typedef struct aseTexCoord_s aseTexCoord_t; +struct aseTexCoord_s +{ + picoVec2_t texcoord; +}; + +typedef struct aseColor_s aseColor_t; +struct aseColor_s +{ + picoColor_t color; +}; + +typedef struct aseFace_s aseFace_t; +struct aseFace_s +{ + picoIndex_t indices[9]; + picoIndex_t smoothingGroup; + picoIndex_t materialId; + picoIndex_t subMaterialId; +}; +typedef aseFace_t* aseFacesIter_t; + +picoSurface_t* PicoModelFindOrAddSurface( picoModel_t *model, picoShader_t* shader ){ + /* see if a surface already has the shader */ + int i = 0; + for ( ; i < model->numSurfaces ; i++ ) + { + picoSurface_t* workSurface = model->surface[i]; + if ( workSurface->shader == shader ) { + return workSurface; + } + } + + /* no surface uses this shader yet, so create a new surface */ + + { + /* create a new surface in the model for the unique shader */ + picoSurface_t* workSurface = PicoNewSurface( model ); + if ( !workSurface ) { + _pico_printf( PICO_ERROR, "Could not allocate a new surface!\n" ); + return 0; + } + + /* do surface setup */ + PicoSetSurfaceType( workSurface, PICO_TRIANGLES ); + PicoSetSurfaceName( workSurface, shader->name ); + PicoSetSurfaceShader( workSurface, shader ); + + return workSurface; + } +} /* _ase_submit_triangles - jhefty use the surface and the current face list to look up material/submaterial IDs @@ -286,65 +305,80 @@ static int _ase_canload( PM_PARAMS_CANLOAD ){ indexes 6 7 8 = color indexes (new) */ -static void _ase_submit_triangles( picoSurface_t* surface, picoModel_t* model, aseMaterial_t* materials, aseFace_t* faces ){ - aseFace_t* face; - aseSubMaterial_t* subMtl; - picoVec3_t* xyz[3]; - picoVec3_t* normal[3]; - picoVec2_t* st[3]; - picoColor_t* color[3]; - int i; - - face = faces; - while ( face != NULL ) +static void _ase_submit_triangles( picoModel_t* model, aseMaterial_t* materials, aseVertex_t* vertices, aseTexCoord_t* texcoords, aseColor_t* colors, aseFace_t* faces, int numFaces ){ + aseFacesIter_t i = faces, end = faces + numFaces; + for (; i != end; ++i ) { /* look up the shader for the material/submaterial pair */ - subMtl = _ase_get_submaterial( materials, face->mtlId, face->subMtlId ); + aseSubMaterial_t* subMtl = _ase_get_submaterial_or_default( materials, ( *i ).materialId, ( *i ).subMaterialId ); if ( subMtl == NULL ) { - /* ydnar: trying default submaterial */ - subMtl = _ase_get_submaterial( materials, face->mtlId, 0 ); - if ( subMtl == NULL ) { - _pico_printf( PICO_ERROR, "Could not find material/submaterial for id %d/%d\n", face->mtlId, face->subMtlId ); - return; - } + return; } - /* we pull the data from the surface using the facelist data */ - for ( i = 0 ; i < 3 ; i++ ) { - xyz[i] = (picoVec3_t*) PicoGetSurfaceXYZ( surface, face->index[ i ] ); - normal[i] = (picoVec3_t*) PicoGetSurfaceNormal( surface, face->index[ i ] ); - st[i] = (picoVec2_t*) PicoGetSurfaceST( surface, 0, face->index[ i + 3 ] ); - - if ( face->index [ i + 6] >= 0 ) { - color[i] = (picoColor_t*)PicoGetSurfaceColor( surface, 0, face->index[ i + 6 ] ); - } - else + picoVec3_t* xyz[3]; + picoVec3_t* normal[3]; + picoVec2_t* st[3]; + picoColor_t* color[3]; + picoIndex_t smooth[3]; + int j; + /* we pull the data from the vertex, color and texcoord arrays using the face index data */ + for ( j = 0 ; j < 3 ; j++ ) { - color[i] = &white; + xyz[j] = &vertices[( *i ).indices[j]].xyz; + normal[j] = &vertices[( *i ).indices[j]].normal; + st[j] = &texcoords[( *i ).indices[j + 3]].texcoord; + + if ( colors != NULL && ( *i ).indices[j + 6] >= 0 ) { + color[j] = &colors[( *i ).indices[j + 6]].color; + } + else + { + color[j] = &white; + } + + smooth[j] = ( vertices[( *i ).indices[j]].id * ( 1 << 16 ) ) + ( *i ).smoothingGroup; /* don't merge vertices */ + } + /* submit the triangle to the model */ + PicoAddTriangleToModel( model, xyz, normal, 1, st, 1, color, subMtl->shader, smooth ); } - - /* submit the triangle to the model */ - PicoAddTriangleToModel( model, xyz, normal, 1, st, 1, color, subMtl->shader ); - - /* advance to the next face */ - face = face->next; } } +static void shadername_convert( char* shaderName ){ + /* unix-style path separators */ + char* s = shaderName; + for (; *s != '\0'; ++s ) + { + if ( *s == '\\' ) { + *s = '/'; + } + } +} + + /* _ase_load: * loads a 3dsmax ase model file. */ static picoModel_t *_ase_load( PM_PARAMS_LOAD ){ picoModel_t *model; - picoSurface_t *surface = NULL; picoParser_t *p; char lastNodeName[ 1024 ]; + aseVertex_t* vertices = NULL; + aseTexCoord_t* texcoords = NULL; + aseColor_t* colors = NULL; aseFace_t* faces = NULL; - aseFace_t* facesTail = NULL; + int numVertices = 0; + int numFaces = 0; + int numTextureVertices = 0; + int numTextureVertexFaces = 0; + int numColorVertices = 0; + int numColorVertexFaces = 0; + int vertexId = 0; + aseMaterial_t* materials = NULL; #ifdef DEBUG_PM_ASE @@ -357,8 +391,8 @@ static picoModel_t *_ase_load( PM_PARAMS_LOAD ){ #define _ase_error_return( m ) \ { \ _pico_printf( PICO_ERROR,"%s in ASE, line %d.",m,p->curLine ); \ - _pico_free_parser( p ); \ - PicoFreeModel( model ); \ + _pico_free_parser( p ); \ + PicoFreeModel( model ); \ return NULL; \ } /* create a new pico parser */ @@ -413,15 +447,49 @@ static picoModel_t *_ase_load( PM_PARAMS_LOAD ){ /* model mesh (originally contained within geomobject) */ else if ( !_pico_stricmp( p->token,"*mesh" ) ) { /* finish existing surface */ - //_ase_make_surface( model, &surface ); - _ase_submit_triangles( surface, model,materials,faces ); - _ase_free_faces( &faces,&facesTail ); + _ase_submit_triangles( model, materials, vertices, texcoords, colors, faces, numFaces ); + _pico_free( faces ); + _pico_free( vertices ); + _pico_free( texcoords ); + _pico_free( colors ); + } + else if ( !_pico_stricmp( p->token,"*mesh_numvertex" ) ) { + if ( !_pico_parse_int( p, &numVertices ) ) { + _ase_error_return( "Missing MESH_NUMVERTEX value" ); + } - /* allocate new pico surface */ - surface = PicoNewSurface( NULL ); - if ( surface == NULL ) { - PicoFreeModel( model ); - return NULL; + vertices = _pico_calloc( numVertices, sizeof( aseVertex_t ) ); + } + else if ( !_pico_stricmp( p->token,"*mesh_numfaces" ) ) { + if ( !_pico_parse_int( p, &numFaces ) ) { + _ase_error_return( "Missing MESH_NUMFACES value" ); + } + + faces = _pico_calloc( numFaces, sizeof( aseFace_t ) ); + } + else if ( !_pico_stricmp( p->token,"*mesh_numtvertex" ) ) { + if ( !_pico_parse_int( p, &numTextureVertices ) ) { + _ase_error_return( "Missing MESH_NUMTVERTEX value" ); + } + + texcoords = _pico_calloc( numTextureVertices, sizeof( aseTexCoord_t ) ); + } + else if ( !_pico_stricmp( p->token,"*mesh_numtvfaces" ) ) { + if ( !_pico_parse_int( p, &numTextureVertexFaces ) ) { + _ase_error_return( "Missing MESH_NUMTVFACES value" ); + } + } + else if ( !_pico_stricmp( p->token,"*mesh_numcvertex" ) ) { + if ( !_pico_parse_int( p, &numColorVertices ) ) { + _ase_error_return( "Missing MESH_NUMCVERTEX value" ); + } + + colors = _pico_calloc( numColorVertices, sizeof( aseColor_t ) ); + memset( colors, 255, numColorVertices * sizeof( aseColor_t ) ); /* ydnar: force colors to white initially */ + } + else if ( !_pico_stricmp( p->token,"*mesh_numcvfaces" ) ) { + if ( !_pico_parse_int( p, &numColorVertexFaces ) ) { + _ase_error_return( "Missing MESH_NUMCVFACES value" ); } } /* mesh material reference. this usually comes at the end of */ @@ -430,77 +498,63 @@ static picoModel_t *_ase_load( PM_PARAMS_LOAD ){ /* the material reference id (shader index) now. */ else if ( !_pico_stricmp( p->token,"*material_ref" ) ) { int mtlId; - aseFace_t* face; - - /* we must have a valid surface */ - if ( surface == NULL ) { - _ase_error_return( "Missing mesh for material reference" ); - } /* get the material ref (0..n) */ if ( !_pico_parse_int( p,&mtlId ) ) { _ase_error_return( "Missing material reference ID" ); } - /* fix up all of the aseFaceList in the surface to point to the parent material */ - /* we've already saved off their subMtl */ - face = faces; - while ( face != NULL ) { - face->mtlId = mtlId; - face = face->next; + int i = 0; + /* fix up all of the aseFaceList in the surface to point to the parent material */ + /* we've already saved off their subMtl */ + for (; i < numFaces; ++i ) + { + faces[i].materialId = mtlId; + } } } /* model mesh vertex */ else if ( !_pico_stricmp( p->token,"*mesh_vertex" ) ) { - picoVec3_t v; int index; - /* we must have a valid surface */ - if ( surface == NULL ) { - continue; + if ( numVertices == 0 ) { + _ase_error_return( "Vertex parse error" ); } /* get vertex data (orig: index +y -x +z) */ if ( !_pico_parse_int( p,&index ) ) { _ase_error_return( "Vertex parse error" ); } - if ( !_pico_parse_vec( p,v ) ) { + if ( !_pico_parse_vec( p,vertices[index].xyz ) ) { _ase_error_return( "Vertex parse error" ); } - /* set vertex */ - PicoSetSurfaceXYZ( surface,index,v ); + vertices[index].id = vertexId++; } /* model mesh vertex normal */ else if ( !_pico_stricmp( p->token,"*mesh_vertexnormal" ) ) { - picoVec3_t v; int index; - /* we must have a valid surface */ - if ( surface == NULL ) { - continue; + if ( numVertices == 0 ) { + _ase_error_return( "Vertex parse error" ); } /* get vertex data (orig: index +y -x +z) */ if ( !_pico_parse_int( p,&index ) ) { _ase_error_return( "Vertex parse error" ); } - if ( !_pico_parse_vec( p,v ) ) { + if ( !_pico_parse_vec( p,vertices[index].normal ) ) { _ase_error_return( "Vertex parse error" ); } - - /* set vertex */ - PicoSetSurfaceNormal( surface,index,v ); } /* model mesh face */ else if ( !_pico_stricmp( p->token,"*mesh_face" ) ) { picoIndex_t indexes[3]; int index; - /* we must have a valid surface */ - if ( surface == NULL ) { - continue; + if ( numFaces == 0 ) { + _ase_error_return( "Face parse error" ); } /* get face index */ @@ -526,75 +580,58 @@ static picoModel_t *_ase_load( PM_PARAMS_LOAD ){ _ase_error_return( "Face parse error" ); } - /* set face indexes (note interleaved offset!) */ - PicoSetSurfaceIndex( surface, ( index * 9 + 0 ), indexes[2] ); - PicoSetSurfaceIndex( surface, ( index * 9 + 1 ), indexes[1] ); - PicoSetSurfaceIndex( surface, ( index * 9 + 2 ), indexes[0] ); - /* parse to the subMaterial ID */ while ( 1 ) { - _pico_parse( p,0 ); - if ( !_pico_stricmp( p->token,"*MESH_MTLID" ) ) { - aseFace_t* newFace; - int subMtlId; - - _pico_parse_int( p, &subMtlId ); - newFace = _pico_calloc( 1, sizeof( aseFace_t ) ); - - /* we fix up the mtlId later when we parse the material_ref */ - newFace->mtlId = 0; - newFace->subMtlId = subMtlId; - newFace->index[0] = indexes[2]; - newFace->index[1] = indexes[1]; - newFace->index[2] = indexes[0]; - - _ase_add_face( &faces,&facesTail,newFace ); + if ( !_pico_parse( p,0 ) ) { /* EOL */ break; } + if ( !_pico_stricmp( p->token,"*MESH_SMOOTHING" ) ) { + _pico_parse_int( p, &faces[index].smoothingGroup ); + } + if ( !_pico_stricmp( p->token,"*MESH_MTLID" ) ) { + _pico_parse_int( p, &faces[index].subMaterialId ); + } } + faces[index].materialId = 0; + faces[index].indices[0] = indexes[2]; + faces[index].indices[1] = indexes[1]; + faces[index].indices[2] = indexes[0]; } /* model texture vertex */ else if ( !_pico_stricmp( p->token,"*mesh_tvert" ) ) { - picoVec2_t uv; int index; - /* we must have a valid surface */ - if ( surface == NULL ) { - continue; + if ( numVertices == 0 ) { + _ase_error_return( "Texture Vertex parse error" ); } /* get uv vertex index */ - if ( !_pico_parse_int( p,&index ) ) { - _ase_error_return( "UV vertex parse error" ); + if ( !_pico_parse_int( p,&index ) || index >= numTextureVertices ) { + _ase_error_return( "Texture vertex parse error" ); } /* get uv vertex s */ - if ( !_pico_parse_float( p,&uv[0] ) ) { - _ase_error_return( "UV vertex parse error" ); + if ( !_pico_parse_float( p,&texcoords[index].texcoord[0] ) ) { + _ase_error_return( "Texture vertex parse error" ); } /* get uv vertex t */ - if ( !_pico_parse_float( p,&uv[1] ) ) { - _ase_error_return( "UV vertex parse error" ); + if ( !_pico_parse_float( p,&texcoords[index].texcoord[1] ) ) { + _ase_error_return( "Texture vertex parse error" ); } /* ydnar: invert t */ - uv[ 1 ] = 1.0f - uv[ 1 ]; - - /* set texture vertex */ - PicoSetSurfaceST( surface,0,index,uv ); + texcoords[index].texcoord[ 1 ] = 1.0f - texcoords[index].texcoord[ 1 ]; } /* ydnar: model mesh texture face */ else if ( !_pico_stricmp( p->token, "*mesh_tface" ) ) { picoIndex_t indexes[3]; int index; - aseFace_t* face; - /* we must have a valid surface */ - if ( surface == NULL ) { - continue; + if ( numFaces == 0 ) { + _ase_error_return( "Texture face parse error" ); } /* get face index */ @@ -617,65 +654,52 @@ static picoModel_t *_ase_load( PM_PARAMS_LOAD ){ _ase_error_return( "Texture face parse error" ); } - /* set face indexes (note interleaved offset!) */ - PicoSetSurfaceIndex( surface, ( index * 9 + 3 ), indexes[2] ); - PicoSetSurfaceIndex( surface, ( index * 9 + 4 ), indexes[1] ); - PicoSetSurfaceIndex( surface, ( index * 9 + 5 ), indexes[0] ); - - face = _ase_get_face_for_index( faces,index ); - face->index[3] = indexes[2]; - face->index[4] = indexes[1]; - face->index[5] = indexes[0]; + faces[index].indices[3] = indexes[2]; + faces[index].indices[4] = indexes[1]; + faces[index].indices[5] = indexes[0]; } /* model color vertex */ else if ( !_pico_stricmp( p->token,"*mesh_vertcol" ) ) { - picoColor_t color; int index; float colorInput; - /* we must have a valid surface */ - if ( surface == NULL ) { - continue; + if ( numVertices == 0 ) { + _ase_error_return( "Color Vertex parse error" ); } /* get color vertex index */ if ( !_pico_parse_int( p,&index ) ) { - _ase_error_return( "UV vertex parse error" ); + _ase_error_return( "Color vertex parse error" ); } /* get R component */ if ( !_pico_parse_float( p,&colorInput ) ) { - _ase_error_return( "color vertex parse error" ); + _ase_error_return( "Color vertex parse error" ); } - color[0] = (picoByte_t)( colorInput * 255 ); + colors[index].color[0] = (picoByte_t)( colorInput * 255 ); /* get G component */ if ( !_pico_parse_float( p,&colorInput ) ) { - _ase_error_return( "color vertex parse error" ); + _ase_error_return( "Color vertex parse error" ); } - color[1] = (picoByte_t)( colorInput * 255 ); + colors[index].color[1] = (picoByte_t)( colorInput * 255 ); /* get B component */ if ( !_pico_parse_float( p,&colorInput ) ) { - _ase_error_return( "color vertex parse error" ); + _ase_error_return( "Color vertex parse error" ); } - color[2] = (picoByte_t)( colorInput * 255 ); + colors[index].color[2] = (picoByte_t)( colorInput * 255 ); /* leave alpha alone since we don't get any data from the ASE format */ - color[3] = 255; - - /* set texture vertex */ - PicoSetSurfaceColor( surface,0,index,color ); + colors[index].color[3] = 255; } /* model color face */ else if ( !_pico_stricmp( p->token,"*mesh_cface" ) ) { picoIndex_t indexes[3]; int index; - aseFace_t* face; - /* we must have a valid surface */ - if ( surface == NULL ) { - continue; + if ( numFaces == 0 ) { + _ase_error_return( "Face parse error" ); } /* get face index */ @@ -701,20 +725,14 @@ static picoModel_t *_ase_load( PM_PARAMS_LOAD ){ _ase_error_return( "Face parse error" ); } - /* set face indexes (note interleaved offset!) */ - PicoSetSurfaceIndex( surface, ( index * 9 + 6 ), indexes[2] ); - PicoSetSurfaceIndex( surface, ( index * 9 + 7 ), indexes[1] ); - PicoSetSurfaceIndex( surface, ( index * 9 + 8 ), indexes[0] ); - - face = _ase_get_face_for_index( faces,index ); - face->index[6] = indexes[2]; - face->index[7] = indexes[1]; - face->index[8] = indexes[0]; + faces[index].indices[6] = indexes[2]; + faces[index].indices[7] = indexes[1]; + faces[index].indices[8] = indexes[0]; } /* model material */ else if ( !_pico_stricmp( p->token, "*material" ) ) { aseSubMaterial_t* subMaterial = NULL; - picoShader_t *shader = NULL; + picoShader_t *shader; int level = 1, index; char materialName[ 1024 ]; float transValue = 0.0f, shineValue = 1.0f; @@ -755,6 +773,8 @@ static picoModel_t *_ase_load( PM_PARAMS_LOAD ){ if ( level == subMaterialLevel ) { /* set material name */ + _pico_first_token( materialName ); + shadername_convert( materialName ); PicoSetShaderName( shader, materialName ); /* set shader's transparency */ @@ -944,6 +964,7 @@ static picoModel_t *_ase_load( PM_PARAMS_LOAD ){ } /* set material name */ + shadername_convert( materialName ); PicoSetShaderName( shader,materialName ); /* set shader's transparency */ @@ -967,6 +988,34 @@ static picoModel_t *_ase_load( PM_PARAMS_LOAD ){ /* set material map name */ PicoSetShaderMapName( shader, mapname ); + /* extract shadername from bitmap path */ + if ( mapname != NULL ) { + char* p = mapname; + + /* convert to shader-name format */ + shadername_convert( mapname ); + { + /* remove extension */ + char* last_period = strrchr( p, '.' ); + if ( last_period != NULL ) { + *last_period = '\0'; + } + } + + /* find shader path */ + for (; *p != '\0'; ++p ) + { + if ( _pico_strnicmp( p, "models/", 7 ) == 0 || _pico_strnicmp( p, "textures/", 9 ) == 0 ) { + break; + } + } + + if ( *p != '\0' ) { + /* set material name */ + PicoSetShaderName( shader,p ); + } + } + /* this is just a material with 1 submaterial */ subMaterial = _ase_add_submaterial( &materials, index, 0, shader ); } @@ -982,9 +1031,11 @@ static picoModel_t *_ase_load( PM_PARAMS_LOAD ){ } /* ydnar: finish existing surface */ -// _ase_make_surface( model, &surface ); - _ase_submit_triangles( surface, model,materials,faces ); - _ase_free_faces( &faces,&facesTail ); + _ase_submit_triangles( model, materials, vertices, texcoords, colors, faces, numFaces ); + _pico_free( faces ); + _pico_free( vertices ); + _pico_free( texcoords ); + _pico_free( colors ); #ifdef DEBUG_PM_ASE _ase_print_materials( materials ); @@ -995,6 +1046,8 @@ static picoModel_t *_ase_load( PM_PARAMS_LOAD ){ _ase_free_materials( &materials ); + _pico_free_parser( p ); + /* return allocated pico model */ return model; } diff --git a/libs/picomodel/pm_obj.c b/libs/picomodel/pm_obj.c index 2f6e93c4..a8b1dfed 100644 --- a/libs/picomodel/pm_obj.c +++ b/libs/picomodel/pm_obj.c @@ -241,7 +241,7 @@ static int _obj_mtl_load( picoModel_t *model ){ return 0; \ } /* alloc copy of model file name */ - fileName = _pico_clone_alloc( model->fileName,-1 ); + fileName = _pico_clone_alloc( model->fileName ); if ( fileName == NULL ) { return 0; } From 14c2c858b996d1d746d061697bdc6e3b58461e14 Mon Sep 17 00:00:00 2001 From: Christophe Mateos Date: Fri, 9 Dec 2016 02:57:39 +0100 Subject: [PATCH 16/28] PicoModel - End of 1.5 backporting lwo subfolder already done by @jdolan: https://github.com/TTimo/GtkRadiant/commit/a269593afe5fe37b3522a27bfe8eba1717f6db7b#diff-584b574ac260b5150f42f60544e9266e --- libs/picomodel/lwo/clip.c | 29 ++ libs/picomodel/picointernal.c | 31 +- libs/picomodel/picomodel.c | 21 +- libs/picomodel/picomodules.c | 4 +- libs/picomodel/pm_3ds.c | 15 +- libs/picomodel/pm_ase.c | 119 +++++++ libs/picomodel/pm_fm.c | 2 +- libs/picomodel/pm_lwo.c | 16 +- libs/picomodel/pm_terrain.c | 607 ++++++++++++++++++++++++++++++++++ 9 files changed, 803 insertions(+), 41 deletions(-) create mode 100644 libs/picomodel/pm_terrain.c diff --git a/libs/picomodel/lwo/clip.c b/libs/picomodel/lwo/clip.c index 8a9d2a62..9ea2586b 100644 --- a/libs/picomodel/lwo/clip.c +++ b/libs/picomodel/lwo/clip.c @@ -22,6 +22,35 @@ void lwFreeClip( lwClip *clip ){ if ( clip ) { lwListFree( (void*) clip->ifilter, (ListFreeFunc) lwFreePlugin ); lwListFree( (void*) clip->pfilter, (ListFreeFunc) lwFreePlugin ); + + switch ( clip->type ) { + case ID_STIL: + _pico_free( clip->source.still.name ); + break; + + case ID_ISEQ: + _pico_free( clip->source.seq.prefix ); + _pico_free( clip->source.seq.suffix ); + break; + + case ID_ANIM: + _pico_free( clip->source.anim.name ); + _pico_free( clip->source.anim.server ); + _pico_free( clip->source.anim.data ); + break; + + case ID_XREF: + _pico_free( clip->source.xref.string ); + break; + + case ID_STCC: + _pico_free( clip->source.cycle.name ); + break; + + default: + break; + } + _pico_free( clip ); } } diff --git a/libs/picomodel/picointernal.c b/libs/picomodel/picointernal.c index e98b4531..c6f396ce 100644 --- a/libs/picomodel/picointernal.c +++ b/libs/picomodel/picointernal.c @@ -161,18 +161,19 @@ void *_pico_realloc( void **ptr, size_t oldSize, size_t newSize ){ * as custom clone size (the string is cropped to fit into mem * if needed). -sea */ -char *_pico_clone_alloc(const char *str) -{ +char *_pico_clone_alloc( const char *str ) { char* cloned; /* sanity check */ - if (str == NULL) + if ( str == NULL ) { return NULL; + } /* allocate memory */ cloned = _pico_alloc(strlen(str) + 1); - if (cloned == NULL) + if ( cloned == NULL ) { return NULL; + } /* copy input string to cloned string */ strcpy(cloned, str); @@ -266,10 +267,10 @@ void _pico_printf( int level, const char *format, ... ){ * trims everything after the first whitespace-delimited token */ -void _pico_first_token(char *str) -{ - if (!str || !*str) +void _pico_first_token( char *str ) { + if ( !str || ! * str ) { return; + } while (*str && !isspace(*str)) *str++; *str = '\0'; @@ -542,7 +543,7 @@ float _pico_big_float( float src ){ * case-insensitive strstr. -sea */ char *_pico_stristr( char *str, const char *substr ){ - const int sublen = strlen( substr ); + const size_t sublen = strlen( substr ); while ( *str ) { if ( !_pico_strnicmp( str,substr,sublen ) ) { @@ -604,24 +605,24 @@ int _pico_nofname( const char *path, char *dest, int destSize ){ * returns ptr to filename portion in given path or an empty * string otherwise. given 'path' is not altered. -sea */ -char *_pico_nopath( const char *path ){ - char *src; - src = (char *)path + ( strlen( path ) - 1 ); +const char *_pico_nopath( const char *path ){ + const char *src; if ( path == NULL ) { - return (char *)""; + return ""; } - if ( !strchr( (char *)path,'/' ) && !strchr( (char *)path,'\\' ) ) { - return ( (char *)path ); + if ( !strchr( path,'/' ) && !strchr( path,'\\' ) ) { + return ( path ); } + src = path + ( strlen( path ) - 1 ); while ( ( src-- ) != path ) { if ( *src == '/' || *src == '\\' ) { return ( ++src ); } } - return (char *)""; + return ""; } /* _pico_setfext: diff --git a/libs/picomodel/picomodel.c b/libs/picomodel/picomodel.c index 29e810a5..b8f185cd 100644 --- a/libs/picomodel/picomodel.c +++ b/libs/picomodel/picomodel.c @@ -251,8 +251,7 @@ picoModel_t *PicoLoadModel( char *fileName, int frameNum ){ FIXME: From 1.5; Unused yet */ -picoModel_t *PicoModuleLoadModelStream( const picoModule_t* module, void* inputStream, PicoInputStreamReadFunc inputStreamRead, size_t streamLength, int frameNum ) -{ +picoModel_t *PicoModuleLoadModelStream( const picoModule_t* module, void* inputStream, PicoInputStreamReadFunc inputStreamRead, size_t streamLength, int frameNum ) { picoModel_t *model; picoByte_t *buffer; int bufSize; @@ -260,14 +259,12 @@ picoModel_t *PicoModuleLoadModelStream( const picoModule_t* module, void* inputS /* init */ model = NULL; - if ( inputStream == NULL ) - { + if ( inputStream == NULL ) { _pico_printf( PICO_ERROR, "PicoLoadModel: invalid input stream (inputStream == NULL)" ); return NULL; } - if ( inputStreamRead == NULL ) - { + if ( inputStreamRead == NULL ) { _pico_printf( PICO_ERROR, "PicoLoadModel: invalid input stream (inputStreamRead == NULL) "); return NULL; } @@ -328,7 +325,6 @@ picoModel_t *PicoNewModel( void ){ } - /* PicoFreeModel() frees a model and all associated data @@ -366,7 +362,6 @@ void PicoFreeModel( picoModel_t *model ){ } - /* PicoAdjustModel() adjusts a models's memory allocations to handle the requested sizes. @@ -421,7 +416,6 @@ int PicoAdjustModel( picoModel_t *model, int numShaders, int numSurfaces ){ } - /* ---------------------------------------------------------------------------- shaders ---------------------------------------------------------------------------- */ @@ -434,7 +428,6 @@ int PicoAdjustModel( picoModel_t *model, int numShaders, int numSurfaces ){ picoShader_t *PicoNewShader( picoModel_t *model ){ picoShader_t *shader; - /* allocate and clear */ shader = _pico_alloc( sizeof( picoShader_t ) ); if ( shader == NULL ) { @@ -467,7 +460,6 @@ picoShader_t *PicoNewShader( picoModel_t *model ){ } - /* PicoFreeShader() frees a shader and all associated data -sea @@ -492,7 +484,6 @@ void PicoFreeShader( picoShader_t *shader ){ } - /* PicoFindShader() finds a named shader in a model @@ -531,7 +522,6 @@ picoShader_t *PicoFindShader( picoModel_t *model, char *name, int caseSensitive } - /* ---------------------------------------------------------------------------- surfaces ---------------------------------------------------------------------------- */ @@ -574,7 +564,6 @@ picoSurface_t *PicoNewSurface( picoModel_t *model ){ } - /* PicoFreeSurface() frees a surface and all associated data @@ -582,7 +571,6 @@ picoSurface_t *PicoNewSurface( picoModel_t *model ){ void PicoFreeSurface( picoSurface_t *surface ){ int i; - /* dummy check */ if ( surface == NULL ) { return; @@ -612,7 +600,6 @@ void PicoFreeSurface( picoSurface_t *surface ){ } - /* PicoAdjustSurface() adjusts a surface's memory allocations to handle the requested sizes. @@ -622,7 +609,6 @@ void PicoFreeSurface( picoSurface_t *surface ){ int PicoAdjustSurface( picoSurface_t *surface, int numVertexes, int numSTArrays, int numColorArrays, int numIndexes, int numFaceNormals ){ int i; - /* dummy check */ if ( surface == NULL ) { return 0; @@ -2169,7 +2155,6 @@ int PicoRemapModel( picoModel_t *model, char *remapFile ){ picoShader_t *shader; char *materialName; - /* get material name */ if ( _pico_parse( p, 1 ) == NULL ) { break; diff --git a/libs/picomodel/picomodules.c b/libs/picomodel/picomodules.c index 6ccafc46..5f298492 100644 --- a/libs/picomodel/picomodules.c +++ b/libs/picomodel/picomodules.c @@ -54,6 +54,7 @@ extern const picoModule_t picoModuleMDC; extern const picoModule_t picoModuleMD2; extern const picoModule_t picoModuleFM; extern const picoModule_t picoModuleLWO; +extern const picoModule_t picoModuleTerrain; @@ -68,6 +69,7 @@ const picoModule_t *picoModules[] = &picoModuleMD2, /* quake2 md2 */ &picoModuleFM, /* heretic2 fm */ &picoModuleLWO, /* lightwave object */ + &picoModuleTerrain, /* picoterrain object */ &picoModuleOBJ, /* wavefront object */ NULL /* arnold */ }; @@ -81,7 +83,7 @@ const picoModule_t *picoModules[] = this param can be NULL when the count is not needed. */ -const picoModule_t **PicoModuleList( int *numModules ){ +const picoModule_t **PicoModuleList( int *numModules ) { /* get module count */ if ( numModules != NULL ) { for ( ( *numModules ) = 0; picoModules[ *numModules ] != NULL; ( *numModules )++ ) ; diff --git a/libs/picomodel/pm_3ds.c b/libs/picomodel/pm_3ds.c index 64b77fe6..4065f3e7 100644 --- a/libs/picomodel/pm_3ds.c +++ b/libs/picomodel/pm_3ds.c @@ -124,7 +124,7 @@ debugChunkNames[] = { CHUNK_OBJECT_UV, "CHUNK_OBJECT_UV" }, { 0, NULL } }; -static char *DebugGetChunkName( int id ){ +static char *DebugGetChunkName( int id ) { int i,max; /* imax? ;) */ max = sizeof( debugChunkNames ) / sizeof( debugChunkNames[0] ); @@ -397,6 +397,9 @@ static int GetMeshShader( T3dsLoaderPers *pers ){ return 0; } + /* ydnar: trim to first whitespace */ + _pico_first_token( shaderName ); + /* now that we have the shader name we need to go through all of */ /* the shaders and check the name against each shader. when we */ /* find a shader in our shader list that matches this name we */ @@ -418,7 +421,7 @@ static int GetMeshShader( T3dsLoaderPers *pers ){ /* we have a valid map name ptr */ if ( mapNamePtr != NULL ) { char temp[128]; - char *name; + const char *name; /* copy map name to local buffer */ strcpy( mapName,mapNamePtr ); @@ -523,7 +526,6 @@ static int DoNextEditorDataChunk( T3dsLoaderPers *pers, long endofs ){ /* read in surface name */ if ( !GetASCIIZ( pers,surfaceName,sizeof( surfaceName ) ) ) { return 0; /* this is bad */ - } //PicoGetSurfaceName /* ignore NULL name surfaces */ @@ -606,10 +608,13 @@ static int DoNextEditorDataChunk( T3dsLoaderPers *pers, long endofs ){ /* but for now we skip the new material's name ... */ if ( pers->shader ) { char *name = (char *)( pers->bufptr + pers->cofs ); - PicoSetShaderName( pers->shader,name ); + char *cleanedName = _pico_clone_alloc( name ); + _pico_first_token( cleanedName ); + PicoSetShaderName( pers->shader, cleanedName ); #ifdef DEBUG_PM_3DS - printf( "NewShader: '%s'\n",name ); + printf( "NewShader: '%s'\n", cleanedName ); #endif + _pico_free( cleanedName ); } } if ( chunk->id == CHUNK_MATDIFFUSE ) { diff --git a/libs/picomodel/pm_ase.c b/libs/picomodel/pm_ase.c index 194f7381..67f40d41 100644 --- a/libs/picomodel/pm_ase.c +++ b/libs/picomodel/pm_ase.c @@ -305,6 +305,125 @@ picoSurface_t* PicoModelFindOrAddSurface( picoModel_t *model, picoShader_t* shad indexes 6 7 8 = color indexes (new) */ +#if 0 +typedef picoIndex_t* picoIndexIter_t; + +typedef struct aseUniqueIndices_s aseUniqueIndices_t; +struct aseUniqueIndices_s +{ + picoIndex_t* data; + picoIndex_t* last; + + aseFace_t* faces; +}; + +size_t aseUniqueIndices_size( aseUniqueIndices_t* self ) { + return self->last - self->data; +} + +void aseUniqueIndices_reserve( aseUniqueIndices_t* self, picoIndex_t size ) { + self->data = self->last = (picoIndex_t*)_pico_calloc( size, sizeof( picoIndex_t ) ); +} + +void aseUniqueIndices_clear( aseUniqueIndices_t* self ) { + _pico_free( self->data ); +} + +void aseUniqueIndices_pushBack( aseUniqueIndices_t* self, picoIndex_t index ) { + *self->last++ = index; +} + +picoIndex_t aseFaces_getVertexIndex( aseFace_t* faces, picoIndex_t index ) { + return faces[index / 3].indices[index % 3]; +} + +picoIndex_t aseFaces_getTexCoordIndex( aseFace_t* faces, picoIndex_t index ) { + return faces[index / 3].indices[( index % 3 ) + 3]; +} + +picoIndex_t aseFaces_getColorIndex( aseFace_t* faces, picoIndex_t index ) { + return faces[index / 3].indices[( index % 3 ) + 6]; +} + +int aseUniqueIndex_equal( aseFace_t* faces, picoIndex_t index, picoIndex_t other ) { + return aseFaces_getVertexIndex( faces, index ) == aseFaces_getVertexIndex( faces, other ) + && aseFaces_getTexCoordIndex( faces, index ) == aseFaces_getTexCoordIndex( faces, other ) + && aseFaces_getColorIndex( faces, index ) == aseFaces_getColorIndex( faces, other ); +} + +picoIndex_t aseUniqueIndices_insertUniqueVertex( aseUniqueIndices_t* self, picoIndex_t index ) { + picoIndexIter_t i = self->data; + for (; i != self->last; ++i ) + { + picoIndex_t other = (picoIndex_t)( i - self->data ); + if ( aseUniqueIndex_equal( self->faces, index, other ) ) { + return other; + } + } + + aseUniqueIndices_pushBack( self, index ); + return (picoIndex_t)( aseUniqueIndices_size( self ) - 1 ); +} + +static void _ase_submit_triangles_unshared( picoModel_t* model, aseMaterial_t* materials, aseVertex_t* vertices, aseTexCoord_t* texcoords, aseColor_t* colors, aseFace_t* faces, int numFaces, int meshHasNormals ) { + aseFacesIter_t i = faces, end = faces + numFaces; + + aseUniqueIndices_t indices; + aseUniqueIndices_t remap; + aseUniqueIndices_reserve( &indices, numFaces * 3 ); + aseUniqueIndices_reserve( &remap, numFaces * 3 ); + indices.faces = faces; + + for (; i != end; ++i ) + { + /* look up the shader for the material/submaterial pair */ + aseSubMaterial_t* subMtl = _ase_get_submaterial_or_default( materials, ( *i ).materialId, ( *i ).subMaterialId ); + if ( subMtl == NULL ) { + return; + } + + { + picoSurface_t* surface = PicoModelFindOrAddSurface( model, subMtl->shader ); + int j; + /* we pull the data from the vertex, color and texcoord arrays using the face index data */ + for ( j = 0 ; j < 3 ; j++ ) + { + picoIndex_t index = (picoIndex_t)( ( ( i - faces ) * 3 ) + j ); + picoIndex_t size = (picoIndex_t)aseUniqueIndices_size( &indices ); + picoIndex_t unique = aseUniqueIndices_insertUniqueVertex( &indices, index ); + + picoIndex_t numVertexes = PicoGetSurfaceNumVertexes( surface ); + picoIndex_t numIndexes = PicoGetSurfaceNumIndexes( surface ); + + aseUniqueIndices_pushBack( &remap, numIndexes ); + + PicoSetSurfaceIndex( surface, numIndexes, remap.data[unique] ); + + if ( unique == size ) { + PicoSetSurfaceXYZ( surface, numVertexes, vertices[( *i ).indices[j]].xyz ); + PicoSetSurfaceNormal( surface, numVertexes, vertices[( *i ).indices[j]].normal ); + PicoSetSurfaceST( surface, 0, numVertexes, texcoords[( *i ).indices[j + 3]].texcoord ); + + if ( ( *i ).indices[j + 6] >= 0 ) { + PicoSetSurfaceColor( surface, 0, numVertexes, colors[( *i ).indices[j + 6]].color ); + } + else + { + PicoSetSurfaceColor( surface, 0, numVertexes, white ); + } + + PicoSetSurfaceSmoothingGroup( surface, numVertexes, ( vertices[( *i ).indices[j]].id * ( 1 << 16 ) ) + ( *i ).smoothingGroup ); + } + } + } + } + + aseUniqueIndices_clear( &indices ); + aseUniqueIndices_clear( &remap ); +} + +#endif + static void _ase_submit_triangles( picoModel_t* model, aseMaterial_t* materials, aseVertex_t* vertices, aseTexCoord_t* texcoords, aseColor_t* colors, aseFace_t* faces, int numFaces ){ aseFacesIter_t i = faces, end = faces + numFaces; for (; i != end; ++i ) diff --git a/libs/picomodel/pm_fm.c b/libs/picomodel/pm_fm.c index a4251337..9201e27e 100644 --- a/libs/picomodel/pm_fm.c +++ b/libs/picomodel/pm_fm.c @@ -350,7 +350,7 @@ static picoModel_t *_fm_load( PM_PARAMS_LOAD ){ texCoord->t = _pico_little_short( texCoord[i].t ); } // set Skin Name - strncpy( skinname, (char *) fm.fm_skin, FM_SKINPATHSIZE ); + strncpy( skinname, (unsigned char *) fm.fm_skin, FM_SKINPATHSIZE ); #ifdef FM_VERBOSE_DBG // Print out md2 values diff --git a/libs/picomodel/pm_lwo.c b/libs/picomodel/pm_lwo.c index f1d82dd9..5b4f2d60 100644 --- a/libs/picomodel/pm_lwo.c +++ b/libs/picomodel/pm_lwo.c @@ -103,7 +103,7 @@ static picoModel_t *_lwo_load( PM_PARAMS_LOAD ){ lwPolygon *pol; lwPolVert *v; lwVMapPt *vm; - char name[ 64 ]; + char name[ 256 ]; int i, j, k, numverts; picoModel_t *picoModel; @@ -235,6 +235,7 @@ static picoModel_t *_lwo_load( PM_PARAMS_LOAD ){ /* detox and set shader name */ strncpy( name, surface->name, sizeof( name ) ); + _pico_first_token( name ); _pico_setfext( name, "" ); _pico_unixify( name ); PicoSetShaderName( picoShader, name ); @@ -282,9 +283,22 @@ static picoModel_t *_lwo_load( PM_PARAMS_LOAD ){ xyz[ 1 ] = pt->pos[ 2 ]; xyz[ 2 ] = pt->pos[ 1 ]; +///* doom3 lwo data doesn't seem to have smoothing-angle information */ +//#if 0 +// if ( surface->smooth <= 0 ) { +// /* use face normals */ normal[ 0 ] = v->norm[ 0 ]; normal[ 1 ] = v->norm[ 2 ]; normal[ 2 ] = v->norm[ 1 ]; + } + else +//#endif + { + /* smooth normals later */ + normal[ 0 ] = 0; + normal[ 1 ] = 0; + normal[ 2 ] = 0; + } st[ 0 ] = xyz[ defaultSTAxis[ 0 ] ] * defaultXYZtoSTScale[ 0 ]; st[ 1 ] = xyz[ defaultSTAxis[ 1 ] ] * defaultXYZtoSTScale[ 1 ]; diff --git a/libs/picomodel/pm_terrain.c b/libs/picomodel/pm_terrain.c new file mode 100644 index 00000000..d0d54653 --- /dev/null +++ b/libs/picomodel/pm_terrain.c @@ -0,0 +1,607 @@ +/* ----------------------------------------------------------------------------- + + PicoModel Library + + Copyright (c) 2003, Randy Reddig & seaw0lf + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + Redistributions of source code must retain the above copyright notice, this list + of conditions and the following disclaimer. + + Redistributions in binary form must reproduce the above copyright notice, this + list of conditions and the following disclaimer in the documentation and/or + other materials provided with the distribution. + + Neither the names of the copyright holders nor the names of its contributors may + be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + ----------------------------------------------------------------------------- */ + + + +/* marker */ +#define PM_TERRAIN_C + + + +/* dependencies */ +#include "picointernal.h" + + + +typedef struct tga_s +{ + unsigned char id_length, colormap_type, image_type; + unsigned short colormap_index, colormap_length; + unsigned char colormap_size; + unsigned short x_origin, y_origin, width, height; + unsigned char pixel_size, attributes; +} +tga_t; + + + +/* + _terrain_load_tga_buffer() + loads a tga image into a newly allocated image buffer + fixme: replace/clean this function + */ + +void _terrain_load_tga_buffer( unsigned char *buffer, unsigned char **pic, int *width, int *height ) { + int row, column; + int columns, rows, numPixels; + unsigned char *pixbuf; + unsigned char *buf_p; + tga_t targa_header; + unsigned char *targa_rgba; + + + *pic = NULL; + + if ( buffer == NULL ) { + return; + } + + buf_p = buffer; + + targa_header.id_length = *buf_p++; + targa_header.colormap_type = *buf_p++; + targa_header.image_type = *buf_p++; + + targa_header.colormap_index = _pico_little_short( *(short*)buf_p ); + buf_p += 2; + targa_header.colormap_length = _pico_little_short( *(short*) buf_p ); + buf_p += 2; + targa_header.colormap_size = *buf_p++; + targa_header.x_origin = _pico_little_short( *(short*) buf_p ); + buf_p += 2; + targa_header.y_origin = _pico_little_short( *(short*) buf_p ); + buf_p += 2; + targa_header.width = _pico_little_short( *(short*) buf_p ); + buf_p += 2; + targa_header.height = _pico_little_short( *(short*) buf_p ); + buf_p += 2; + targa_header.pixel_size = *buf_p++; + targa_header.attributes = *buf_p++; + + if ( targa_header.image_type != 2 && targa_header.image_type != 10 && targa_header.image_type != 3 ) { + _pico_printf( PICO_ERROR, "Only type 2 (RGB), 3 (gray), and 10 (RGB) TGA images supported\n" ); + pic = NULL; + return; + } + + if ( targa_header.colormap_type != 0 ) { + _pico_printf( PICO_ERROR, "Indexed color TGA images not supported\n" ); + return; + } + + if ( targa_header.pixel_size != 32 && targa_header.pixel_size != 24 && targa_header.image_type != 3 ) { + _pico_printf( PICO_ERROR, "Only 32 or 24 bit TGA images supported (not indexed color)\n" ); + pic = NULL; + return; + } + + columns = targa_header.width; + rows = targa_header.height; + numPixels = columns * rows; + + if ( width ) { + *width = columns; + } + if ( height ) { + *height = rows; + } + + targa_rgba = _pico_alloc( numPixels * 4 ); + *pic = targa_rgba; + + if ( targa_header.id_length != 0 ) { + buf_p += targa_header.id_length; // skip TARGA image comment + + } + if ( targa_header.image_type == 2 || targa_header.image_type == 3 ) { + // Uncompressed RGB or gray scale image + for ( row = rows - 1; row >= 0; row-- ) + { + pixbuf = targa_rgba + row * columns * 4; + for ( column = 0; column < columns; column++ ) + { + unsigned char red,green,blue,alphabyte; + switch ( targa_header.pixel_size ) + { + + case 8: + blue = *buf_p++; + green = blue; + red = blue; + *pixbuf++ = red; + *pixbuf++ = green; + *pixbuf++ = blue; + *pixbuf++ = 255; + break; + + case 24: + blue = *buf_p++; + green = *buf_p++; + red = *buf_p++; + *pixbuf++ = red; + *pixbuf++ = green; + *pixbuf++ = blue; + *pixbuf++ = 255; + break; + case 32: + blue = *buf_p++; + green = *buf_p++; + red = *buf_p++; + alphabyte = *buf_p++; + *pixbuf++ = red; + *pixbuf++ = green; + *pixbuf++ = blue; + *pixbuf++ = alphabyte; + break; + default: + break; + } + } + } + } + + /* rle encoded pixels */ + else if ( targa_header.image_type == 10 ) { + unsigned char red,green,blue,alphabyte,packetHeader,packetSize,j; + + red = 0; + green = 0; + blue = 0; + alphabyte = 0xff; + + for ( row = rows - 1; row >= 0; row-- ) { + pixbuf = targa_rgba + row * columns * 4; + for ( column = 0; column < columns; ) { + packetHeader = *buf_p++; + packetSize = 1 + ( packetHeader & 0x7f ); + if ( packetHeader & 0x80 ) { // run-length packet + switch ( targa_header.pixel_size ) { + case 24: + blue = *buf_p++; + green = *buf_p++; + red = *buf_p++; + alphabyte = 255; + break; + case 32: + blue = *buf_p++; + green = *buf_p++; + red = *buf_p++; + alphabyte = *buf_p++; + break; + default: + //Error("LoadTGA: illegal pixel_size '%d' in file '%s'\n", targa_header.pixel_size, name ); + break; + } + + for ( j = 0; j < packetSize; j++ ) { + *pixbuf++ = red; + *pixbuf++ = green; + *pixbuf++ = blue; + *pixbuf++ = alphabyte; + column++; + if ( column == columns ) { // run spans across rows + column = 0; + if ( row > 0 ) { + row--; + } + else{ + goto breakOut; + } + pixbuf = targa_rgba + row * columns * 4; + } + } + } + else { // non run-length packet + for ( j = 0; j < packetSize; j++ ) { + switch ( targa_header.pixel_size ) { + case 24: + blue = *buf_p++; + green = *buf_p++; + red = *buf_p++; + *pixbuf++ = red; + *pixbuf++ = green; + *pixbuf++ = blue; + *pixbuf++ = 255; + break; + case 32: + blue = *buf_p++; + green = *buf_p++; + red = *buf_p++; + alphabyte = *buf_p++; + *pixbuf++ = red; + *pixbuf++ = green; + *pixbuf++ = blue; + *pixbuf++ = alphabyte; + break; + default: + //Sysprintf("LoadTGA: illegal pixel_size '%d' in file '%s'\n", targa_header.pixel_size, name ); + break; + } + column++; + if ( column == columns ) { // pixel packet run spans across rows + column = 0; + if ( row > 0 ) { + row--; + } + else{ + goto breakOut; + } + pixbuf = targa_rgba + row * columns * 4; + } + } + } + } +breakOut:; + } + } + + /* fix vertically flipped image */ + if ( ( targa_header.attributes & ( 1 << 5 ) ) ) { + int flip; + for ( row = 0; row < .5f * rows; row++ ) + { + for ( column = 0; column < columns; column++ ) + { + flip = *( (int*)targa_rgba + row * columns + column ); + *( (int*)targa_rgba + row * columns + column ) = *( (int*)targa_rgba + ( ( rows - 1 ) - row ) * columns + column ); + *( (int*)targa_rgba + ( ( rows - 1 ) - row ) * columns + column ) = flip; + } + } + } +} + + + +/* + _terrain_canload() + validates a picoterrain file + */ + +static int _terrain_canload( PM_PARAMS_CANLOAD ) { + picoParser_t *p; + + + /* keep the friggin compiler happy */ + *fileName = *fileName; + + /* create pico parser */ + p = _pico_new_parser( (picoByte_t*) buffer, bufSize ); + if ( p == NULL ) { + return PICO_PMV_ERROR_MEMORY; + } + + /* get first token */ + if ( _pico_parse_first( p ) == NULL ) { + return PICO_PMV_ERROR_IDENT; + } + + /* check first token */ + if ( _pico_stricmp( p->token, "picoterrain" ) ) { + _pico_free_parser( p ); + return PICO_PMV_ERROR_IDENT; + } + + /* free the pico parser object */ + _pico_free_parser( p ); + + /* file seems to be a valid picoterrain file */ + return PICO_PMV_OK; +} + + + +/* + _terrain_load() + loads a picoterrain file + */ + +static picoModel_t *_terrain_load( PM_PARAMS_LOAD ) { + int i, j, v, pw[ 5 ], r; + picoParser_t *p; + + char *shader, *heightmapFile, *colormapFile; + picoVec3_t scale, origin; + + unsigned char *imageBuffer; + int imageBufSize, w, h, cw, ch; + unsigned char *heightmap, *colormap, *heightPixel, *colorPixel; + + picoModel_t *picoModel; + picoSurface_t *picoSurface; + picoShader_t *picoShader; + picoVec3_t xyz, normal; + picoVec2_t st; + picoColor_t color; + + + /* keep the friggin compiler happy */ + *fileName = *fileName; + + /* create pico parser */ + p = _pico_new_parser( (picoByte_t*) buffer, bufSize ); + if ( p == NULL ) { + return NULL; + } + + /* get first token */ + if ( _pico_parse_first( p ) == NULL ) { + return NULL; + } + + /* check first token */ + if ( _pico_stricmp( p->token, "picoterrain" ) ) { + _pico_printf( PICO_ERROR, "Invalid PicoTerrain model" ); + _pico_free_parser( p ); + return NULL; + } + + /* setup */ + shader = heightmapFile = colormapFile = NULL; + _pico_set_vec( scale, 512, 512, 32 ); + + /* parse ase model file */ + while ( 1 ) + { + /* get first token on line */ + if ( !_pico_parse_first( p ) ) { + break; + } + + /* skip empty lines */ + if ( !p->token || !p->token[ 0 ] ) { + continue; + } + + /* shader */ + if ( !_pico_stricmp( p->token, "shader" ) ) { + if ( _pico_parse( p, 0 ) && p->token[ 0 ] ) { + if ( shader != NULL ) { + _pico_free( shader ); + } + shader = _pico_clone_alloc( p->token ); + } + } + + /* heightmap */ + else if ( !_pico_stricmp( p->token, "heightmap" ) ) { + if ( _pico_parse( p, 0 ) && p->token[ 0 ] ) { + if ( heightmapFile != NULL ) { + _pico_free( heightmapFile ); + } + heightmapFile = _pico_clone_alloc( p->token ); + } + } + + /* colormap */ + else if ( !_pico_stricmp( p->token, "colormap" ) ) { + if ( _pico_parse( p, 0 ) && p->token[ 0 ] ) { + if ( colormapFile != NULL ) { + _pico_free( colormapFile ); + } + colormapFile = _pico_clone_alloc( p->token ); + } + } + + /* scale */ + else if ( !_pico_stricmp( p->token, "scale" ) ) { + _pico_parse_vec( p, scale ); + } + + /* skip unparsed rest of line and continue */ + _pico_parse_skip_rest( p ); + } + + /* ----------------------------------------------------------------- */ + + /* load heightmap */ + heightmap = imageBuffer = NULL; + _pico_load_file( heightmapFile, &imageBuffer, &imageBufSize ); + _terrain_load_tga_buffer( imageBuffer, &heightmap, &w, &h ); + _pico_free( heightmapFile ); + _pico_free_file( imageBuffer ); + + if ( heightmap == NULL || w < 2 || h < 2 ) { + _pico_printf( PICO_ERROR, "PicoTerrain model with invalid heightmap" ); + if ( shader != NULL ) { + _pico_free( shader ); + } + if ( colormapFile != NULL ) { + _pico_free( colormapFile ); + } + _pico_free_parser( p ); + return NULL; + } + + /* set origin (bottom lowest corner of terrain mesh) */ + _pico_set_vec( origin, ( w / -2 ) * scale[ 0 ], ( h / -2 ) * scale[ 1 ], -128 * scale[ 2 ] ); + + /* load colormap */ + colormap = imageBuffer = NULL; + _pico_load_file( colormapFile, &imageBuffer, &imageBufSize ); + _terrain_load_tga_buffer( imageBuffer, &colormap, &cw, &ch ); + _pico_free( colormapFile ); + _pico_free_file( imageBuffer ); + + if ( cw != w || ch != h ) { + _pico_printf( PICO_WARNING, "PicoTerrain colormap/heightmap size mismatch" ); + _pico_free( colormap ); + colormap = NULL; + } + + /* ----------------------------------------------------------------- */ + + /* create new pico model */ + picoModel = PicoNewModel(); + if ( picoModel == NULL ) { + _pico_printf( PICO_ERROR, "Unable to allocate a new model" ); + return NULL; + } + + /* do model setup */ + PicoSetModelFrameNum( picoModel, frameNum ); + PicoSetModelNumFrames( picoModel, 1 ); /* sea */ + PicoSetModelName( picoModel, fileName ); + PicoSetModelFileName( picoModel, fileName ); + + /* allocate new pico surface */ + picoSurface = PicoNewSurface( picoModel ); + if ( picoSurface == NULL ) { + _pico_printf( PICO_ERROR, "Unable to allocate a new model surface" ); + PicoFreeModel( picoModel ); /* sea */ + return NULL; + } + + /* terrain surfaces are triangle meshes */ + PicoSetSurfaceType( picoSurface, PICO_TRIANGLES ); + + /* set surface name */ + PicoSetSurfaceName( picoSurface, "picoterrain" ); + + /* create new pico shader */ + picoShader = PicoNewShader( picoModel ); + if ( picoShader == NULL ) { + _pico_printf( PICO_ERROR, "Unable to allocate a new model shader" ); + PicoFreeModel( picoModel ); + _pico_free( shader ); + return NULL; + } + + /* detox and set shader name */ + _pico_setfext( shader, "" ); + _pico_unixify( shader ); + PicoSetShaderName( picoShader, shader ); + _pico_free( shader ); + + /* associate current surface with newly created shader */ + PicoSetSurfaceShader( picoSurface, picoShader ); + + /* make bogus normal */ + _pico_set_vec( normal, 0.0f, 0.0f, 0.0f ); + + /* create mesh */ + for ( j = 0; j < h; j++ ) + { + for ( i = 0; i < w; i++ ) + { + /* get pointers */ + v = i + ( j * w ); + heightPixel = heightmap + v * 4; + colorPixel = colormap + ? colormap + v * 4 + : NULL; + + /* set xyz */ + _pico_set_vec( xyz, origin[ 0 ] + scale[ 0 ] * i, + origin[ 1 ] + scale[ 1 ] * j, + origin[ 2 ] + scale[ 2 ] * heightPixel[ 0 ] ); + PicoSetSurfaceXYZ( picoSurface, v, xyz ); + + /* set normal */ + PicoSetSurfaceNormal( picoSurface, v, normal ); + + /* set st */ + st[ 0 ] = (float) i; + st[ 1 ] = (float) j; + PicoSetSurfaceST( picoSurface, 0, v, st ); + + /* set color */ + if ( colorPixel != NULL ) { + _pico_set_color( color, colorPixel[ 0 ], colorPixel[ 1 ], colorPixel[ 2 ], colorPixel[ 3 ] ); + } + else{ + _pico_set_color( color, 255, 255, 255, 255 ); + } + PicoSetSurfaceColor( picoSurface, 0, v, color ); + + /* set triangles (zero alpha in heightmap suppresses this quad) */ + if ( i < ( w - 1 ) && j < ( h - 1 ) && heightPixel[ 3 ] >= 128 ) { + /* set indexes */ + pw[ 0 ] = i + ( j * w ); + pw[ 1 ] = i + ( ( j + 1 ) * w ); + pw[ 2 ] = i + 1 + ( ( j + 1 ) * w ); + pw[ 3 ] = i + 1 + ( j * w ); + pw[ 4 ] = i + ( j * w ); /* same as pw[ 0 ] */ + + /* set radix */ + r = ( i + j ) & 1; + + /* make first triangle */ + PicoSetSurfaceIndex( picoSurface, ( v * 6 + 0 ), (picoIndex_t) pw[ r + 0 ] ); + PicoSetSurfaceIndex( picoSurface, ( v * 6 + 1 ), (picoIndex_t) pw[ r + 1 ] ); + PicoSetSurfaceIndex( picoSurface, ( v * 6 + 2 ), (picoIndex_t) pw[ r + 2 ] ); + + /* make second triangle */ + PicoSetSurfaceIndex( picoSurface, ( v * 6 + 3 ), (picoIndex_t) pw[ r + 0 ] ); + PicoSetSurfaceIndex( picoSurface, ( v * 6 + 4 ), (picoIndex_t) pw[ r + 2 ] ); + PicoSetSurfaceIndex( picoSurface, ( v * 6 + 5 ), (picoIndex_t) pw[ r + 3 ] ); + } + } + } + + /* free stuff */ + _pico_free_parser( p ); + _pico_free( heightmap ); + _pico_free( colormap ); + + /* return the new pico model */ + return picoModel; +} + + + +/* pico file format module definition */ +const picoModule_t picoModuleTerrain = +{ + "1.3", /* module version string */ + "PicoTerrain", /* module display name */ + "Randy Reddig", /* author's name */ + "2003 Randy Reddig", /* module copyright */ + { + "picoterrain", NULL, NULL, NULL /* default extensions to use */ + }, + _terrain_canload, /* validation routine */ + _terrain_load, /* load routine */ + NULL, /* save validation routine */ + NULL /* save routine */ +}; From 787c0cc3cbcbd2955398790b310b36a0aa412910 Mon Sep 17 00:00:00 2001 From: Christophe Mateos Date: Sun, 11 Dec 2016 03:07:28 +0100 Subject: [PATCH 17/28] Update .gitignore Added more exclusions, most of them Windows/Visual Studio related. --- .gitignore | 40 ++++++++++++++++++++++++++-------------- 1 file changed, 26 insertions(+), 14 deletions(-) diff --git a/.gitignore b/.gitignore index afed6944..3dce9620 100644 --- a/.gitignore +++ b/.gitignore @@ -1,18 +1,30 @@ -/apple/target/* -/build -/install/games -/install/installs -/install/q3data -/install/q3map2 -/install/q3map2_urt -/install/radiant.bin -/install/share -/packs -/site.sconf -/.sconsign.dblite -*.pyc -*.so .settings .DS_Store + +/apple/target/* +/build +/install +/packs +/tools/urt/tools/quake3/q3map2/Debug +/tools/urt/tools/quake3/q3map2/Release +/.sconsign.dblite +/.vs/radiant/v14/.suo +/radiant.opensdf +/radiant.sdf +/radiant.suo +/radiant.v11.suo +/radiant.v12.suo +/radiant.VC.db +/site.sconf + *.obj +*.pyc +*.so *.tlog +*.vcxproj.user +*.zip + + + + + From 2d08c0518c474c28ff409d1fd3e5344f16a80aa3 Mon Sep 17 00:00:00 2001 From: Christophe Mateos Date: Mon, 19 Dec 2016 23:45:54 +0100 Subject: [PATCH 18/28] PicoModel Backport: Fixed compilation. --- libs/picomodel.h | 1 + libs/picomodel/picomodel.vcxproj | 1 + libs/picomodel/picomodel.vcxproj.filters | 3 +++ libs/picomodel/pm_lwo.c | 4 ++-- 4 files changed, 7 insertions(+), 2 deletions(-) diff --git a/libs/picomodel.h b/libs/picomodel.h index f33c6da6..23cda9bd 100644 --- a/libs/picomodel.h +++ b/libs/picomodel.h @@ -267,6 +267,7 @@ void PicoSetSurfaceIndex( picoSurface_t *surface, int num void PicoSetSurfaceIndexes( picoSurface_t *surface, int num, picoIndex_t *index, int count ); void PicoSetFaceNormal( picoSurface_t *surface, int num, picoVec3_t normal ); void PicoSetSurfaceSpecial( picoSurface_t *surface, int num, int special ); +void PicoSetSurfaceSmoothingGroup( picoSurface_t *surface, int num, picoIndex_t smoothingGroup ); /* getter functions */ diff --git a/libs/picomodel/picomodel.vcxproj b/libs/picomodel/picomodel.vcxproj index f5c872a5..2faa101c 100644 --- a/libs/picomodel/picomodel.vcxproj +++ b/libs/picomodel/picomodel.vcxproj @@ -147,6 +147,7 @@ + diff --git a/libs/picomodel/picomodel.vcxproj.filters b/libs/picomodel/picomodel.vcxproj.filters index 2760cddb..d22ec524 100644 --- a/libs/picomodel/picomodel.vcxproj.filters +++ b/libs/picomodel/picomodel.vcxproj.filters @@ -77,5 +77,8 @@ src\lwo + + src + \ No newline at end of file diff --git a/libs/picomodel/pm_lwo.c b/libs/picomodel/pm_lwo.c index 5b4f2d60..dfb64c6e 100644 --- a/libs/picomodel/pm_lwo.c +++ b/libs/picomodel/pm_lwo.c @@ -285,8 +285,8 @@ static picoModel_t *_lwo_load( PM_PARAMS_LOAD ){ ///* doom3 lwo data doesn't seem to have smoothing-angle information */ //#if 0 -// if ( surface->smooth <= 0 ) { -// /* use face normals */ + if ( surface->smooth <= 0 ) { + /* use face normals */ normal[ 0 ] = v->norm[ 0 ]; normal[ 1 ] = v->norm[ 2 ]; normal[ 2 ] = v->norm[ 1 ]; From c483b791b09f213938cf655f5c7811096dab126c Mon Sep 17 00:00:00 2001 From: Christophe Mateos Date: Mon, 19 Dec 2016 23:53:11 +0100 Subject: [PATCH 19/28] Aligment. --- libs/picomodel.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/picomodel.h b/libs/picomodel.h index 23cda9bd..a1f2c5c6 100644 --- a/libs/picomodel.h +++ b/libs/picomodel.h @@ -267,7 +267,7 @@ void PicoSetSurfaceIndex( picoSurface_t *surface, int num void PicoSetSurfaceIndexes( picoSurface_t *surface, int num, picoIndex_t *index, int count ); void PicoSetFaceNormal( picoSurface_t *surface, int num, picoVec3_t normal ); void PicoSetSurfaceSpecial( picoSurface_t *surface, int num, int special ); -void PicoSetSurfaceSmoothingGroup( picoSurface_t *surface, int num, picoIndex_t smoothingGroup ); +void PicoSetSurfaceSmoothingGroup( picoSurface_t *surface, int num, picoIndex_t smoothingGroup ); /* getter functions */ From b529282159f1ed1f752279d5873e7f9a1615b354 Mon Sep 17 00:00:00 2001 From: Jay Dolan Date: Sat, 31 Dec 2016 15:44:18 -0500 Subject: [PATCH 20/28] Fix compilation on OS X. How is this working elsewhere? --- libs/picomodel/picointernal.h | 2 +- libs/picomodel/picomodel.vcproj | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/libs/picomodel/picointernal.h b/libs/picomodel/picointernal.h index 8e9bba25..853809ee 100644 --- a/libs/picomodel/picointernal.h +++ b/libs/picomodel/picointernal.h @@ -132,7 +132,7 @@ void _pico_printf( int level, const char *format, ... ); char *_pico_stristr( char *str, const char *substr ); void _pico_unixify( char *path ); int _pico_nofname( const char *path, char *dest, int destSize ); -char *_pico_nopath( const char *path ); +const char *_pico_nopath( const char *path ); char *_pico_setfext( char *path, const char *ext ); int _pico_getline( char *buf, int bufsize, char *dest, int destsize ); char *_pico_strlwr( char *str ); diff --git a/libs/picomodel/picomodel.vcproj b/libs/picomodel/picomodel.vcproj index 1cfa803c..0ef3325f 100644 --- a/libs/picomodel/picomodel.vcproj +++ b/libs/picomodel/picomodel.vcproj @@ -192,6 +192,10 @@ RelativePath=".\pm_obj.c" > + + Date: Sat, 31 Dec 2016 15:55:29 -0500 Subject: [PATCH 21/28] This generates a different warning now, and is just wrong anyway. --- libs/picomodel/pm_terrain.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libs/picomodel/pm_terrain.c b/libs/picomodel/pm_terrain.c index d0d54653..f5d16423 100644 --- a/libs/picomodel/pm_terrain.c +++ b/libs/picomodel/pm_terrain.c @@ -303,7 +303,7 @@ static int _terrain_canload( PM_PARAMS_CANLOAD ) { /* keep the friggin compiler happy */ - *fileName = *fileName; + /**fileName = *fileName*/; /* create pico parser */ p = _pico_new_parser( (picoByte_t*) buffer, bufSize ); @@ -356,7 +356,7 @@ static picoModel_t *_terrain_load( PM_PARAMS_LOAD ) { /* keep the friggin compiler happy */ - *fileName = *fileName; + /**fileName = *fileName*/; /* create pico parser */ p = _pico_new_parser( (picoByte_t*) buffer, bufSize ); From 5938d4e49f1832ba10d5aa0f8c6ba09dd98cddcd Mon Sep 17 00:00:00 2001 From: Jay Dolan Date: Sat, 31 Dec 2016 16:02:08 -0500 Subject: [PATCH 22/28] Fix a handful of compiler warnings. --- libs/picomodel/picointernal.c | 2 +- radiant/brush.cpp | 14 ++++++-------- tools/quake2/extra/bsp/qbsp3/map.c | 2 -- 3 files changed, 7 insertions(+), 11 deletions(-) diff --git a/libs/picomodel/picointernal.c b/libs/picomodel/picointernal.c index c6f396ce..d9eeb656 100644 --- a/libs/picomodel/picointernal.c +++ b/libs/picomodel/picointernal.c @@ -272,7 +272,7 @@ void _pico_first_token( char *str ) { return; } while (*str && !isspace(*str)) - *str++; + str++; *str = '\0'; } diff --git a/radiant/brush.cpp b/radiant/brush.cpp index 2d07acad..cb98600d 100644 --- a/radiant/brush.cpp +++ b/radiant/brush.cpp @@ -26,7 +26,6 @@ #include "filters.h" extern MainFrame* g_pParentWnd; -extern void MemFile_fprintf( MemStream* pMemFile, const char* pText, ... ); // globals @@ -130,7 +129,6 @@ float lightaxis[3] = {0.6f, 0.8f, 1.0f}; improve recognition ================ */ -extern float ShadeForNormal( vec3_t normal ); float SetShadeForPlane( plane_t *p ){ //return ShadeForNormal(p->normal); @@ -2292,7 +2290,7 @@ face_t *Brush_Ray( vec3_t origin, vec3_t dir, brush_t *b, float *dist, int nFlag // see Brush_Draw // do some last minute filtering - if ( firstface && nFlags & SF_CAMERA ) { + if ( firstface && ( nFlags & SF_CAMERA ) ) { if ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_CAULK ) { if ( strstr( firstface->texdef.GetName(), "caulk" ) ) { *dist = 0; @@ -3060,7 +3058,7 @@ void Brush_FaceDraw( face_t *face, int nGLState ){ if ( w == NULL ) { return; } - if ( nGLState & DRAW_GL_LIGHTING && g_PrefsDlg.m_bGLLighting ) { + if ( ( nGLState & DRAW_GL_LIGHTING ) && g_PrefsDlg.m_bGLLighting ) { qglNormal3fv( face->plane.normal ); } /* @@ -3137,7 +3135,7 @@ void Brush_Draw( brush_t *b ){ if ( bTrans && !( nGLState & DRAW_GL_BLEND ) ) { continue; } - if ( !bTrans && nGLState & DRAW_GL_BLEND ) { + if ( !bTrans && ( nGLState & DRAW_GL_BLEND ) ) { continue; } @@ -3163,17 +3161,17 @@ void Brush_Draw( brush_t *b ){ } } - if ( nGLState & DRAW_GL_TEXTURE_2D && face->d_texture->name[0] == '(' ) { + if ( ( nGLState & DRAW_GL_TEXTURE_2D ) && face->d_texture->name[0] == '(' ) { prev = NULL; qglDisable( GL_TEXTURE_2D ); } - else if ( nGLState & DRAW_GL_TEXTURE_2D && ( nDrawMode == cd_texture || nDrawMode == cd_light ) && face->d_texture != prev ) { + else if ( ( nGLState & DRAW_GL_TEXTURE_2D ) && ( nDrawMode == cd_texture || nDrawMode == cd_light ) && face->d_texture != prev ) { // set the texture for this face prev = face->d_texture; qglBindTexture( GL_TEXTURE_2D, face->d_texture->texture_number ); } - if ( nGLState & DRAW_GL_LIGHTING && !g_PrefsDlg.m_bGLLighting ) { + if ( ( nGLState & DRAW_GL_LIGHTING ) && !g_PrefsDlg.m_bGLLighting ) { if ( !b->owner->eclass->fixedsize ) { material[3] = transVal; } diff --git a/tools/quake2/extra/bsp/qbsp3/map.c b/tools/quake2/extra/bsp/qbsp3/map.c index 232979c7..2af52057 100644 --- a/tools/quake2/extra/bsp/qbsp3/map.c +++ b/tools/quake2/extra/bsp/qbsp3/map.c @@ -22,8 +22,6 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA #include "qbsp.h" -extern qboolean onlyents; - int nummapbrushes; mapbrush_t mapbrushes[MAX_MAP_BRUSHES]; From d7dafaea33da0f5760454ac8a507395f24f37596 Mon Sep 17 00:00:00 2001 From: TTimo Date: Sun, 1 Jan 2017 08:30:46 -0600 Subject: [PATCH 23/28] tweak previous pull with an assert --- libs/picomodel/lwo/lwob.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/libs/picomodel/lwo/lwob.c b/libs/picomodel/lwo/lwob.c index d9786a86..a8bd25e5 100644 --- a/libs/picomodel/lwo/lwob.c +++ b/libs/picomodel/lwo/lwob.c @@ -8,6 +8,8 @@ Ernie Wright 17 Sep 00 ====================================================================== */ +#include + #include "../picointernal.h" #include "lwo2.h" @@ -391,7 +393,8 @@ lwSurface *lwGetSurface5( picoMemStream_t *fp, int cksize, lwObject *obj ){ else if ( flags & 2 ) { tex->axis = 1; } - else if ( flags & 4 ) { + else { + assert( flags & 4 ); tex->axis = 2; } From ec670ab48fe81abcc470c2073b252448e85d76fe Mon Sep 17 00:00:00 2001 From: TTimo Date: Sun, 1 Jan 2017 08:34:13 -0600 Subject: [PATCH 24/28] remove unused tex_palette --- radiant/texwindow.cpp | 9 --------- 1 file changed, 9 deletions(-) diff --git a/radiant/texwindow.cpp b/radiant/texwindow.cpp index 4e459065..87275870 100644 --- a/radiant/texwindow.cpp +++ b/radiant/texwindow.cpp @@ -50,7 +50,6 @@ #include "texmanip.h" #define TYP_MIPTEX 68 -static unsigned tex_palette[256]; #define FONT_HEIGHT 10 @@ -180,14 +179,6 @@ void Texture_InitPalette( byte *pal ){ g = gammatable[pal[1]]; b = gammatable[pal[2]]; pal += 3; - - //v = (r<<24) + (g<<16) + (b<<8) + 255; - //v = BigLong (v); - - //tex_palette[i] = v; - tex_palette[i * 3 + 0] = r; - tex_palette[i * 3 + 1] = g; - tex_palette[i * 3 + 2] = b; } } From 76a9631a1ae414b046271bb5c466986ec1b330f8 Mon Sep 17 00:00:00 2001 From: TTimo Date: Sun, 1 Jan 2017 09:07:33 -0600 Subject: [PATCH 25/28] read source file lists from .vcxproj files for SCons build --- SConscript.lib | 2 +- SConscript.module | 2 +- SConscript.q3data | 2 +- SConscript.q3map2 | 2 +- SConscript.q3map2.urt | 2 +- SConscript.radiant | 2 +- bspc | 2 +- config.py | 58 +++++++++++++++++++++---------------------- utils.py | 7 +++--- 9 files changed, 40 insertions(+), 39 deletions(-) diff --git a/SConscript.lib b/SConscript.lib index dd0988d7..0aaa81a4 100644 --- a/SConscript.lib +++ b/SConscript.lib @@ -12,7 +12,7 @@ libname = os.path.splitext( libname )[0] env = Environment( ENV = os.environ ) settings.SetupEnvironment( env, config['name'] ) -proj = utils.vcproj( os.path.join( GetLaunchDir(), project ) ) +proj = utils.vcxproj( os.path.join( GetLaunchDir(), project ) ) # some filtering. may need to improve that add_sources = [] diff --git a/SConscript.module b/SConscript.module index 9d4bdd6a..41885be8 100644 --- a/SConscript.module +++ b/SConscript.module @@ -18,7 +18,7 @@ useZ = True usePNG = True settings.SetupEnvironment( env, config['name'], useGtk = useGtk, useJPEG = useJPEG, useZ = useZ, usePNG = usePNG ) -proj = utils.vcproj( os.path.join( GetLaunchDir(), project ) ) +proj = utils.vcxproj( os.path.join( GetLaunchDir(), project ) ) # some filtering. may need to improve that add_sources = [] diff --git a/SConscript.q3data b/SConscript.q3data index c89012f2..6a089323 100644 --- a/SConscript.q3data +++ b/SConscript.q3data @@ -11,7 +11,7 @@ env = Environment( ENV = os.environ ) settings.SetupEnvironment( env, config['name'] ) env.Prepend( CPPPATH = [ '#tools/quake3/common' ] ) env.Append( LIBS = [ 'm', 'pthread' ] ) -proj = utils.vcproj( os.path.join( GetLaunchDir(), 'tools/quake3/q3data/q3data.vcproj' ) ) +proj = utils.vcxproj( os.path.join( GetLaunchDir(), 'tools/quake3/q3data/q3data.vcxproj' ) ) objects = lib_objects objects += [ os.path.join( 'tools/quake3/q3data', i ) for i in proj.getSourceFiles() ] q3data = env.Program( 'q3data', objects ) diff --git a/SConscript.q3map2 b/SConscript.q3map2 index 2c981136..8229b8c9 100644 --- a/SConscript.q3map2 +++ b/SConscript.q3map2 @@ -11,7 +11,7 @@ env = Environment( ENV = os.environ ) settings.SetupEnvironment( env, config['name'] ) env.Prepend( CPPPATH = [ '#tools/quake3/common' ] ) env.Append( LIBS = [ 'm', 'pthread', 'png', 'jpeg' ] ) -proj = utils.vcproj( os.path.join( GetLaunchDir(), 'tools/quake3/q3map2/q3map2.vcproj' ) ) +proj = utils.vcxproj( os.path.join( GetLaunchDir(), 'tools/quake3/q3map2/q3map2.vcxproj' ) ) objects = lib_objects objects += [ os.path.join( 'tools/quake3/q3map2', i ) for i in proj.getSourceFiles() ] q3map2 = env.Program( 'q3map2', objects ) diff --git a/SConscript.q3map2.urt b/SConscript.q3map2.urt index c75f73ac..baf383dc 100644 --- a/SConscript.q3map2.urt +++ b/SConscript.q3map2.urt @@ -11,7 +11,7 @@ env = Environment( ENV = os.environ ) settings.SetupEnvironment( env, config['name'] ) env.Prepend( CPPPATH = [ '#tools/quake3/common', ] ) env.Append( LIBS = [ 'm', 'pthread', 'png', 'jpeg' ] ) -proj = utils.vcproj( os.path.join( GetLaunchDir(), 'tools/urt/tools/quake3/q3map2/q3map2_urt.vcproj' ) ) +proj = utils.vcxproj( os.path.join( GetLaunchDir(), 'tools/urt/tools/quake3/q3map2/q3map2_urt.vcxproj' ) ) objects = lib_objects def keep_file( n ): diff --git a/SConscript.radiant b/SConscript.radiant index 114689aa..f3d85770 100644 --- a/SConscript.radiant +++ b/SConscript.radiant @@ -10,7 +10,7 @@ Import( [ 'utils', 'config', 'settings', 'lib_objects' ] ) env = Environment( ENV = os.environ ) settings.SetupEnvironment( env, config[ 'name' ], useGtk = True, useGtkGL = True ) env.Append( LIBS = [ 'dl' ] ) -proj = utils.vcproj( os.path.join( GetLaunchDir(), 'radiant/radiant.vcproj' ) ) +proj = utils.vcxproj( os.path.join( GetLaunchDir(), 'radiant/radiant.vcxproj' ) ) radiant = env.Program( 'radiant.bin', lib_objects + [ os.path.join( 'radiant', i ) for i in proj.getSourceFiles() ] ) diff --git a/bspc b/bspc index a1287590..2c840783 160000 --- a/bspc +++ b/bspc @@ -1 +1 @@ -Subproject commit a1287590f17c35a612f33708aeec5815402866b8 +Subproject commit 2c8407838398608cb9c52abae046987bb7a39c08 diff --git a/config.py b/config.py index 10d3ed7e..c91914a9 100644 --- a/config.py +++ b/config.py @@ -72,7 +72,7 @@ class Config: build_dir = os.path.join( 'build', config_name, 'radiant' ) VariantDir( build_dir, '.', duplicate = 0 ) lib_objects = [] - for project in [ 'libs/synapse/synapse.vcproj', 'libs/cmdlib/cmdlib.vcproj', 'libs/mathlib/mathlib.vcproj', 'libs/l_net/l_net.vcproj' ]: + for project in [ 'libs/synapse/synapse.vcxproj', 'libs/cmdlib/cmdlib.vcxproj', 'libs/mathlib/mathlib.vcxproj', 'libs/l_net/l_net.vcxproj' ]: Export( 'project' ) lib_objects += SConscript( os.path.join( build_dir, 'SConscript.lib' ) ) Export( 'lib_objects' ) @@ -81,7 +81,7 @@ class Config: # PIC versions of the libs for the modules shlib_objects_extra = {} - for project in [ 'libs/synapse/synapse.vcproj', 'libs/mathlib/mathlib.vcproj', 'libs/picomodel/picomodel.vcproj', 'libs/cmdlib/cmdlib.vcproj', 'libs/splines/splines.vcproj' ]: + for project in [ 'libs/synapse/synapse.vcxproj', 'libs/mathlib/mathlib.vcxproj', 'libs/picomodel/picomodel.vcxproj', 'libs/cmdlib/cmdlib.vcxproj', 'libs/splines/splines.vcxproj' ]: ( libpath, libname ) = os.path.split( project ) libname = os.path.splitext( libname )[0] config['shared'] = True @@ -90,31 +90,31 @@ class Config: VariantDir( build_dir, '.', duplicate = 0 ) shlib_objects_extra[libname] = SConscript( os.path.join( build_dir, 'SConscript.lib' ) ) - for project in [ 'plugins/vfsqlpk3/vfsqlpk3.vcproj', - 'plugins/vfspk3/vfspk3.vcproj', - 'plugins/vfspak/vfspak.vcproj', - 'plugins/vfswad/vfswad.vcproj', - 'plugins/eclassfgd/fgd.vcproj', - 'plugins/entity/entity.vcproj', - 'plugins/image/image.vcproj', - 'plugins/model/model.vcproj', - 'plugins/imagepng/imagepng.vcproj', - 'plugins/imagewal/imagewal.vcproj', - 'plugins/imagehl/imagehl.vcproj', - 'plugins/imagem8/imagem8.vcproj', - 'plugins/spritemodel/spritemodel.vcproj', - 'plugins/textool/textool.vcproj', - 'plugins/map/map.vcproj', - 'plugins/mapxml/mapxml.vcproj', - 'plugins/shaders/shaders.vcproj', - 'plugins/surface/surface.vcproj', - 'plugins/surface_idtech2/surface_idtech2.vcproj', - 'contrib/camera/camera.vcproj', - 'contrib/prtview/prtview.vcproj', - 'contrib/hydratoolz/hydratoolz.vcproj', - 'contrib/bobtoolz/bobtoolz.vcproj', - 'contrib/gtkgensurf/gtkgensurf.vcproj', - 'contrib/bkgrnd2d/bkgrnd2d.vcproj' + for project in [ 'plugins/vfsqlpk3/vfsqlpk3.vcxproj', + 'plugins/vfspk3/vfspk3.vcxproj', + 'plugins/vfspak/vfspak.vcxproj', + 'plugins/vfswad/vfswad.vcxproj', + 'plugins/eclassfgd/fgd.vcxproj', + 'plugins/entity/entity.vcxproj', + 'plugins/image/image.vcxproj', + 'plugins/model/model.vcxproj', + 'plugins/imagepng/imagepng.vcxproj', + 'plugins/imagewal/imagewal.vcxproj', + 'plugins/imagehl/imagehl.vcxproj', + 'plugins/imagem8/imagem8.vcxproj', + 'plugins/spritemodel/spritemodel.vcxproj', + 'plugins/textool/textool.vcxproj', + 'plugins/map/map.vcxproj', + 'plugins/mapxml/mapxml.vcxproj', + 'plugins/shaders/shaders.vcxproj', + 'plugins/surface/surface.vcxproj', + 'plugins/surface_idtech2/surface_idtech2.vcxproj', + 'contrib/camera/camera.vcxproj', + 'contrib/prtview/prtview.vcxproj', + 'contrib/hydratoolz/hydratoolz.vcxproj', + 'contrib/bobtoolz/bobtoolz.vcxproj', + 'contrib/gtkgensurf/gtkgensurf.vcxproj', + 'contrib/bkgrnd2d/bkgrnd2d.vcxproj' ]: ( libpath, libname ) = os.path.split( project ) libname = os.path.splitext( libname )[0] @@ -158,7 +158,7 @@ class Config: build_dir = os.path.join( 'build', config_name, compiler_name ) VariantDir( build_dir, '.', duplicate = 0 ) lib_objects = [] - for project in [ 'tools/quake3/common/quake3-common.vcproj', 'libs/mathlib/mathlib.vcproj', 'libs/l_net/l_net.vcproj', 'libs/ddslib/ddslib.vcproj', 'libs/picomodel/picomodel.vcproj', 'libs/md5lib/md5lib.vcproj' ]: + for project in [ 'tools/quake3/common/quake3-common.vcxproj', 'libs/mathlib/mathlib.vcxproj', 'libs/l_net/l_net.vcxproj', 'libs/ddslib/ddslib.vcxproj', 'libs/picomodel/picomodel.vcxproj', 'libs/md5lib/md5lib.vcxproj' ]: Export( 'project' ) lib_objects += SConscript( os.path.join( build_dir, 'SConscript.lib' ) ) Export( 'lib_objects' ) @@ -176,7 +176,7 @@ class Config: build_dir = os.path.join( 'build', config_name, 'q3data' ) VariantDir( build_dir, '.', duplicate = 0 ) lib_objects = [] - for project in [ 'libs/mathlib/mathlib.vcproj', 'libs/l_net/l_net.vcproj', 'libs/ddslib/ddslib.vcproj' ]: + for project in [ 'libs/mathlib/mathlib.vcxproj', 'libs/l_net/l_net.vcxproj', 'libs/ddslib/ddslib.vcxproj' ]: Export( 'project' ) lib_objects += SConscript( os.path.join( build_dir, 'SConscript.lib' ) ) Export( 'lib_objects' ) diff --git a/utils.py b/utils.py index ca70ceb9..9521672c 100644 --- a/utils.py +++ b/utils.py @@ -5,7 +5,7 @@ import os, commands, platform, xml.sax, re, string, platform -class vcproj( xml.sax.handler.ContentHandler ): +class vcxproj( xml.sax.handler.ContentHandler ): def __init__( self, filepath ): self.source_files = [] self.misc_files = [] @@ -29,8 +29,9 @@ class vcproj( xml.sax.handler.ContentHandler ): return ( match, nomatch ) def startElement( self, name, attrs ): - if ( name == 'File' ): - self._files.append( attrs.getValue('RelativePath') ) + if ( name == 'ClCompile' ): + if ( attrs.has_key('Include') ): + self._files.append( attrs.getValue('Include') ) def endDocument( self ): # split into source and headers, remap path seperator to the platform From a26c818a1ec54a733bc34fc97ff6739daec746bf Mon Sep 17 00:00:00 2001 From: TTimo Date: Sun, 1 Jan 2017 09:08:37 -0600 Subject: [PATCH 26/28] remove the old .vcproj --- contrib/bkgrnd2d/bkgrnd2d.vcproj | 195 --- contrib/bobtoolz/bobtoolz.vcproj | 292 ----- contrib/camera/camera.vcproj | 211 --- contrib/gtkgensurf/gtkgensurf.vcproj | 227 ---- contrib/hydratoolz/hydratoolz.vcproj | 187 --- contrib/prtview/prtview.vcproj | 207 --- libs/cmdlib/cmdlib.vcproj | 155 --- libs/ddslib/ddslib.vcproj | 153 --- libs/l_net/l_net.vcproj | 157 --- libs/mathlib/mathlib.vcproj | 165 --- libs/md5lib/md5lib.vcproj | 159 --- libs/picomodel/picomodel.vcproj | 248 ---- libs/splines/splines.vcproj | 183 --- libs/synapse/synapse.vcproj | 155 --- plugins/eclassfgd/fgd.vcproj | 187 --- plugins/entity/entity.vcproj | 207 --- plugins/image/image.vcproj | 199 --- plugins/imagehl/imagehl.vcproj | 191 --- plugins/imagem8/imagem8.vcproj | 195 --- plugins/imagepng/imagepng.vcproj | 187 --- plugins/imagewal/imagewal.vcproj | 191 --- plugins/map/map.vcproj | 195 --- plugins/mapxml/mapxml.vcproj | 195 --- plugins/model/model.vcproj | 203 --- plugins/shaders/shaders.vcproj | 191 --- plugins/spritemodel/spritemodel.vcproj | 191 --- plugins/surface/surface.vcproj | 191 --- .../surface_idtech2/surface_idtech2.vcproj | 195 --- plugins/textool/textool.vcproj | 199 --- plugins/vfspak/vfspak.vcproj | 191 --- plugins/vfspk3/vfspk3.vcproj | 195 --- plugins/vfsqlpk3/vfsqlpk3.vcproj | 200 --- plugins/vfswad/vfswad.vcproj | 195 --- radiant/radiant.vcproj | 402 ------ tools/quake3/common/quake3-common.vcproj | 191 --- tools/quake3/q3data/q3data.vcproj | 279 ---- tools/quake3/q3map2/q3map2.vcproj | 362 ------ .../urt/tools/quake3/q3map2/q3map2_urt.vcproj | 1155 ----------------- 38 files changed, 8781 deletions(-) delete mode 100644 contrib/bkgrnd2d/bkgrnd2d.vcproj delete mode 100644 contrib/bobtoolz/bobtoolz.vcproj delete mode 100644 contrib/camera/camera.vcproj delete mode 100644 contrib/gtkgensurf/gtkgensurf.vcproj delete mode 100644 contrib/hydratoolz/hydratoolz.vcproj delete mode 100644 contrib/prtview/prtview.vcproj delete mode 100644 libs/cmdlib/cmdlib.vcproj delete mode 100644 libs/ddslib/ddslib.vcproj delete mode 100644 libs/l_net/l_net.vcproj delete mode 100644 libs/mathlib/mathlib.vcproj delete mode 100644 libs/md5lib/md5lib.vcproj delete mode 100644 libs/picomodel/picomodel.vcproj delete mode 100644 libs/splines/splines.vcproj delete mode 100644 libs/synapse/synapse.vcproj delete mode 100644 plugins/eclassfgd/fgd.vcproj delete mode 100644 plugins/entity/entity.vcproj delete mode 100644 plugins/image/image.vcproj delete mode 100644 plugins/imagehl/imagehl.vcproj delete mode 100644 plugins/imagem8/imagem8.vcproj delete mode 100644 plugins/imagepng/imagepng.vcproj delete mode 100644 plugins/imagewal/imagewal.vcproj delete mode 100644 plugins/map/map.vcproj delete mode 100644 plugins/mapxml/mapxml.vcproj delete mode 100644 plugins/model/model.vcproj delete mode 100644 plugins/shaders/shaders.vcproj delete mode 100644 plugins/spritemodel/spritemodel.vcproj delete mode 100644 plugins/surface/surface.vcproj delete mode 100644 plugins/surface_idtech2/surface_idtech2.vcproj delete mode 100644 plugins/textool/textool.vcproj delete mode 100644 plugins/vfspak/vfspak.vcproj delete mode 100644 plugins/vfspk3/vfspk3.vcproj delete mode 100644 plugins/vfsqlpk3/vfsqlpk3.vcproj delete mode 100644 plugins/vfswad/vfswad.vcproj delete mode 100644 radiant/radiant.vcproj delete mode 100644 tools/quake3/common/quake3-common.vcproj delete mode 100644 tools/quake3/q3data/q3data.vcproj delete mode 100644 tools/quake3/q3map2/q3map2.vcproj delete mode 100644 tools/urt/tools/quake3/q3map2/q3map2_urt.vcproj diff --git a/contrib/bkgrnd2d/bkgrnd2d.vcproj b/contrib/bkgrnd2d/bkgrnd2d.vcproj deleted file mode 100644 index cdaa3c9f..00000000 --- a/contrib/bkgrnd2d/bkgrnd2d.vcproj +++ /dev/null @@ -1,195 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/contrib/bobtoolz/bobtoolz.vcproj b/contrib/bobtoolz/bobtoolz.vcproj deleted file mode 100644 index c8b8609f..00000000 --- a/contrib/bobtoolz/bobtoolz.vcproj +++ /dev/null @@ -1,292 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/contrib/camera/camera.vcproj b/contrib/camera/camera.vcproj deleted file mode 100644 index 4aa51dbd..00000000 --- a/contrib/camera/camera.vcproj +++ /dev/null @@ -1,211 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/contrib/gtkgensurf/gtkgensurf.vcproj b/contrib/gtkgensurf/gtkgensurf.vcproj deleted file mode 100644 index 5782132c..00000000 --- a/contrib/gtkgensurf/gtkgensurf.vcproj +++ /dev/null @@ -1,227 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/contrib/hydratoolz/hydratoolz.vcproj b/contrib/hydratoolz/hydratoolz.vcproj deleted file mode 100644 index 9e327ea2..00000000 --- a/contrib/hydratoolz/hydratoolz.vcproj +++ /dev/null @@ -1,187 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/contrib/prtview/prtview.vcproj b/contrib/prtview/prtview.vcproj deleted file mode 100644 index 332ddd8f..00000000 --- a/contrib/prtview/prtview.vcproj +++ /dev/null @@ -1,207 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/libs/cmdlib/cmdlib.vcproj b/libs/cmdlib/cmdlib.vcproj deleted file mode 100644 index 94d4c253..00000000 --- a/libs/cmdlib/cmdlib.vcproj +++ /dev/null @@ -1,155 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/libs/ddslib/ddslib.vcproj b/libs/ddslib/ddslib.vcproj deleted file mode 100644 index b0b689c0..00000000 --- a/libs/ddslib/ddslib.vcproj +++ /dev/null @@ -1,153 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/libs/l_net/l_net.vcproj b/libs/l_net/l_net.vcproj deleted file mode 100644 index dd883685..00000000 --- a/libs/l_net/l_net.vcproj +++ /dev/null @@ -1,157 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/libs/mathlib/mathlib.vcproj b/libs/mathlib/mathlib.vcproj deleted file mode 100644 index 55ec5ee5..00000000 --- a/libs/mathlib/mathlib.vcproj +++ /dev/null @@ -1,165 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/libs/md5lib/md5lib.vcproj b/libs/md5lib/md5lib.vcproj deleted file mode 100644 index 8da037cb..00000000 --- a/libs/md5lib/md5lib.vcproj +++ /dev/null @@ -1,159 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/libs/picomodel/picomodel.vcproj b/libs/picomodel/picomodel.vcproj deleted file mode 100644 index 0ef3325f..00000000 --- a/libs/picomodel/picomodel.vcproj +++ /dev/null @@ -1,248 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/libs/splines/splines.vcproj b/libs/splines/splines.vcproj deleted file mode 100644 index 83cc0c3f..00000000 --- a/libs/splines/splines.vcproj +++ /dev/null @@ -1,183 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/libs/synapse/synapse.vcproj b/libs/synapse/synapse.vcproj deleted file mode 100644 index 95b4dbc2..00000000 --- a/libs/synapse/synapse.vcproj +++ /dev/null @@ -1,155 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/plugins/eclassfgd/fgd.vcproj b/plugins/eclassfgd/fgd.vcproj deleted file mode 100644 index 9a42231c..00000000 --- a/plugins/eclassfgd/fgd.vcproj +++ /dev/null @@ -1,187 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/plugins/entity/entity.vcproj b/plugins/entity/entity.vcproj deleted file mode 100644 index da817127..00000000 --- a/plugins/entity/entity.vcproj +++ /dev/null @@ -1,207 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/plugins/image/image.vcproj b/plugins/image/image.vcproj deleted file mode 100644 index f9cb3034..00000000 --- a/plugins/image/image.vcproj +++ /dev/null @@ -1,199 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/plugins/imagehl/imagehl.vcproj b/plugins/imagehl/imagehl.vcproj deleted file mode 100644 index 53079916..00000000 --- a/plugins/imagehl/imagehl.vcproj +++ /dev/null @@ -1,191 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/plugins/imagem8/imagem8.vcproj b/plugins/imagem8/imagem8.vcproj deleted file mode 100644 index bbba695d..00000000 --- a/plugins/imagem8/imagem8.vcproj +++ /dev/null @@ -1,195 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/plugins/imagepng/imagepng.vcproj b/plugins/imagepng/imagepng.vcproj deleted file mode 100644 index a2a83e3b..00000000 --- a/plugins/imagepng/imagepng.vcproj +++ /dev/null @@ -1,187 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/plugins/imagewal/imagewal.vcproj b/plugins/imagewal/imagewal.vcproj deleted file mode 100644 index 7cd92f5b..00000000 --- a/plugins/imagewal/imagewal.vcproj +++ /dev/null @@ -1,191 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/plugins/map/map.vcproj b/plugins/map/map.vcproj deleted file mode 100644 index c93a5d2d..00000000 --- a/plugins/map/map.vcproj +++ /dev/null @@ -1,195 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/plugins/mapxml/mapxml.vcproj b/plugins/mapxml/mapxml.vcproj deleted file mode 100644 index 978f16cb..00000000 --- a/plugins/mapxml/mapxml.vcproj +++ /dev/null @@ -1,195 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/plugins/model/model.vcproj b/plugins/model/model.vcproj deleted file mode 100644 index 8ed2f449..00000000 --- a/plugins/model/model.vcproj +++ /dev/null @@ -1,203 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/plugins/shaders/shaders.vcproj b/plugins/shaders/shaders.vcproj deleted file mode 100644 index 7b55902d..00000000 --- a/plugins/shaders/shaders.vcproj +++ /dev/null @@ -1,191 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/plugins/spritemodel/spritemodel.vcproj b/plugins/spritemodel/spritemodel.vcproj deleted file mode 100644 index 1e18ddf3..00000000 --- a/plugins/spritemodel/spritemodel.vcproj +++ /dev/null @@ -1,191 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/plugins/surface/surface.vcproj b/plugins/surface/surface.vcproj deleted file mode 100644 index 9b775485..00000000 --- a/plugins/surface/surface.vcproj +++ /dev/null @@ -1,191 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/plugins/surface_idtech2/surface_idtech2.vcproj b/plugins/surface_idtech2/surface_idtech2.vcproj deleted file mode 100644 index f5d9e256..00000000 --- a/plugins/surface_idtech2/surface_idtech2.vcproj +++ /dev/null @@ -1,195 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/plugins/textool/textool.vcproj b/plugins/textool/textool.vcproj deleted file mode 100644 index 0c769bce..00000000 --- a/plugins/textool/textool.vcproj +++ /dev/null @@ -1,199 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/plugins/vfspak/vfspak.vcproj b/plugins/vfspak/vfspak.vcproj deleted file mode 100644 index 51bc322b..00000000 --- a/plugins/vfspak/vfspak.vcproj +++ /dev/null @@ -1,191 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/plugins/vfspk3/vfspk3.vcproj b/plugins/vfspk3/vfspk3.vcproj deleted file mode 100644 index d8ccc438..00000000 --- a/plugins/vfspk3/vfspk3.vcproj +++ /dev/null @@ -1,195 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/plugins/vfsqlpk3/vfsqlpk3.vcproj b/plugins/vfsqlpk3/vfsqlpk3.vcproj deleted file mode 100644 index 152b6fed..00000000 --- a/plugins/vfsqlpk3/vfsqlpk3.vcproj +++ /dev/null @@ -1,200 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/plugins/vfswad/vfswad.vcproj b/plugins/vfswad/vfswad.vcproj deleted file mode 100644 index e10730c6..00000000 --- a/plugins/vfswad/vfswad.vcproj +++ /dev/null @@ -1,195 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/radiant/radiant.vcproj b/radiant/radiant.vcproj deleted file mode 100644 index 81af2a28..00000000 --- a/radiant/radiant.vcproj +++ /dev/null @@ -1,402 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/quake3/common/quake3-common.vcproj b/tools/quake3/common/quake3-common.vcproj deleted file mode 100644 index f6179cef..00000000 --- a/tools/quake3/common/quake3-common.vcproj +++ /dev/null @@ -1,191 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/quake3/q3data/q3data.vcproj b/tools/quake3/q3data/q3data.vcproj deleted file mode 100644 index f09923a2..00000000 --- a/tools/quake3/q3data/q3data.vcproj +++ /dev/null @@ -1,279 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/quake3/q3map2/q3map2.vcproj b/tools/quake3/q3map2/q3map2.vcproj deleted file mode 100644 index b71a4459..00000000 --- a/tools/quake3/q3map2/q3map2.vcproj +++ /dev/null @@ -1,362 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/urt/tools/quake3/q3map2/q3map2_urt.vcproj b/tools/urt/tools/quake3/q3map2/q3map2_urt.vcproj deleted file mode 100644 index 3cdd42cf..00000000 --- a/tools/urt/tools/quake3/q3map2/q3map2_urt.vcproj +++ /dev/null @@ -1,1155 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - From d90ddd6cf87fadc0668b2bcaaa6330bb910e1baa Mon Sep 17 00:00:00 2001 From: Pan7 Date: Tue, 21 Feb 2017 18:45:37 +0100 Subject: [PATCH 27/28] Fix obj crash (#399) --- libs/picomodel/pm_obj.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/libs/picomodel/pm_obj.c b/libs/picomodel/pm_obj.c index a8b1dfed..05221fe5 100644 --- a/libs/picomodel/pm_obj.c +++ b/libs/picomodel/pm_obj.c @@ -863,12 +863,15 @@ static picoModel_t *_obj_load( PM_PARAMS_LOAD ){ else if ( !_pico_stricmp( p->token, "usemtl" ) ) { char *materialName; materialName = _pico_parse( p, 0 ); - if( materialName || strlen( materialName ) ) { + if( materialName && strlen( materialName ) ) { picoShader_t *shader; shader = PicoFindShader( model, materialName, 0 ); if( !shader ) { shader = PicoNewShader( model ); - PicoSetShaderName( shader, materialName ); + if( shader ) { + PicoSetShaderMapName( shader, materialName ); + PicoSetShaderName( shader, materialName ); + } } if( shader && curSurface ) { PicoSetSurfaceShader( curSurface, shader ); From 3bc866b62391d4427c098ca62e1d7962a769fdca Mon Sep 17 00:00:00 2001 From: Pan7 Date: Tue, 21 Feb 2017 18:45:49 +0100 Subject: [PATCH 28/28] Don't free buffer of another scope (#401) --- libs/picomodel/picomodel.c | 1 - 1 file changed, 1 deletion(-) diff --git a/libs/picomodel/picomodel.c b/libs/picomodel/picomodel.c index b8f185cd..8fad3383 100644 --- a/libs/picomodel/picomodel.c +++ b/libs/picomodel/picomodel.c @@ -151,7 +151,6 @@ picoModel_t *PicoModuleLoadModel( const picoModule_t* pm, char* fileName, picoBy /* use loader provided by module to read the model data */ picoModel_t* model = pm->load( fileName, frameNum, buffer, bufSize ); if ( model == NULL ) { - _pico_free_file( buffer ); return NULL; }