diff --git a/code/ColladaLoader.cpp b/code/ColladaLoader.cpp index 69058a5e6..8941d39e0 100644 --- a/code/ColladaLoader.cpp +++ b/code/ColladaLoader.cpp @@ -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()); } } diff --git a/code/MD2FileData.h b/code/MD2FileData.h index 45981becb..7a0ac94c6 100644 --- a/code/MD2FileData.h +++ b/code/MD2FileData.h @@ -144,8 +144,8 @@ struct Frame */ struct TexCoord { - int16_t s; - int16_t t; + uint16_t s; + uint16_t t; } PACK_STRUCT; // --------------------------------------------------------------------------- diff --git a/code/MD2Loader.cpp b/code/MD2Loader.cpp index 809b250d0..1a3ae9edb 100644 --- a/code/MD2Loader.cpp +++ b/code/MD2Loader.cpp @@ -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(&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(&iMode, 1, AI_MATKEY_SHADING_MODEL); - aiColor3D clr; clr.b = clr.g = clr.r = 1.0f; pcHelper->AddProperty(&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(&iMode, 1, AI_MATKEY_SHADING_MODEL); - aiColor3D clr; clr.b = clr.g = clr.r = 0.6f; pcHelper->AddProperty(&clr, 1,AI_MATKEY_COLOR_DIFFUSE); @@ -327,16 +322,22 @@ void MD2Importer::InternReadFile( const std::string& pFile, pcHelper->AddProperty(&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; } } diff --git a/code/TextureTransform.cpp b/code/TextureTransform.cpp index b34ce31f4..3dfbb58bd 100644 --- a/code/TextureTransform.cpp +++ b/code/TextureTransform.cpp @@ -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; diff --git a/mkutil/revision.h b/mkutil/revision.h index 73a951490..65814ae21 100644 --- a/mkutil/revision.h +++ b/mkutil/revision.h @@ -1 +1 @@ -#define SVNRevision 335 +#define SVNRevision 342 diff --git a/test/models/MD2/faerie-source.txt b/test/models/MD2/faerie-source.txt new file mode 100644 index 000000000..ea7ed82bb --- /dev/null +++ b/test/models/MD2/faerie-source.txt @@ -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. \ No newline at end of file diff --git a/test/models/MD2/faerie.md2 b/test/models/MD2/faerie.md2 new file mode 100644 index 000000000..74ce5a8da Binary files /dev/null and b/test/models/MD2/faerie.md2 differ diff --git a/test/models/MD2/faerie2.bmp b/test/models/MD2/faerie2.bmp new file mode 100644 index 000000000..56a486a6c Binary files /dev/null and b/test/models/MD2/faerie2.bmp differ diff --git a/test/models/MD2/sidney-source.txt b/test/models/MD2/sidney-source.txt new file mode 100644 index 000000000..ea7ed82bb --- /dev/null +++ b/test/models/MD2/sidney-source.txt @@ -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. \ No newline at end of file diff --git a/test/models/MD2/sydney.bmp b/test/models/MD2/sydney.bmp new file mode 100644 index 000000000..2f14a5a03 Binary files /dev/null and b/test/models/MD2/sydney.bmp differ diff --git a/test/models/MD2/sydney.md2 b/test/models/MD2/sydney.md2 new file mode 100644 index 000000000..7d3521dd4 Binary files /dev/null and b/test/models/MD2/sydney.md2 differ diff --git a/tools/assimp_view/MessageProc.cpp b/tools/assimp_view/MessageProc.cpp index 534b312f5..e3a353d69 100644 --- a/tools/assimp_view/MessageProc.cpp +++ b/tools/assimp_view/MessageProc.cpp @@ -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(); diff --git a/tools/assimp_view/Normals.cpp b/tools/assimp_view/Normals.cpp index 53aa7cdde..387007074 100644 --- a/tools/assimp_view/Normals.cpp +++ b/tools/assimp_view/Normals.cpp @@ -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; diff --git a/tools/assimp_view/assimp_view.aps b/tools/assimp_view/assimp_view.aps index 452258e0b..711cafaa1 100644 Binary files a/tools/assimp_view/assimp_view.aps and b/tools/assimp_view/assimp_view.aps differ diff --git a/tools/assimp_view/assimp_view.h b/tools/assimp_view/assimp_view.h index 95d5095e4..882bca05f 100644 --- a/tools/assimp_view/assimp_view.h +++ b/tools/assimp_view/assimp_view.h @@ -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 \ No newline at end of file diff --git a/tools/assimp_view/assimp_view.rc b/tools/assimp_view/assimp_view.rc index f4bfa4812..b7b89f9c7 100644 --- a/tools/assimp_view/assimp_view.rc +++ b/tools/assimp_view/assimp_view.rc @@ -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 diff --git a/tools/assimp_view/resource.h b/tools/assimp_view/resource.h index 0fe1963e4..3d357c159 100644 --- a/tools/assimp_view/resource.h +++ b/tools/assimp_view/resource.h @@ -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