View Issue Details
| ID | Project | Category | View Status | Date Submitted | Last Update | 
|---|---|---|---|---|---|
| 0002137 | DarkRadiant | Models | public | 06.02.2010 22:53 | 23.08.2011 11:49 | 
| Reporter | mattn | Assigned To | |||
| Priority | normal | Severity | normal | Reproducibility | sometimes | 
| Status | confirmed | Resolution | no change required | ||
| Product Version | 1.1.0 | ||||
| Fixed in Version | 1.2.0 | ||||
| Summary | 0002137: picomodel md2 texture coords broken | ||||
| Description | i know this is not really a dr issue - as darkmod does not support md2 anymore - but still, loading such a model can result (for some models) in broken texcoords. maybe other models are affected, too - or maybe md2 is affected. haven't investigated any further. maybe it's an option for you to switch to a model library that is in active development - e.g. something like libg3d, making dr support more model formats or import/export them from several formats into several other formats would be a cool feature imo. | ||||
| Tags | No tags attached. | ||||
| Attached Files |  skins.diff (16,543 bytes)   
 Index: picomodel/pm_md2.c
===================================================================
--- picomodel/pm_md2.c	(Revision 62)
+++ picomodel/pm_md2.c	(Arbeitskopie)
@@ -1,6 +1,6 @@
 /* -----------------------------------------------------------------------------
 
-PicoModel Library 
+PicoModel Library
 
 Copyright (c) 2002, Randy Reddig & seaw0lf
 All rights reserved.
@@ -17,7 +17,7 @@
 
 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. 
+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
@@ -132,167 +132,167 @@
 float	md2_normals[ MD2_NUMVERTEXNORMALS ][ 3 ] =
 {
 	{ -0.525731f, 0.000000f, 0.850651f },
-	{ -0.442863f, 0.238856f, 0.864188f }, 
-	{ -0.295242f, 0.000000f, 0.955423f }, 
-	{ -0.309017f, 0.500000f, 0.809017f }, 
-	{ -0.162460f, 0.262866f, 0.951056f }, 
+	{ -0.442863f, 0.238856f, 0.864188f },
+	{ -0.295242f, 0.000000f, 0.955423f },
+	{ -0.309017f, 0.500000f, 0.809017f },
+	{ -0.162460f, 0.262866f, 0.951056f },
 	{ 0.000000f, 0.000000f, 1.000000f },
 	{ 0.000000f, 0.850651f, 0.525731f },
 	{ -0.147621f, 0.716567f, 0.681718f },
-	{ 0.147621f, 0.716567f, 0.681718f }, 
-	{ 0.000000f, 0.525731f, 0.850651f }, 
-	{ 0.309017f, 0.500000f, 0.809017f }, 
-	{ 0.525731f, 0.000000f, 0.850651f }, 
-	{ 0.295242f, 0.000000f, 0.955423f }, 
-	{ 0.442863f, 0.238856f, 0.864188f }, 
-	{ 0.162460f, 0.262866f, 0.951056f }, 
-	{ -0.681718f, 0.147621f, 0.716567f }, 
-	{ -0.809017f, 0.309017f, 0.500000f }, 
-	{ -0.587785f, 0.425325f, 0.688191f }, 
-	{ -0.850651f, 0.525731f, 0.000000f }, 
-	{ -0.864188f, 0.442863f, 0.238856f }, 
-	{ -0.716567f, 0.681718f, 0.147621f }, 
-	{ -0.688191f, 0.587785f, 0.425325f }, 
-	{ -0.500000f, 0.809017f, 0.309017f }, 
-	{ -0.238856f, 0.864188f, 0.442863f }, 
-	{ -0.425325f, 0.688191f, 0.587785f }, 
-	{ -0.716567f, 0.681718f, -0.147621f }, 
-	{ -0.500000f, 0.809017f, -0.309017f }, 
-	{ -0.525731f, 0.850651f, 0.000000f }, 
-	{ 0.000000f, 0.850651f, -0.525731f }, 
-	{ -0.238856f, 0.864188f, -0.442863f }, 
-	{ 0.000000f, 0.955423f, -0.295242f }, 
-	{ -0.262866f, 0.951056f, -0.162460f }, 
-	{ 0.000000f, 1.000000f, 0.000000f }, 
-	{ 0.000000f, 0.955423f, 0.295242f }, 
-	{ -0.262866f, 0.951056f, 0.162460f }, 
-	{ 0.238856f, 0.864188f, 0.442863f }, 
-	{ 0.262866f, 0.951056f, 0.162460f }, 
-	{ 0.500000f, 0.809017f, 0.309017f }, 
-	{ 0.238856f, 0.864188f, -0.442863f }, 
-	{ 0.262866f, 0.951056f, -0.162460f }, 
-	{ 0.500000f, 0.809017f, -0.309017f }, 
-	{ 0.850651f, 0.525731f, 0.000000f }, 
-	{ 0.716567f, 0.681718f, 0.147621f }, 
-	{ 0.716567f, 0.681718f, -0.147621f }, 
-	{ 0.525731f, 0.850651f, 0.000000f }, 
-	{ 0.425325f, 0.688191f, 0.587785f }, 
-	{ 0.864188f, 0.442863f, 0.238856f }, 
-	{ 0.688191f, 0.587785f, 0.425325f }, 
-	{ 0.809017f, 0.309017f, 0.500000f }, 
-	{ 0.681718f, 0.147621f, 0.716567f }, 
-	{ 0.587785f, 0.425325f, 0.688191f }, 
-	{ 0.955423f, 0.295242f, 0.000000f }, 
-	{ 1.000000f, 0.000000f, 0.000000f }, 
-	{ 0.951056f, 0.162460f, 0.262866f }, 
-	{ 0.850651f, -0.525731f, 0.000000f }, 
-	{ 0.955423f, -0.295242f, 0.000000f }, 
-	{ 0.864188f, -0.442863f, 0.238856f }, 
-	{ 0.951056f, -0.162460f, 0.262866f }, 
-	{ 0.809017f, -0.309017f, 0.500000f }, 
-	{ 0.681718f, -0.147621f, 0.716567f }, 
-	{ 0.850651f, 0.000000f, 0.525731f }, 
-	{ 0.864188f, 0.442863f, -0.238856f }, 
-	{ 0.809017f, 0.309017f, -0.500000f }, 
-	{ 0.951056f, 0.162460f, -0.262866f }, 
-	{ 0.525731f, 0.000000f, -0.850651f }, 
-	{ 0.681718f, 0.147621f, -0.716567f }, 
-	{ 0.681718f, -0.147621f, -0.716567f }, 
-	{ 0.850651f, 0.000000f, -0.525731f }, 
-	{ 0.809017f, -0.309017f, -0.500000f }, 
-	{ 0.864188f, -0.442863f, -0.238856f }, 
-	{ 0.951056f, -0.162460f, -0.262866f }, 
-	{ 0.147621f, 0.716567f, -0.681718f }, 
-	{ 0.309017f, 0.500000f, -0.809017f }, 
-	{ 0.425325f, 0.688191f, -0.587785f }, 
-	{ 0.442863f, 0.238856f, -0.864188f }, 
-	{ 0.587785f, 0.425325f, -0.688191f }, 
-	{ 0.688191f, 0.587785f, -0.425325f }, 
-	{ -0.147621f, 0.716567f, -0.681718f }, 
-	{ -0.309017f, 0.500000f, -0.809017f }, 
-	{ 0.000000f, 0.525731f, -0.850651f }, 
-	{ -0.525731f, 0.000000f, -0.850651f }, 
-	{ -0.442863f, 0.238856f, -0.864188f }, 
-	{ -0.295242f, 0.000000f, -0.955423f }, 
-	{ -0.162460f, 0.262866f, -0.951056f }, 
-	{ 0.000000f, 0.000000f, -1.000000f }, 
-	{ 0.295242f, 0.000000f, -0.955423f }, 
-	{ 0.162460f, 0.262866f, -0.951056f }, 
-	{ -0.442863f, -0.238856f, -0.864188f }, 
-	{ -0.309017f, -0.500000f, -0.809017f }, 
-	{ -0.162460f, -0.262866f, -0.951056f }, 
-	{ 0.000000f, -0.850651f, -0.525731f }, 
-	{ -0.147621f, -0.716567f, -0.681718f }, 
-	{ 0.147621f, -0.716567f, -0.681718f }, 
-	{ 0.000000f, -0.525731f, -0.850651f }, 
-	{ 0.309017f, -0.500000f, -0.809017f }, 
-	{ 0.442863f, -0.238856f, -0.864188f }, 
-	{ 0.162460f, -0.262866f, -0.951056f }, 
-	{ 0.238856f, -0.864188f, -0.442863f }, 
-	{ 0.500000f, -0.809017f, -0.309017f }, 
-	{ 0.425325f, -0.688191f, -0.587785f }, 
-	{ 0.716567f, -0.681718f, -0.147621f }, 
-	{ 0.688191f, -0.587785f, -0.425325f }, 
-	{ 0.587785f, -0.425325f, -0.688191f }, 
-	{ 0.000000f, -0.955423f, -0.295242f }, 
-	{ 0.000000f, -1.000000f, 0.000000f }, 
-	{ 0.262866f, -0.951056f, -0.162460f }, 
-	{ 0.000000f, -0.850651f, 0.525731f }, 
-	{ 0.000000f, -0.955423f, 0.295242f }, 
-	{ 0.238856f, -0.864188f, 0.442863f }, 
-	{ 0.262866f, -0.951056f, 0.162460f }, 
-	{ 0.500000f, -0.809017f, 0.309017f }, 
-	{ 0.716567f, -0.681718f, 0.147621f }, 
-	{ 0.525731f, -0.850651f, 0.000000f }, 
-	{ -0.238856f, -0.864188f, -0.442863f }, 
-	{ -0.500000f, -0.809017f, -0.309017f }, 
-	{ -0.262866f, -0.951056f, -0.162460f }, 
-	{ -0.850651f, -0.525731f, 0.000000f }, 
-	{ -0.716567f, -0.681718f, -0.147621f }, 
-	{ -0.716567f, -0.681718f, 0.147621f }, 
-	{ -0.525731f, -0.850651f, 0.000000f }, 
-	{ -0.500000f, -0.809017f, 0.309017f }, 
-	{ -0.238856f, -0.864188f, 0.442863f }, 
-	{ -0.262866f, -0.951056f, 0.162460f }, 
-	{ -0.864188f, -0.442863f, 0.238856f }, 
-	{ -0.809017f, -0.309017f, 0.500000f }, 
-	{ -0.688191f, -0.587785f, 0.425325f }, 
-	{ -0.681718f, -0.147621f, 0.716567f }, 
-	{ -0.442863f, -0.238856f, 0.864188f }, 
-	{ -0.587785f, -0.425325f, 0.688191f }, 
-	{ -0.309017f, -0.500000f, 0.809017f }, 
-	{ -0.147621f, -0.716567f, 0.681718f }, 
-	{ -0.425325f, -0.688191f, 0.587785f }, 
-	{ -0.162460f, -0.262866f, 0.951056f }, 
-	{ 0.442863f, -0.238856f, 0.864188f }, 
-	{ 0.162460f, -0.262866f, 0.951056f }, 
-	{ 0.309017f, -0.500000f, 0.809017f }, 
-	{ 0.147621f, -0.716567f, 0.681718f }, 
-	{ 0.000000f, -0.525731f, 0.850651f }, 
-	{ 0.425325f, -0.688191f, 0.587785f }, 
-	{ 0.587785f, -0.425325f, 0.688191f }, 
-	{ 0.688191f, -0.587785f, 0.425325f }, 
-	{ -0.955423f, 0.295242f, 0.000000f }, 
-	{ -0.951056f, 0.162460f, 0.262866f }, 
-	{ -1.000000f, 0.000000f, 0.000000f }, 
-	{ -0.850651f, 0.000000f, 0.525731f }, 
-	{ -0.955423f, -0.295242f, 0.000000f }, 
-	{ -0.951056f, -0.162460f, 0.262866f }, 
-	{ -0.864188f, 0.442863f, -0.238856f }, 
-	{ -0.951056f, 0.162460f, -0.262866f }, 
-	{ -0.809017f, 0.309017f, -0.500000f }, 
+	{ 0.147621f, 0.716567f, 0.681718f },
+	{ 0.000000f, 0.525731f, 0.850651f },
+	{ 0.309017f, 0.500000f, 0.809017f },
+	{ 0.525731f, 0.000000f, 0.850651f },
+	{ 0.295242f, 0.000000f, 0.955423f },
+	{ 0.442863f, 0.238856f, 0.864188f },
+	{ 0.162460f, 0.262866f, 0.951056f },
+	{ -0.681718f, 0.147621f, 0.716567f },
+	{ -0.809017f, 0.309017f, 0.500000f },
+	{ -0.587785f, 0.425325f, 0.688191f },
+	{ -0.850651f, 0.525731f, 0.000000f },
+	{ -0.864188f, 0.442863f, 0.238856f },
+	{ -0.716567f, 0.681718f, 0.147621f },
+	{ -0.688191f, 0.587785f, 0.425325f },
+	{ -0.500000f, 0.809017f, 0.309017f },
+	{ -0.238856f, 0.864188f, 0.442863f },
+	{ -0.425325f, 0.688191f, 0.587785f },
+	{ -0.716567f, 0.681718f, -0.147621f },
+	{ -0.500000f, 0.809017f, -0.309017f },
+	{ -0.525731f, 0.850651f, 0.000000f },
+	{ 0.000000f, 0.850651f, -0.525731f },
+	{ -0.238856f, 0.864188f, -0.442863f },
+	{ 0.000000f, 0.955423f, -0.295242f },
+	{ -0.262866f, 0.951056f, -0.162460f },
+	{ 0.000000f, 1.000000f, 0.000000f },
+	{ 0.000000f, 0.955423f, 0.295242f },
+	{ -0.262866f, 0.951056f, 0.162460f },
+	{ 0.238856f, 0.864188f, 0.442863f },
+	{ 0.262866f, 0.951056f, 0.162460f },
+	{ 0.500000f, 0.809017f, 0.309017f },
+	{ 0.238856f, 0.864188f, -0.442863f },
+	{ 0.262866f, 0.951056f, -0.162460f },
+	{ 0.500000f, 0.809017f, -0.309017f },
+	{ 0.850651f, 0.525731f, 0.000000f },
+	{ 0.716567f, 0.681718f, 0.147621f },
+	{ 0.716567f, 0.681718f, -0.147621f },
+	{ 0.525731f, 0.850651f, 0.000000f },
+	{ 0.425325f, 0.688191f, 0.587785f },
+	{ 0.864188f, 0.442863f, 0.238856f },
+	{ 0.688191f, 0.587785f, 0.425325f },
+	{ 0.809017f, 0.309017f, 0.500000f },
+	{ 0.681718f, 0.147621f, 0.716567f },
+	{ 0.587785f, 0.425325f, 0.688191f },
+	{ 0.955423f, 0.295242f, 0.000000f },
+	{ 1.000000f, 0.000000f, 0.000000f },
+	{ 0.951056f, 0.162460f, 0.262866f },
+	{ 0.850651f, -0.525731f, 0.000000f },
+	{ 0.955423f, -0.295242f, 0.000000f },
+	{ 0.864188f, -0.442863f, 0.238856f },
+	{ 0.951056f, -0.162460f, 0.262866f },
+	{ 0.809017f, -0.309017f, 0.500000f },
+	{ 0.681718f, -0.147621f, 0.716567f },
+	{ 0.850651f, 0.000000f, 0.525731f },
+	{ 0.864188f, 0.442863f, -0.238856f },
+	{ 0.809017f, 0.309017f, -0.500000f },
+	{ 0.951056f, 0.162460f, -0.262866f },
+	{ 0.525731f, 0.000000f, -0.850651f },
+	{ 0.681718f, 0.147621f, -0.716567f },
+	{ 0.681718f, -0.147621f, -0.716567f },
+	{ 0.850651f, 0.000000f, -0.525731f },
+	{ 0.809017f, -0.309017f, -0.500000f },
+	{ 0.864188f, -0.442863f, -0.238856f },
+	{ 0.951056f, -0.162460f, -0.262866f },
+	{ 0.147621f, 0.716567f, -0.681718f },
+	{ 0.309017f, 0.500000f, -0.809017f },
+	{ 0.425325f, 0.688191f, -0.587785f },
+	{ 0.442863f, 0.238856f, -0.864188f },
+	{ 0.587785f, 0.425325f, -0.688191f },
+	{ 0.688191f, 0.587785f, -0.425325f },
+	{ -0.147621f, 0.716567f, -0.681718f },
+	{ -0.309017f, 0.500000f, -0.809017f },
+	{ 0.000000f, 0.525731f, -0.850651f },
+	{ -0.525731f, 0.000000f, -0.850651f },
+	{ -0.442863f, 0.238856f, -0.864188f },
+	{ -0.295242f, 0.000000f, -0.955423f },
+	{ -0.162460f, 0.262866f, -0.951056f },
+	{ 0.000000f, 0.000000f, -1.000000f },
+	{ 0.295242f, 0.000000f, -0.955423f },
+	{ 0.162460f, 0.262866f, -0.951056f },
+	{ -0.442863f, -0.238856f, -0.864188f },
+	{ -0.309017f, -0.500000f, -0.809017f },
+	{ -0.162460f, -0.262866f, -0.951056f },
+	{ 0.000000f, -0.850651f, -0.525731f },
+	{ -0.147621f, -0.716567f, -0.681718f },
+	{ 0.147621f, -0.716567f, -0.681718f },
+	{ 0.000000f, -0.525731f, -0.850651f },
+	{ 0.309017f, -0.500000f, -0.809017f },
+	{ 0.442863f, -0.238856f, -0.864188f },
+	{ 0.162460f, -0.262866f, -0.951056f },
+	{ 0.238856f, -0.864188f, -0.442863f },
+	{ 0.500000f, -0.809017f, -0.309017f },
+	{ 0.425325f, -0.688191f, -0.587785f },
+	{ 0.716567f, -0.681718f, -0.147621f },
+	{ 0.688191f, -0.587785f, -0.425325f },
+	{ 0.587785f, -0.425325f, -0.688191f },
+	{ 0.000000f, -0.955423f, -0.295242f },
+	{ 0.000000f, -1.000000f, 0.000000f },
+	{ 0.262866f, -0.951056f, -0.162460f },
+	{ 0.000000f, -0.850651f, 0.525731f },
+	{ 0.000000f, -0.955423f, 0.295242f },
+	{ 0.238856f, -0.864188f, 0.442863f },
+	{ 0.262866f, -0.951056f, 0.162460f },
+	{ 0.500000f, -0.809017f, 0.309017f },
+	{ 0.716567f, -0.681718f, 0.147621f },
+	{ 0.525731f, -0.850651f, 0.000000f },
+	{ -0.238856f, -0.864188f, -0.442863f },
+	{ -0.500000f, -0.809017f, -0.309017f },
+	{ -0.262866f, -0.951056f, -0.162460f },
+	{ -0.850651f, -0.525731f, 0.000000f },
+	{ -0.716567f, -0.681718f, -0.147621f },
+	{ -0.716567f, -0.681718f, 0.147621f },
+	{ -0.525731f, -0.850651f, 0.000000f },
+	{ -0.500000f, -0.809017f, 0.309017f },
+	{ -0.238856f, -0.864188f, 0.442863f },
+	{ -0.262866f, -0.951056f, 0.162460f },
+	{ -0.864188f, -0.442863f, 0.238856f },
+	{ -0.809017f, -0.309017f, 0.500000f },
+	{ -0.688191f, -0.587785f, 0.425325f },
+	{ -0.681718f, -0.147621f, 0.716567f },
+	{ -0.442863f, -0.238856f, 0.864188f },
+	{ -0.587785f, -0.425325f, 0.688191f },
+	{ -0.309017f, -0.500000f, 0.809017f },
+	{ -0.147621f, -0.716567f, 0.681718f },
+	{ -0.425325f, -0.688191f, 0.587785f },
+	{ -0.162460f, -0.262866f, 0.951056f },
+	{ 0.442863f, -0.238856f, 0.864188f },
+	{ 0.162460f, -0.262866f, 0.951056f },
+	{ 0.309017f, -0.500000f, 0.809017f },
+	{ 0.147621f, -0.716567f, 0.681718f },
+	{ 0.000000f, -0.525731f, 0.850651f },
+	{ 0.425325f, -0.688191f, 0.587785f },
+	{ 0.587785f, -0.425325f, 0.688191f },
+	{ 0.688191f, -0.587785f, 0.425325f },
+	{ -0.955423f, 0.295242f, 0.000000f },
+	{ -0.951056f, 0.162460f, 0.262866f },
+	{ -1.000000f, 0.000000f, 0.000000f },
+	{ -0.850651f, 0.000000f, 0.525731f },
+	{ -0.955423f, -0.295242f, 0.000000f },
+	{ -0.951056f, -0.162460f, 0.262866f },
+	{ -0.864188f, 0.442863f, -0.238856f },
+	{ -0.951056f, 0.162460f, -0.262866f },
+	{ -0.809017f, 0.309017f, -0.500000f },
 	{ -0.864188f, -0.442863f, -0.238856f },
-	{ -0.951056f, -0.162460f, -0.262866f }, 
-	{ -0.809017f, -0.309017f, -0.500000f }, 
-	{ -0.681718f, 0.147621f, -0.716567f }, 
-	{ -0.681718f, -0.147621f, -0.716567f }, 
-	{ -0.850651f, 0.000000f, -0.525731f }, 
-	{ -0.688191f, 0.587785f, -0.425325f }, 
-	{ -0.587785f, 0.425325f, -0.688191f }, 
-	{ -0.425325f, 0.688191f, -0.587785f }, 
-	{ -0.425325f, -0.688191f, -0.587785f }, 
-	{ -0.587785f, -0.425325f, -0.688191f }, 
-	{ -0.688191f, -0.587785f, -0.425325f }, 
+	{ -0.951056f, -0.162460f, -0.262866f },
+	{ -0.809017f, -0.309017f, -0.500000f },
+	{ -0.681718f, 0.147621f, -0.716567f },
+	{ -0.681718f, -0.147621f, -0.716567f },
+	{ -0.850651f, 0.000000f, -0.525731f },
+	{ -0.688191f, 0.587785f, -0.425325f },
+	{ -0.587785f, 0.425325f, -0.688191f },
+	{ -0.425325f, 0.688191f, -0.587785f },
+	{ -0.425325f, -0.688191f, -0.587785f },
+	{ -0.587785f, -0.425325f, -0.688191f },
+	{ -0.688191f, -0.587785f, -0.425325f },
 };
 
 
@@ -308,14 +308,14 @@
 	/* sanity check */
 	if( bufSize < ( sizeof( *md2 ) * 2) )
 		return PICO_PMV_ERROR_SIZE;
