- fixed UV coords
 - added further test models

Collada
 - fixed invalid aiStrings

git-svn-id: https://assimp.svn.sourceforge.net/svnroot/assimp/trunk@343 67173fc5-114c-0410-ac8e-9d2fd5bffc1f
pull/1/head
aramis_acg 2009-02-12 15:58:55 +00:00
parent e5b06832b7
commit fd9769eae6
17 changed files with 201 additions and 81 deletions

View File

@ -187,7 +187,7 @@ aiNode* ColladaLoader::BuildHierarchy( const ColladaParser& pParser, const Colla
if (!pNode->mLights.empty() || !pNode->mCameras.empty()) {
::strcpy(node->mName.data,"$ColladaAutoName$_");
node->mName.length = 18 + ASSIMP_itoa10(node->mName.data+18,MAXLEN-18,(uint32_t)clock());
node->mName.length = 17 + ASSIMP_itoa10(node->mName.data+18,MAXLEN-18,(uint32_t)clock());
}
}

View File

@ -144,8 +144,8 @@ struct Frame
*/
struct TexCoord
{
int16_t s;
int16_t t;
uint16_t s;
uint16_t t;
} PACK_STRUCT;
// ---------------------------------------------------------------------------

View File

@ -275,19 +275,19 @@ void MD2Importer::InternReadFile( const std::string& pFile,
pcMesh->mVertices = new aiVector3D[pcMesh->mNumVertices];
pcMesh->mNormals = new aiVector3D[pcMesh->mNumVertices];
// not sure whether there are MD2 files without texture coordinates
// Not sure whether there are MD2 files without texture coordinates
// NOTE: texture coordinates can be there without a texture,
// but a texture can't be there without a valid UV channel
MaterialHelper* pcHelper = (MaterialHelper*)pScene->mMaterials[0];
const int iMode = (int)aiShadingMode_Gouraud;
pcHelper->AddProperty<int>(&iMode, 1, AI_MATKEY_SHADING_MODEL);
if (m_pcHeader->numTexCoords && m_pcHeader->numSkins)
{
// navigate to the first texture associated with the mesh
const MD2::Skin* pcSkins = (const MD2::Skin*) ((unsigned char*)m_pcHeader +
m_pcHeader->offsetSkins);
const int iMode = (int)aiShadingMode_Gouraud;
MaterialHelper* pcHelper = (MaterialHelper*)pScene->mMaterials[0];
pcHelper->AddProperty<int>(&iMode, 1, AI_MATKEY_SHADING_MODEL);
aiColor3D clr;
clr.b = clr.g = clr.r = 1.0f;
pcHelper->AddProperty<aiColor3D>(&clr, 1,AI_MATKEY_COLOR_DIFFUSE);
@ -306,18 +306,13 @@ void MD2Importer::InternReadFile( const std::string& pFile,
pcHelper->AddProperty(&szString,AI_MATKEY_TEXTURE_DIFFUSE(0));
}
else
{
else{
DefaultLogger::get()->warn("Texture file name has zero length. It will be skipped.");
}
}
else
{
// apply a default material
const int iMode = (int)aiShadingMode_Gouraud;
MaterialHelper* pcHelper = (MaterialHelper*)pScene->mMaterials[0];
pcHelper->AddProperty<int>(&iMode, 1, AI_MATKEY_SHADING_MODEL);
aiColor3D clr;
clr.b = clr.g = clr.r = 0.6f;
pcHelper->AddProperty<aiColor3D>(&clr, 1,AI_MATKEY_COLOR_DIFFUSE);
@ -327,16 +322,22 @@ void MD2Importer::InternReadFile( const std::string& pFile,
pcHelper->AddProperty<aiColor3D>(&clr, 1,AI_MATKEY_COLOR_AMBIENT);
aiString szName;
szName.Set(AI_DEFAULT_MATERIAL_NAME);
szName.Set("MD2Default");
pcHelper->AddProperty(&szName,AI_MATKEY_NAME);
aiString sz;
// TODO: Try to guess the name of the texture file from the model file name
sz.Set("texture_dummmy.bmp");
pcHelper->AddProperty(&sz,AI_MATKEY_TEXTURE_DIFFUSE(0));
}
// now read all triangles of the first frame, apply scaling and translation
unsigned int iCurrent = 0;
float fDivisorU = 1.0f;
float fDivisorV = 1.0f;
float fDivisorU = 1.0f,fDivisorV = 1.0f;
if (m_pcHeader->numTexCoords)
{
// allocate storage for texture coordinates, too
@ -345,30 +346,25 @@ void MD2Importer::InternReadFile( const std::string& pFile,
// check whether the skin width or height are zero (this would
// cause a division through zero)
if (!m_pcHeader->skinWidth)
{
DefaultLogger::get()->error("Skin width is zero but there are "
"valid absolute texture coordinates");
if (!m_pcHeader->skinWidth) {
DefaultLogger::get()->error("MD2: No valid skin width given");
}
else fDivisorU = (float)m_pcHeader->skinWidth;
if (!m_pcHeader->skinHeight)
{
DefaultLogger::get()->error("Skin height is zero but there are "
"valid absolute texture coordinates ");
if (!m_pcHeader->skinHeight){
DefaultLogger::get()->error("MD2: No valid skin height given");
}
else fDivisorV = (float)m_pcHeader->skinHeight;
}
for (unsigned int i = 0; i < (unsigned int)m_pcHeader->numTriangles;++i)
{
// allocate the face
// Allocate the face
pScene->mMeshes[0]->mFaces[i].mIndices = new unsigned int[3];
pScene->mMeshes[0]->mFaces[i].mNumIndices = 3;
// copy texture coordinates
// check whether they are different from the previous value at this index.
// In this case, create a full separate set of vertices/normals/texcoords
unsigned int iTemp = iCurrent;
for (unsigned int c = 0; c < 3;++c,++iCurrent)
{
// validate vertex indices
@ -385,10 +381,8 @@ void MD2Importer::InternReadFile( const std::string& pFile,
vec.x = (float)pcVerts[iIndex].vertex[0] * pcFrame->scale[0];
vec.x += pcFrame->translate[0];
// invert y
vec.y = (float)pcVerts[iIndex].vertex[1] * pcFrame->scale[1];
vec.y += pcFrame->translate[1];
vec.y *= -1.0f;
vec.z = (float)pcVerts[iIndex].vertex[2] * pcFrame->scale[2];
vec.z += pcFrame->translate[2];
@ -396,14 +390,15 @@ void MD2Importer::InternReadFile( const std::string& pFile,
// read the normal vector from the precalculated normal table
aiVector3D& vNormal = pcMesh->mNormals[iCurrent];
LookupNormalIndex(pcVerts[iIndex].lightNormalIndex,vNormal);
vNormal.y *= -1.0f;
if (m_pcHeader->numTexCoords)
{
// invert z for proper output coordinate system
vNormal.z *= -1.0f;
vec.z *= -1.0f;
if (m_pcHeader->numTexCoords) {
// validate texture coordinates
iIndex = pcTriangles[iIndex].textureIndices[c];
if (iIndex >= m_pcHeader->numTexCoords)
{
iIndex = pcTriangles[i].textureIndices[c];
if (iIndex >= m_pcHeader->numTexCoords) {
DefaultLogger::get()->error("MD2: UV index is outside the allowed range");
iIndex = m_pcHeader->numTexCoords-1;
}
@ -412,14 +407,11 @@ void MD2Importer::InternReadFile( const std::string& pFile,
// the texture coordinates are absolute values but we
// need relative values between 0 and 1
pcOut.y = pcTexCoords[iIndex].s / fDivisorU;
pcOut.x = pcTexCoords[iIndex].t / fDivisorV;
pcOut.x = pcTexCoords[iIndex].s / fDivisorU;
pcOut.y = 1.f-pcTexCoords[iIndex].t / fDivisorV;
}
pScene->mMeshes[0]->mFaces[i].mIndices[c] = iCurrent;
}
// FIX: flip the face order for use with OpenGL
pScene->mMeshes[0]->mFaces[i].mIndices[0] = iTemp+2;
pScene->mMeshes[0]->mFaces[i].mIndices[1] = iTemp+1;
pScene->mMeshes[0]->mFaces[i].mIndices[2] = iTemp+0;
}
}

View File

@ -509,14 +509,12 @@ void TextureTransformStep::Execute( aiScene* pScene)
it2 = it;++it2;
for (unsigned int m = n+1; m < size;++m, ++it2)
{
if ((*it2).uvIndex == n)
{
if ((*it2).uvIndex == n){
it2 = trafo.begin();
break;
}
}
if (it2 == trafo.begin())
{
if (it2 == trafo.begin()){
mesh->mTextureCoords[n] = new aiVector3D[mesh->mNumVertices];
}
}
@ -557,9 +555,7 @@ void TextureTransformStep::Execute( aiScene* pScene)
m5.a3 += trl.x; m5.b3 += trl.y;
matrix = m2 * m4 * matrix * m3 * m5;
for (src = dest; src != end; ++src)
{
for (src = dest; src != end; ++src) {
src->z = 1.f;
*src = matrix * *src;
src->x /= src->z;

View File

@ -1 +1 @@
#define SVNRevision 335
#define SVNRevision 342

View File

@ -0,0 +1,24 @@
From IRRLICHT/media
The Irrlicht Engine License
===========================
Copyright (C) 2002-2007 Nikolaus Gebhardt
This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages
arising from the use of this software.
Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute it
freely, subject to the following restrictions:
1. The origin of this software must not be misrepresented; you must not
claim that you wrote the original software. If you use this software
in a product, an acknowledgement in the product documentation would be
appreciated but is not required.
2. Altered source versions must be clearly marked as such, and must not be
misrepresented as being the original software.
3. This notice may not be removed or altered from any source distribution.

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

View File

@ -0,0 +1,24 @@
From IRRLICHT/media
The Irrlicht Engine License
===========================
Copyright (C) 2002-2007 Nikolaus Gebhardt
This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages
arising from the use of this software.
Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute it
freely, subject to the following restrictions:
1. The origin of this software must not be misrepresented; you must not
claim that you wrote the original software. If you use this software
in a product, an acknowledgement in the product documentation would be
appreciated but is not required.
2. Altered source versions must be clearly marked as such, and must not be
misrepresented as being the original software.
3. This notice may not be removed or altered from any source distribution.

Binary file not shown.

After

Width:  |  Height:  |  Size: 59 KiB

Binary file not shown.

View File

@ -1156,6 +1156,42 @@ void InitUI()
return;
}
//-------------------------------------------------------------------------------
// Message prcoedure for the smooth normals dialog
//-------------------------------------------------------------------------------
INT_PTR CALLBACK SMMessageProc(HWND hwndDlg,UINT uMsg,
WPARAM wParam,LPARAM lParam)
{
UNREFERENCED_PARAMETER(lParam);
switch (uMsg)
{
case WM_INITDIALOG:
char s[30];
::sprintf(s,"%.2f",g_smoothAngle);
SetDlgItemText(hwndDlg,IDC_EDITSM,s);
return TRUE;
case WM_CLOSE:
EndDialog(hwndDlg,0);
return TRUE;
case WM_COMMAND:
if (IDOK == LOWORD(wParam)) {
char s[30];
GetDlgItemText(hwndDlg,IDC_EDITSM,s,30);
g_smoothAngle = atof(s);
EndDialog(hwndDlg,0);
}
else if (IDCANCEL == LOWORD(wParam)) {
EndDialog(hwndDlg,1);
}
return TRUE;
}
return FALSE;
}
//-------------------------------------------------------------------------------
// Main message procedure of the application
//
@ -1763,6 +1799,10 @@ __DRUNKEN_ALIEN_FROM_MARS:
D3DCOLOR_ARGB(0xFF,0xFF,0xFF,0));
}
}
else if (ID_TOOLS_SETANGLELIMIT == LOWORD(wParam))
{
DialogBox(g_hInstance,MAKEINTRESOURCE(IDD_DIALOGSMOOTH),g_hDlg,&SMMessageProc);
}
else if (ID_VIEWER_CLEARHISTORY == LOWORD(wParam))
{
ClearHistory();

View File

@ -92,7 +92,7 @@ public:
bool g_bWasFlipped = false;
float g_smoothAngle = 80.f;
//-------------------------------------------------------------------------------
// Flip all normal vectors
@ -103,8 +103,7 @@ void AssetHelper::FlipNormalsInt()
for (unsigned int i = 0; i < this->pcScene->mNumMeshes;++i)
{
aiMesh* pcMesh = this->pcScene->mMeshes[i];
for (unsigned int a = 0; a < pcMesh->mNumVertices;++a)
{
for (unsigned int a = 0; a < pcMesh->mNumVertices;++a){
pcMesh->mNormals[a] *= -1.0f;
}
}
@ -126,24 +125,22 @@ void AssetHelper::FlipNormals()
//-------------------------------------------------------------------------------
void AssetHelper::SetNormalSet(unsigned int iSet)
{
if (this->iNormalSet == iSet)return;
// we need to build an unique set of vertices for this ...
{
MyMakeVerboseFormatProcess* pcProcess = new MyMakeVerboseFormatProcess();
pcProcess->Execute(this->pcScene);
pcProcess->Execute(pcScene);
delete pcProcess;
for (unsigned int i = 0; i < this->pcScene->mNumMeshes;++i)
for (unsigned int i = 0; i < pcScene->mNumMeshes;++i)
{
if (!this->apcMeshes[i]->pvOriginalNormals)
if (!apcMeshes[i]->pvOriginalNormals)
{
this->apcMeshes[i]->pvOriginalNormals = new aiVector3D[this->pcScene->mMeshes[i]->mNumVertices];
memcpy( this->apcMeshes[i]->pvOriginalNormals,this->pcScene->mMeshes[i]->mNormals,
this->pcScene->mMeshes[i]->mNumVertices * sizeof(aiVector3D));
apcMeshes[i]->pvOriginalNormals = new aiVector3D[pcScene->mMeshes[i]->mNumVertices];
memcpy( apcMeshes[i]->pvOriginalNormals,pcScene->mMeshes[i]->mNormals,
pcScene->mMeshes[i]->mNumVertices * sizeof(aiVector3D));
}
delete[] this->pcScene->mMeshes[i]->mNormals;
this->pcScene->mMeshes[i]->mNormals = NULL;
delete[] pcScene->mMeshes[i]->mNormals;
pcScene->mMeshes[i]->mNormals = NULL;
}
}
@ -152,49 +149,49 @@ void AssetHelper::SetNormalSet(unsigned int iSet)
if (HARD == iSet)
{
MyGenFaceNormalsProcess* pcProcess = new MyGenFaceNormalsProcess();
pcProcess->Execute(this->pcScene);
//FlipNormalsInt();
pcProcess->Execute(pcScene);
FlipNormalsInt();
delete pcProcess;
}
else if (SMOOTH == iSet)
{
MyGenVertexNormalsProcess* pcProcess = new MyGenVertexNormalsProcess();
pcProcess->SetMaxSmoothAngle(1.5f);
pcProcess->Execute(this->pcScene);
//FlipNormalsInt();
pcProcess->SetMaxSmoothAngle((float)AI_DEG_TO_RAD(g_smoothAngle));
pcProcess->Execute(pcScene);
FlipNormalsInt();
delete pcProcess;
}
else if (ORIGINAL == iSet)
{
for (unsigned int i = 0; i < this->pcScene->mNumMeshes;++i)
for (unsigned int i = 0; i < pcScene->mNumMeshes;++i)
{
if (this->apcMeshes[i]->pvOriginalNormals)
if (apcMeshes[i]->pvOriginalNormals)
{
delete[] this->pcScene->mMeshes[i]->mNormals;
this->pcScene->mMeshes[i]->mNormals = this->apcMeshes[i]->pvOriginalNormals;
this->apcMeshes[i]->pvOriginalNormals = NULL;
delete[] pcScene->mMeshes[i]->mNormals;
pcScene->mMeshes[i]->mNormals = apcMeshes[i]->pvOriginalNormals;
apcMeshes[i]->pvOriginalNormals = NULL;
}
}
}
// recalculate tangents and bitangents
Assimp::BaseProcess* pcProcess = new MyCalcTangentsProcess();
pcProcess->Execute(this->pcScene);
pcProcess->Execute(pcScene);
delete pcProcess;
// join the mesh vertices again
pcProcess = new MyJoinVerticesProcess();
pcProcess->Execute(this->pcScene);
pcProcess->Execute(pcScene);
delete pcProcess;
this->iNormalSet = iSet;
iNormalSet = iSet;
if (g_bWasFlipped)
{
// invert all normal vectors
for (unsigned int i = 0; i < this->pcScene->mNumMeshes;++i)
for (unsigned int i = 0; i < pcScene->mNumMeshes;++i)
{
aiMesh* pcMesh = this->pcScene->mMeshes[i];
aiMesh* pcMesh = pcScene->mMeshes[i];
for (unsigned int a = 0; a < pcMesh->mNumVertices;++a)
{
pcMesh->mNormals[a] *= -1.0f;

Binary file not shown.

View File

@ -272,6 +272,7 @@ enum EClickPos
extern bool g_bPlay /*= false*/;
extern double g_dCurrent;
extern float g_smoothAngle /*= 90.f*/;
}
#endif // !! AV_MAIN_H_INCLUDED

View File

@ -156,6 +156,20 @@ BEGIN
CONTROL "",IDC_EDIT1,"RichEdit20A",ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY | ES_NUMBER | WS_VSCROLL | WS_TABSTOP,3,4,358,174,WS_EX_STATICEDGE
END
IDD_DIALOGSMOOTH DIALOGEX 0, 0, 253, 86
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Set smooth limit "
FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN
DEFPUSHBUTTON "OK",IDOK,195,53,50,14
PUSHBUTTON "Cancel",IDCANCEL,143,53,50,14
EDITTEXT IDC_EDITSM,107,7,139,14,ES_AUTOHSCROLL | ES_NUMBER
LTEXT "Angle limit (in degrees):",IDC_STATIC,13,10,76,8
LTEXT "The angle limit defines the maximum angle that may be between two adjacent face normals that they're smoothed together.",IDC_STATIC,13,27,231,19
LTEXT "NOTE: use 'Smooth normals' to update the normals to the new settings",IDC_STATIC,12,75,230,8
CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,7,73,239,1
END
#ifdef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
@ -259,6 +273,14 @@ BEGIN
TOPMARGIN, 14
BOTTOMMARGIN, 175
END
IDD_DIALOGSMOOTH, DIALOG
BEGIN
LEFTMARGIN, 7
RIGHTMARGIN, 246
TOPMARGIN, 7
BOTTOMMARGIN, 79
END
END
#endif // APSTUDIO_INVOKED
@ -310,9 +332,10 @@ BEGIN
MENUITEM "Clear log", ID_TOOLS_CLEARLOG
MENUITEM SEPARATOR
MENUITEM "Original normals", ID_TOOLS_ORIGINALNORMALS, CHECKED
MENUITEM "Smooth normals", ID_TOOLS_SMOOTHNORMALS
MENUITEM "Hard normals", ID_TOOLS_HARDNORMALS
MENUITEM "Smooth normals", ID_TOOLS_SMOOTHNORMALS
MENUITEM SEPARATOR
MENUITEM "Set angle limit ...", ID_TOOLS_SETANGLELIMIT
MENUITEM "Flip normals", ID_TOOLS_FLIPNORMALS
MENUITEM SEPARATOR
MENUITEM "Stereo view", ID_TOOLS_STEREOVIEW

View File

@ -40,6 +40,7 @@
#define IDB_BTXI 155
#define IDR_TXPOPUP 156
#define IDR_MATPOPUP 157
#define IDD_DIALOGSMOOTH 159
#define IDC_CHECK1 1000
#define IDC_TOGGLEMS 1000
#define IDC_CHECK2 1001
@ -104,6 +105,7 @@
#define IDC_PLAY 1053
#define IDC_SHOWSKELETON 1054
#define IDC_BFCULL 1055
#define IDC_EDITSM 1056
#define ID_VIEWER_OPEN 32771
#define ID_VIEWER_CLOSETHIS 32772
#define ID_VIEWER_CLOSEASSET 32773
@ -164,6 +166,27 @@
#define ID_VERTEXCACHELOCALITY_FINDBEST 32828
#define ID_OPTIMIZE_SCENEGRAPH 32829
#define ID_SCENEGRAPH_SMALLESTPOSSIBLEGRAPH 32830
#define ID_SMOOTHNORMALS_5 32831
#define ID_SMOOTHNORMALS_6 32832
#define ID_SMOOTHNORMALS_MAXANGLE60 32833
#define ID_SMOOTHNORMALS_MAXANGLE90 32834
#define ID_SMOOTHNORMALS_MAXANGLE120 32835
#define ID_SMOOTHNORMALS_NOLIMIT 32836
#define ID_SMOOTHNORMALS_30 32837
#define ID_SMOOTHNORMALS_40 32838
#define ID_SMOOTHNORMALS_60 32839
#define ID_SMOOTHNORMALS_90 32840
#define ID_SMOOTHNORMALS_120 32841
#define ID_Menu32842 32842
#define ID_SMOOTHANGLE_30 32843
#define ID_SMOOTHANGLE_40 32844
#define ID_SMOOTHANGLE_50 32845
#define ID_SMOOTHANGLE_60 32846
#define ID_SMOOTHANGLE_70 32847
#define ID_SMOOTHANGLE_90 32848
#define ID_SMOOTHANGLE_120 32849
#define ID_SMOOTHANGLE_NONE 32850
#define ID_TOOLS_SETANGLELIMIT 32851
#define IDC_STATIC -1
// Next default values for new objects
@ -171,9 +194,9 @@
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NO_MFC 1
#define _APS_NEXT_RESOURCE_VALUE 159
#define _APS_NEXT_COMMAND_VALUE 32831
#define _APS_NEXT_CONTROL_VALUE 1056
#define _APS_NEXT_RESOURCE_VALUE 160
#define _APS_NEXT_COMMAND_VALUE 32852
#define _APS_NEXT_CONTROL_VALUE 1057
#define _APS_NEXT_SYMED_VALUE 110
#endif
#endif