/*==LICENSE==* CyanWorlds.com Engine - MMOG client, server and tools Copyright (C) 2011 Cyan Worlds, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . You can contact Cyan Worlds, Inc. by email legal@cyan.com or by snail mail at: Cyan Worlds, Inc. 14617 N Newport Hwy Mead, WA 99021 *==LICENSE==*/ ////////////////////////////////////////////////////////////////////////////// // // // plMeshConverter Class Header // // Static class that converts a Max triMesh object into the geometrySpans // // necessary for a plDrawableIce object. // // // //// Version History ///////////////////////////////////////////////////////// // // // Created 4.18.2001 mcn // // // ////////////////////////////////////////////////////////////////////////////// #ifndef _plMeshConverter_h #define _plMeshConverter_h #include "Max.h" #include "HeadSpin.h" #include "hsTemplates.h" class plMaxNode; class plErrorMsg; class hsConverterUtils; class plMaxNode; class plGeometrySpan; struct hsPoint3; struct hsVector3; struct hsMatrix44; class ISkin; class plConvexVolume; class plMAXVertNormal; class BitmapTex; class hsGMaterial; class plExportMaterialData; //// Class Definition //////////////////////////////////////////////////////// class plMeshConverter { private: plMeshConverter(); static hsBool fWarnBadNormals; static char fWarnBadNormalsMsg[]; static hsBool fWarnBadUVs; static char fWarnBadUVsMsg[]; static hsBool fWarnSuspiciousUVs; static char fWarnSuspiciousUVsMsg[]; static char fTooManyVertsMsg[]; static char fTooManyFacesMsg[]; public: ~plMeshConverter(); static plMeshConverter& Instance(); void Init( hsBool save, plErrorMsg *msg ); void DeInit( hsBool deInitLongRecur = true ); void StuffPositionsAndNormals(plMaxNode *node, hsTArray *pos, hsTArray *normals); plConvexVolume *CreateConvexVolume( plMaxNode *node ); // doPreshading - If true, do crappy flat shading now (since we won't do any shading later) hsBool CreateSpans( plMaxNode *node, hsTArray &spanArray, bool doPreshading ); private: bool IValidateUVs(plMaxNode* node); void ISetBumpUvs(Int16 uvChan, hsTArray& vertDPosDuvCache, TVFace* tvFace, UInt32 smGroup, hsPoint3* uvs1, hsPoint3* uvs2, hsPoint3* uvs3); void ISetBumpUvSrcs(hsTArray *>& ourMaterials, hsTArray& bumpLayIdx, hsTArray& bumpLayChan, hsTArray& bumpDuChan, hsTArray& bumpDvChan); void ISetWaterDecEnvUvSrcs(hsTArray *>& ourMaterials, hsTArray& bumpLayIdx, hsTArray& bumpLayChan, hsTArray& bumpDuChan, hsTArray& bumpDvChan); void ISmoothUVGradients(plMaxNode* node, Mesh* mesh, hsTArray *>& ourMaterials, hsTArray& bumpLayIdx, hsTArray& bumpLayChan, hsTArray* vertDPosDuCache, hsTArray* vertDPosDvCache); Point3 IGetUvGradient(plMaxNode* node, const hsMatrix44& uvXform44, Int16 bmpUvwSrc, Mesh *mesh, int faceIdx, int iUV); int IGenerateUVs( plMaxNode *node, Mtl *maxMtl, Mesh *mesh, int faceIdx, int numChan, int numBlend, hsPoint3 *uvs1, hsPoint3 *uvs2, hsPoint3 *uvs3 ); void IGetUVTransform( plMaxNode *node, Mtl *mtl, Matrix3 *uvTransform, int which ); UInt32 ICreateHexColor( float r, float g, float b ); UInt32 ISetHexAlpha( UInt32 color, float alpha ); Mesh* IGetNodeMesh(plMaxNode *node); void IDeleteTempGeometry(); Mesh* IDuplicate2Sided(plMaxNode *node, Mesh* mesh); Interface *fInterface; hsConverterUtils& fConverterUtils; plErrorMsg *fErrorMsg; hsBool fIsInitialized; // Non-nil if we converted the MAX object and have to delete it when we're done TriObject *fTriObjToDelete; // Non-nil if we made a copy to mess with that we need to delete when we're done Mesh *fMeshToDelete; }; #endif // _plMeshConverter_h