* improved quake2 support by added a quake2 boolean to the CGameDescription class...
authormattn <mattn>
Tue, 4 Mar 2008 17:33:05 +0000 (17:33 +0000)
committermattn <mattn>
Tue, 4 Mar 2008 17:33:05 +0000 (17:33 +0000)
* added support for relative md2 skin paths
* fixed wrong _pico_printf call

git-svn-id: svn://svn.icculus.org/gtkradiant/GtkRadiant/branches/ZeroRadiant@203 8a3a26a2-13c4-0310-b231-cf6edde360e5

libs/picomodel/pm_md2.c
radiant/preferences.cpp
radiant/preferences.h
radiant/surfaceplugin.cpp

index 8a603a5d0fa09b596993b0e6013f8278c838b757..b0ff40ca8f739a94f3f32ee96e29b3fc3f06988f 100644 (file)
@@ -337,9 +337,10 @@ static picoModel_t *_md2_load( PM_PARAMS_LOAD )
        index_DUP_LUT_t *p_index_LUT_DUPS;
        md2Triangle_t   *p_md2Triangle;
 
+       char                    path[ MD2_MAX_SKINNAME ];
        char                    skinname[ MD2_MAX_SKINNAME ];
-       md2_t                   *md2;
-       md2St_t                 *texCoord;
+       md2_t                   *md2;
+       md2St_t                 *texCoord;
        md2Frame_t              *frame;
        md2Triangle_t   *triangle;
        md2XyzNormal_t  *vertex;
@@ -435,8 +436,25 @@ static picoModel_t *_md2_load( PM_PARAMS_LOAD )
        strncpy(skinname, (bb + md2->ofsSkins), MD2_MAX_SKINNAME );
 
        // Print out md2 values
-       _pico_printf(PICO_VERBOSE,"Skins: %d  Verts: %d  STs: %d  Triangles: %d  Frames: %d\nSkin Name \"%s\"\n", md2->numSkins, md2->numXYZ, md2->numST, md2->numTris, md2->numFrames, &skinname );
+       _pico_printf(PICO_VERBOSE,"Skins: %d  Verts: %d  STs: %d  Triangles: %d  Frames: %d\nSkin Name \"%s\"\n", md2->numSkins, md2->numXYZ, md2->numST, md2->numTris, md2->numFrames, skinname );
+
+       // relative texture path - allows moving of models in game dir structure without changing the skinpath
+       // e.g. used in ufo:ai
+       if (skinname[0] == '.') {
+               strncpy(path, fileName, MD2_MAX_SKINNAME);
+               for (i = MD2_MAX_SKINNAME; i--;) {
+                       // skip filename
+                       if (path[i] == '/' || path[i] == '\\')
+                               break;
+                       path[i] = '\0';
+               }
+               strncat(path, &skinname[1], MD2_MAX_SKINNAME);
+               strncpy(skinname, path, MD2_MAX_SKINNAME);
 
+               // Print out md2 values
+               _pico_printf(PICO_VERBOSE,"Relative skin path converted to: \"%s\" (%s)\n", skinname, fileName );
+       }
+       
        // detox Skin name
        _pico_setfext( skinname, "" );
        _pico_unixify( skinname );
index 3090695e94ccb31c1baaee1d5f64f41e3e4caf7e..88fb4fe450c30e2ab4ff4e78afbdd974dd134647 100644 (file)
@@ -746,6 +746,18 @@ CGameDescription::CGameDescription(xmlDocPtr pDoc, const Str &GameFile)
 
   mGameFile = GameFile;
 
+  prop = (char*)xmlGetProp(pNode, (xmlChar*)"quake2");
+  if (prop == NULL)
+  {
+    // default
+    quake2 = false;
+  }
+  else
+  {
+    quake2 = true;
+    xmlFree(prop);
+  }
+
   prop = (char*)xmlGetProp(pNode, (xmlChar*)"basegame");
   if (prop == NULL)
   {
index dfc1be5c7424b839f56b5b0edca517739123b15e..79df8700aa3a421c65456b2eccc27da240aeaef2 100644 (file)
@@ -180,6 +180,7 @@ public:
   bool mEClassSingleLoad; ///< only load a single eclass definition file
   bool mNoPatch; ///< this game doesn't support patch technology
   Str mCaulkShader; ///< the shader to use for caulking
+  bool quake2; ///< set this to true to get quake2
 
   CGameDescription() { mpDoc = NULL; }
   /*!
index 3a1ef3065cea50b3fced4eff0752d93a8f0ad8d3..320ee86cb786354fbe3c1da6bf2e7ea01027f9b7 100644 (file)
@@ -168,7 +168,7 @@ void SI_SetTexdef_FaceList(texdef_to_face_t* texdef_face_list, bool b_SetUndoPoi
   texdef_to_face_t* texdef_to_face;
   bool b_isQuake2;
 
-  if ( ( g_pGameDescription->mGameFile == "q2.game" ) || ( g_pGameDescription->mGameFile == "heretic2.game" ) )
+  if ( ( g_pGameDescription->quake2 ) || ( g_pGameDescription->mGameFile == "q2.game" ) || ( g_pGameDescription->mGameFile == "heretic2.game" ) )
     b_isQuake2 = true;
   else
     b_isQuake2 = false;