-	
+
 	/* set as md2 */
 	md2 = (md2_t*) buffer;
-	
+
 	/* check md2 magic */
-	if( *((int*) md2->magic) != *((int*) MD2_MAGIC) ) 
+	if( *((int*) md2->magic) != *((int*) MD2_MAGIC) )
 		return PICO_PMV_ERROR_IDENT;
-	
+
 	/* check md2 version */
 	if( _pico_little_long( md2->version ) != MD2_VERSION )
 		return PICO_PMV_ERROR_VERSION;
@@ -351,8 +351,8 @@
 	picoVec3_t		xyz, normal;
 	picoVec2_t		st;
 	picoColor_t		color;
-	
 
+
 	/* set as md2 */
 	bb = (picoByte_t*) buffer;
 	md2	= (md2_t*) buffer;
@@ -364,7 +364,7 @@
 		_pico_printf( PICO_ERROR, "%s is not an MD2 File!", fileName );
 		return NULL;
 	}
-	
+
 	// swap md2
 	md2->version = _pico_little_long( md2->version );
 
@@ -392,7 +392,7 @@
 		_pico_printf( PICO_ERROR, "%s has 0 frames!", fileName );
 		return NULL;
 	}
-	
+
 	if( frameNum < 0 || frameNum >= md2->numFrames )
 	{
 		_pico_printf( PICO_ERROR, "Invalid or out-of-range MD2 frame specified" );
@@ -434,10 +434,6 @@
 	// 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 );
 
-	// detox Skin name
-	_pico_setfext( skinname, "" );
-	_pico_unixify( skinname );
-
 	/* create new pico model */
 	picoModel = PicoNewModel();
 	if( picoModel == NULL )
@@ -452,6 +448,37 @@
 	PicoSetModelName( picoModel, fileName );
 	PicoSetModelFileName( picoModel, fileName );
 
+	for (i = 0; i < md2->numSkins; i++) {
+		char *offsetSkin = (char*) (bb + md2->ofsSkins) + i * MD2_MAX_SKINNAME;
+		/* set Skin Name */
+		strncpy(skinname, offsetSkin, MD2_MAX_SKINNAME);
+
+		/* detox Skin name */
+		if (skinname[0] == '.') {/* special case ufoai skinpath */
+			char path[MD2_MAX_SKINNAME];
+			char skinnameRelative[MD2_MAX_SKINNAME];
+			strncpy(path, fileName, MD2_MAX_SKINNAME);
+			strncpy(skinnameRelative, skinname, MD2_MAX_SKINNAME);
+			_pico_unixify(path);
+			for (j = MD2_MAX_SKINNAME; j--;) {/* skip filename */
+				if (path[j] == '/')
+					break;
+				path[j] = '\0';
+			}
+			snprintf(skinname, MD2_MAX_SKINNAME, "%s%s", path, &skinnameRelative[1]);
+		}
+		_pico_setfext(skinname, "");
+
+		picoShader = PicoNewShader(picoModel);
+		if (picoShader == NULL) {
+			_pico_printf(PICO_ERROR, "Unable to allocate a new model shader");
+			PicoFreeModel(picoModel);
+			return NULL;
+		}
+
+		PicoSetShaderName(picoShader, skinname);
+	}
+
 	// allocate new pico surface
 	picoSurface = PicoNewSurface( picoModel );
 	if( picoSurface == NULL )
 md2.diff (8,224 bytes)   
 Index: libs/picomodel/pm_md2.c
===================================================================
--- libs/picomodel/pm_md2.c	(Revision 5190)
+++ libs/picomodel/pm_md2.c	(Arbeitskopie)
@@ -68,8 +68,6 @@
 {
 	short	Vert;
 	short	ST;
-	struct	index_LUT_s	*next;
-
 } index_LUT_t;
 
 typedef struct index_DUP_LUT_s
@@ -432,9 +430,6 @@
 		texCoord->t = _pico_little_short( texCoord->t );
 	}
 
