|
|
今日动手是着把XSkinExp大修改,但出了问题,请大家指教,代码如下,红字出错:
#include "pch.h"
#include "XSkinExp.h"
#include "decomp.h"
#include <initguid.h>
#include "XSkinExpTemplates.h"
#include "dxfile.h"
#include "rmxfguid.h"
#include "rmxftmpl.h"
#include<fstream>
using namespace std;
INode *node;INode *rnode;
fstream file;
class CFindRootNode : public ITreeEnumProc
{
public:
CFindRootNode()
:m_pNodeRoot(NULL) {}
virtual int callback(INode *pNode)
{
INode *pNodeCur = pNode;
while (!pNodeCur->IsRootNode())
{
pNodeCur = pNodeCur->GetParentNode();
}
m_pNodeRoot = pNodeCur;
return TREE_ABORT;
}
INode *m_pNodeRoot;
};
static XSkinExpDesc HDesc;
ClassDesc* GetXSkinExpDesc() {return &HDesc;}
void XSkinExpDesc::ResetClassParams (BOOL fileReset)
{
}
XSkinExp::XSkinExp()
{
}
XSkinExp::~XSkinExp()
{
}
int XSkinExp::ExtCount()
{
return 1;
}
const TCHAR *XSkinExp::Ext(int n)
{
return _T(".X");
}
const TCHAR *XSkinExp: ongDesc()
{
return _T("X-FILE");
}
const TCHAR *XSkinExp::ShortDesc()
{
return _T("X-File");
}
const TCHAR *XSkinExp::AuthorName()
{
return _T("Craig Peeper");
}
const TCHAR *XSkinExp::CopyrightMessage()
{
return _T("Copyright 2000, MicroSoft");
}
const TCHAR *XSkinExp::OtherMessage1()
{
return _T("");
}
const TCHAR *XSkinExp::OtherMessage2()
{
return _T("");
}
unsigned int XSkinExp::Version()
{
return 100;
}
void XSkinExp::ShowAbout(HWND hWnd)
{
}
BOOL XSkinExp::SupportsOptions(int ext, DWORD options)
{
return ( options == SCENE_EXPORT_SELECTED );
}
TriObject *GetTriObjectFromObjRef(Object* pObj, BOOL *pbDeleteIt)
{
TriObject *pTri;
assert(pObj != NULL);
assert(pbDeleteIt != NULL);
*pbDeleteIt = FALSE;
pObj= pObj->Eval(0).obj;
assert(pObj != NULL);
if (pObj->CanConvertToType(Class_ID(TRIOBJ_CLASS_ID, 0)))
{
pTri = (TriObject *) pObj->ConvertToType(0, Class_ID(TRIOBJ_CLASS_ID, 0));
if (pObj != pTri)
*pbDeleteIt = TRUE;
return pTri;
}
else
{
return NULL;
}
}
void DoMesh(INode* pNode)
{
TriObject *pTriObject = NULL;
Mesh *pMesh;
DWORD nVert, nFace;
BOOL bDeleteTriObject = false;
const ObjectState &pWorldObjState = pNode->EvalWorldState(0);
pTriObject = GetTriObjectFromObjRef(pWorldObjState.obj, &bDeleteTriObject);
pMesh = &(pTriObject->mesh);
pMesh->RemoveIllegalFaces();
pMesh->RemoveDegenerateFaces();
pMesh->DeleteIsoVerts();
pMesh->DeleteIsoMapVerts();
pMesh->checkNormals(TRUE);
Matrix3 matNodeTM = pNode->GetObjTMAfterWSM(0);
BOOL bSwapTriOrder = !matNodeTM.Parity();
nVert=pMesh->numVerts;
nFace=pMesh->numFaces;
file<<nVert;
for(DWORD i=0;i<nVert;i++)
file<<pMesh->verts.x<<pMesh->verts.y<<pMesh->verts.z<<pMesh->getNormal(i).x<<pMesh->getNormal(i).y<<pMesh->getNormal(i).z;
file<<nFace;
for(i=0;i<nFace;i++)
if( bSwapTriOrder )
file<<pMesh->faces.v[0]<<pMesh->faces.v[1]<<pMesh->faces.v[2];
else
file<<pMesh->faces.v[0]<<pMesh->faces.v[2]<<pMesh->faces.v[1];
DWORD cChildren = pNode->NumberOfChildren();
for (int iChild = 0; iChild < cChildren; iChild++)
{
DoMesh(pNode->GetChildNode(iChild));
}
}
int XSkinExp: oExport(const TCHAR *szFilename,ExpInterface *ei,
Interface *i, BOOL suppressPrompts, DWORD options)
{
HRESULT hr;
CFindRootNode RootNode;
BOOL bSaveSelection = (options & SCENE_EXPORT_SELECTED);
if (szFilename == NULL)
return FALSE;
ei->theScene ->EnumTree (&RootNode);
rnode=RootNode.m_pNodeRoot ;
file.open (szFilename);
DoMesh(rnode);
file.close ();
return TRUE;
} |
|