-	// set Skin Name
-	strncpy(skinname, (const char*)(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 );
 
@@ -517,166 +512,55 @@
 		p_index_LUT[i].next = NULL;
 	}
 
-	// Fill in Look Up Table, and allocate/fill Linked List from vert array as needed for dup STs per Vert.
+	/* Fill in Look Up Table, and allocate/fill Linked List from vert array as needed for dup STs per Vert. */
 	tot_numVerts = md2->numXYZ;
-	dups = 0;
-	for(i=0; i<md2->numTris; i++)
-	{
-		p_md2Triangle = (md2Triangle_t *) ( bb + md2->ofsTris + (sizeof(md2Triangle_t)*i));
-		for(j=0; j<3; j++)
-		{
-			if (p_index_LUT[p_md2Triangle->index_xyz[j]].ST == -1) // No Main Entry
+	for (i = 0; i < md2->numTris; i++) {
+		p_md2Triangle = (md2Triangle_t *) (bb + md2->ofsTris + (sizeof(md2Triangle_t) * i));
+		for (j = 0; j < 3; j++) {
+			if (p_index_LUT[p_md2Triangle->index_xyz[j]].ST == -1) /* No Main Entry */
 				p_index_LUT[p_md2Triangle->index_xyz[j]].ST = p_md2Triangle->index_st[j];
-
-			else if (p_md2Triangle->index_st[j] == p_index_LUT[p_md2Triangle->index_xyz[j]].ST ) // Equal to Main Entry
-				continue;
-
-			else if ( (p_index_LUT[p_md2Triangle->index_xyz[j]].next == NULL) )  // Not equal to Main entry, and no LL entry
-			{	// Add first entry of LL from Main
-				p_index_LUT2 = (index_LUT_t *)_pico_alloc(sizeof(index_LUT_t));
-				if (p_index_LUT2 == NULL)
-					_pico_printf( PICO_ERROR," Couldn't allocate memory!\n");
-				p_index_LUT[p_md2Triangle->index_xyz[j]].next = (index_LUT_t *)p_index_LUT2;
-				p_index_LUT2->Vert = dups;
-				p_index_LUT2->ST = p_md2Triangle->index_st[j];
-				p_index_LUT2->next = NULL;
-				p_md2Triangle->index_xyz[j] = dups + md2->numXYZ; // Make change in Tri hunk
-				dups++;
-			}
-			else // Try to find in LL from Main Entry
-			{
-				p_index_LUT3 = p_index_LUT2 = p_index_LUT[p_md2Triangle->index_xyz[j]].next;
-				while ( (p_index_LUT2 != NULL) && (p_md2Triangle->index_xyz[j] != p_index_LUT2->Vert) ) // Walk down LL
-				{
-					p_index_LUT3 = p_index_LUT2;
-					p_index_LUT2 = p_index_LUT2->next;
-				}
-				p_index_LUT2 = p_index_LUT3;
-
-				if ( p_md2Triangle->index_st[j] == p_index_LUT2->ST ) // Found it
-				{
-					p_md2Triangle->index_xyz[j] = p_index_LUT2->Vert + md2->numXYZ; // Make change in Tri hunk
-					continue;
-				}
-
-				if ( p_index_LUT2->next == NULL)  // Didn't find it. Add entry to LL.
-				{
-					// Add the Entry
-					p_index_LUT3 = (index_LUT_t *)_pico_alloc(sizeof(index_LUT_t));
-					if (p_index_LUT3 == NULL)
-						_pico_printf( PICO_ERROR," Couldn't allocate memory!\n");
-					p_index_LUT2->next = (index_LUT_t *)p_index_LUT3;
-					p_index_LUT3->Vert = p_md2Triangle->index_xyz[j];
-					p_index_LUT3->ST = p_md2Triangle->index_st[j];
-					p_index_LUT3->next = NULL;
-					p_md2Triangle->index_xyz[j] = dups + md2->numXYZ; // Make change in Tri hunk
-					dups++;
-				}
-			}
 		}
 	}
 
-	// malloc and build array for Dup STs
-	p_index_LUT_DUPS = (index_DUP_LUT_t *)_pico_alloc(sizeof(index_DUP_LUT_t) * dups);
-	if (p_index_LUT_DUPS == NULL)
-		_pico_printf( PICO_ERROR," Couldn't allocate memory!\n");
-
-	dup_index = 0;
-	for(i=0; i<md2->numXYZ; i++)
-	{
-		p_index_LUT2 = p_index_LUT[i].next;
-		while (p_index_LUT2 != NULL)
-		{
-			p_index_LUT_DUPS[p_index_LUT2->Vert].OldVert = i;
-			p_index_LUT_DUPS[p_index_LUT2->Vert].ST = p_index_LUT2->ST;
-			dup_index++;
-			p_index_LUT2 = p_index_LUT2->next;
-		}
+	/* Build Picomodel */
+	triangle = (md2Triangle_t *) ((picoByte_t *) (bb + md2->ofsTris));
+	for (j = 0; j < md2->numTris; j++, triangle++) {
+		PicoSetSurfaceIndex(picoSurface, j * 3, triangle->index_xyz[0]);
+		PicoSetSurfaceIndex(picoSurface, j * 3 + 1, triangle->index_xyz[1]);
+		PicoSetSurfaceIndex(picoSurface, j * 3 + 2, triangle->index_xyz[2]);
 	}
 
-	// Build Picomodel
-	triangle = (md2Triangle_t *) ((picoByte_t *) (bb + md2->ofsTris) );
-	texCoord = (md2St_t*) ((picoByte_t *) (bb + md2->ofsST) );
-	vertex = (md2XyzNormal_t*) ((picoByte_t*) (frame->verts) );
-	for( j = 0; j < md2->numTris; j++, triangle++ )
-	{
-		PicoSetSurfaceIndex( picoSurface, j*3   , triangle->index_xyz[0] );
-		PicoSetSurfaceIndex( picoSurface, j*3+1 , triangle->index_xyz[1] );
-		PicoSetSurfaceIndex( picoSurface, j*3+2 , triangle->index_xyz[2] );
-	}
+	_pico_set_color(color, 255, 255, 255, 255);
 
-	for(i=0; i< md2->numXYZ; i++, vertex++)
-	{
+	texCoord = (md2St_t*) ((picoByte_t *) (bb + md2->ofsST));
+	vertex = (md2XyzNormal_t*) ((picoByte_t*) (frame->verts));
+	for (i = 0; i < md2->numXYZ; i++, vertex++) {
 		/* set vertex origin */
-		xyz[ 0 ] = vertex->v[0] * frame->scale[0] + frame->translate[0];
-		xyz[ 1 ] = vertex->v[1] * frame->scale[1] + frame->translate[1];
-		xyz[ 2 ] = vertex->v[2] * frame->scale[2] + frame->translate[2];
-		PicoSetSurfaceXYZ( picoSurface, i , xyz );
+		xyz[0] = vertex->v[0] * frame->scale[0] + frame->translate[0];
+		xyz[1] = vertex->v[1] * frame->scale[1] + frame->translate[1];
+		xyz[2] = vertex->v[2] * frame->scale[2] + frame->translate[2];
+		PicoSetSurfaceXYZ(picoSurface, i, xyz);
 
 		/* set normal */
-		normal[ 0 ] = md2_normals[vertex->lightnormalindex][0];
-		normal[ 1 ] = md2_normals[vertex->lightnormalindex][1];
-		normal[ 2 ] = md2_normals[vertex->lightnormalindex][2];
-		PicoSetSurfaceNormal( picoSurface, i , normal );
+		normal[0] = md2_normals[vertex->lightnormalindex][0];
+		normal[1] = md2_normals[vertex->lightnormalindex][1];
+		normal[2] = md2_normals[vertex->lightnormalindex][2];
+		PicoSetSurfaceNormal(picoSurface, i, normal);
 
 		/* set st coords */
-		st[ 0 ] =  ((texCoord[p_index_LUT[i].ST].s) / ((float)md2->skinWidth));
-		st[ 1 ] =  (texCoord[p_index_LUT[i].ST].t / ((float)md2->skinHeight));
-		PicoSetSurfaceST( picoSurface, 0, i , st );
-	}
+		st[0] = (float) texCoord[p_index_LUT[i].ST].s / (float) md2->skinWidth;
+		st[1] = (float) texCoord[p_index_LUT[i].ST].t / (float) md2->skinHeight;
+		PicoSetSurfaceST(picoSurface, 0, i, st);
 
-	if (dups)
-	{
-		for(i=0; i<dups; i++)
-		{
-			j = p_index_LUT_DUPS[i].OldVert;
-			/* set vertex origin */
-			xyz[ 0 ] = frame->verts[j].v[0] * frame->scale[0] + frame->translate[0];
-			xyz[ 1 ] = frame->verts[j].v[1] * frame->scale[1] + frame->translate[1];
-			xyz[ 2 ] = frame->verts[j].v[2] * frame->scale[2] + frame->translate[2];
-			PicoSetSurfaceXYZ( picoSurface, i + md2->numXYZ , xyz );
-
-			/* set normal */
-			normal[ 0 ] = md2_normals[frame->verts[j].lightnormalindex][0];
-			normal[ 1 ] = md2_normals[frame->verts[j].lightnormalindex][1];
-			normal[ 2 ] = md2_normals[frame->verts[j].lightnormalindex][2];
-			PicoSetSurfaceNormal( picoSurface, i + md2->numXYZ , normal );
-
-			/* set st coords */
-			st[ 0 ] =  ((texCoord[p_index_LUT_DUPS[i].ST].s) / ((float)md2->skinWidth));
-			st[ 1 ] =  (texCoord[p_index_LUT_DUPS[i].ST].t / ((float)md2->skinHeight));
-			PicoSetSurfaceST( picoSurface, 0, i + md2->numXYZ , st );
-		}
+		/* set color */
+		PicoSetSurfaceColor(picoSurface, 0, i, color);
 	}
 
-	/* set color */
-	PicoSetSurfaceColor( picoSurface, 0, 0, color );
+	/* Free malloc'ed LUTs */
+	_pico_free(p_index_LUT);
 
-	// Free up malloc'ed LL entries
-	for(i=0; i<md2->numXYZ; i++)
-	{
-		if(p_index_LUT[i].next != NULL)
-		{
-			p_index_LUT2 = p_index_LUT[i].next;
-			do {
-				p_index_LUT3 = p_index_LUT2->next;
-				_pico_free(p_index_LUT2);
-				p_index_LUT2 = p_index_LUT3;
-				dups--;
-			} while (p_index_LUT2 != NULL);
-		}
-	}
-
-	if (dups)
-		_pico_printf(PICO_WARNING, " Not all LL mallocs freed\n");
-
-	// Free malloc'ed LUTs
- 	_pico_free(p_index_LUT);
-	_pico_free(p_index_LUT_DUPS);
-
 	/* return the new pico model */
 	return picoModel;
-
 }
 
 
 | ||||
| Is there any test model I can use to debug this? I don't have any MD2 files lying around. | |
| attached a model and its texture | |
| attached a diff that adds support for different skins for md2 models (if you ignore all those trailing whitespace stuff the patch is at the end of the file ;) | |
| This model has a strange appearance in DarkRadiant. When forcing it to load in the ModelSelector, it looks something like this: http://img697.imageshack.us/img697/6112/trucki.png It's not just the UV map messed up, the vertices are mangled too. Does this work for you at all? | |
| attached a new patch that should fix the vertices - but i wasn't able to fix the uv map | |
| ups - the compile error can be easy fixed with removing the NULL assignment - sorry | |
| The patch is there - I haven't looked into the UV issues yet. | |
| I see that the skinWidth/skinHeight values in the md2 are set to 256, but the attached image is 512, hence the UV coords are wrongly normalised. Could that be the issue? | |
| yes, you are right - that sounds reasonable. | |
| Ok. I know nothing about MD2, but I assume this is an error happening during MD2 creation? Feel free to close this issue in that case, if there are no other MD2 (texcoords) problems. | |
| http://sourceforge.net/apps/trac/ufoai/changeset/30076/ here is a correct fix for the texcoord issue. | |
| Hm, the unified DIFF patch is not quite compatible with my SVN version. I tried downloading the entire file from your repo, but it seems to be largely different. I'm a bit hesitant to just replace the file, as I don't know how if there are any ufo-specific changes in your MD2 loader. If somebody is willing to merge only the relevant changes into the DarkRadiant codebase, I'm happy to apply that patch to SVN. | |
| there are no ufo-only changes in that file - but i will try to merge it against the dr codebase to get it in. | |
| Ok, thanks in advance. :) | |
| Is the texcoord stuff still an issue with DarkRadiant? I'll leave this open for two more weeks or so, I might close this entry after that time. | |
| if you are still using picomodel and that patch is not applied yet, then this is still an issue. | |
| Yup, we're still using picomodel, but the supplied patch was not applicable. If you can provide a patch suitable for the DarkRadiant codebase I'm happy to commit it. | |
| Date Modified | Username | Field | Change | 
|---|---|---|---|
| 06.02.2010 22:53 | mattn | New Issue | |
| 07.02.2010 13:24 | greebo | Note Added: 0002913 | |
| 07.02.2010 13:24 | greebo | Status | new => acknowledged | 
| 07.02.2010 14:09 | mattn | File Added: truck.md2 | |
| 07.02.2010 14:09 | mattn | File Added: truck.tga | |
| 07.02.2010 14:10 | mattn | Note Added: 0002916 | |
| 07.02.2010 14:13 | mattn | File Added: skins.diff | |
| 07.02.2010 14:15 | mattn | Note Added: 0002917 | |
| 07.02.2010 15:16 | greebo | Note Added: 0002918 | |
| 08.02.2010 18:18 | mattn | File Added: md2.diff | |
| 08.02.2010 18:19 | mattn | Note Added: 0002925 | |
| 08.02.2010 18:21 | mattn | Note Added: 0002926 | |
| 08.02.2010 19:52 | greebo | Note Added: 0002927 | |
| 08.02.2010 20:07 | greebo | Note Added: 0002928 | |
| 09.02.2010 08:28 | mattn | Note Added: 0002929 | |
| 09.02.2010 10:33 | greebo | Note Added: 0002930 | |
| 14.02.2010 06:56 | greebo | Status | acknowledged => resolved | 
| 14.02.2010 06:56 | greebo | Fixed in Version | => 1.1.1 | 
| 14.02.2010 06:56 | greebo | Resolution | open => no change required | 
| 14.02.2010 06:56 | greebo | Assigned To | => greebo | 
| 19.05.2010 19:57 | mattn | Status | resolved => confirmed | 
| 19.05.2010 19:57 | mattn | Note Added: 0003012 | |
| 20.05.2010 12:18 | greebo | Note Added: 0003013 | |
| 21.05.2010 06:40 | mattn | Note Added: 0003014 | |
| 21.05.2010 11:16 | greebo | Note Added: 0003016 | |
| 30.09.2010 16:35 | greebo | File Deleted: truck.tga | |
| 22.08.2011 08:08 | greebo | Note Added: 0003991 | |
| 22.08.2011 08:08 | greebo | Assigned To | greebo => | 
| 22.08.2011 11:48 | mattn | Note Added: 0003993 | |
| 23.08.2011 11:49 | greebo | Note Added: 0003994 | 
