2017-04-17 06:17:10 -06:00

266 lines
7.1 KiB
C++
Executable File

//-----------------------------------------------------------------------------
// Torque Game Engine
// Copyright (C) GarageGames.com, Inc.
//-----------------------------------------------------------------------------
#ifndef _INC_MAPEXPORTER
#define _INC_MAPEXPORTER
// MAX files
#pragma pack(push,4)
#include <max.h>
#include <stdmat.h>
#include <bmmlib.h>
#include <bitmap.h>
#include <iparamb2.h>
#pragma pack(pop)
#ifndef _PLATFORM_H_
#include "platform/platform.h"
#endif
#ifndef _MMATH_H_
#include "math/mMath.h"
#endif
#ifndef _TVECTOR_H_
#include "core/tVector.h"
#endif
#ifndef _BITVECTOR_H_
#include "core/bitVector.h"
#endif
#ifndef _COLOR_H_
#include "core/color.h"
#endif
#ifndef _FILESTREAM_H_
#include "core/fileStream.h"
#endif
#ifndef DLLEXPORT
#define DLLEXPORT __declspec(dllexport)
#endif
extern const S32 gcProgramVersion;
// Forward declarations
class MaterialList;
class Interior;
//
class MapProperties
{
public:
MapProperties();
const char * mWadName;
F32 mGeometryScale;
F32 mLightingScale;
ColorI mAmbientColor;
ColorI mEmergencyAmbientColor;
};
//------------------------------------------------------------------------------
// Object::ConvertToType can create a new object which we are responsible for deleting
class TriObjRef
{
private:
TriObject * mRef;
bool mOwnObject;
TriObject & operator =(const TriObjRef& rhs); // disable
public:
TriObjRef(TriObject * obj, bool ownObject);
TriObjRef(TriObjRef & rhs);
~TriObjRef();
// --- inlines
operator TriObject *(void){ return(mRef); }
TriObject & operator*(void){ return(*mRef); }
TriObject * operator->(void){ return(mRef); }
};
//------------------------------------------------------------------------------
static const U32 MaxWindingPoints = 32;
struct Winding
{
U32 numIndices;
U32 indices[MaxWindingPoints];
};
// this is a WorldCraft 3.3 compatable surface description
struct Surface
{
S32 planeIndex;
Winding winding;
PlaneF texGenX;
PlaneF texGenY;
U16 materialIndex;
};
//------------------------------------------------------------------------------
class ObjectBase
{
protected:
TriObjRef mTriObjRef;
INode * mNode;
public:
ObjectBase(TriObjRef objRef, INode * node);
};
class SceneObject : public ObjectBase
{
public:
SceneObject(TriObjRef objRef, INode * node);
bool process();
};
//--------------------------------------------------------------------------
class ConvexHullObject : public ObjectBase
{
public:
Vector<PlaneF> mPlanes;
Vector<Point3F> mPoints;
bool mIsConvex;
ConvexHullObject(TriObjRef objRef, INode * node);
void process();
};
//
class CollisionDetail
{
public:
Vector<ConvexHullObject*> mConvexHulls;
~CollisionDetail();
void addConvexHullObject(ConvexHullObject * obj) { mConvexHulls.push_back(obj); }
void processConvexHullObjects();
void export(FileStream & file);
};
//
class EditGeometry
{
public:
EditGeometry();
~EditGeometry();
Vector<SceneObject*> mSceneObjects;
Vector<Surface> mSurfaces;
U32 mMinPixels;
private:
Vector<const char *> mMaterialNames;
Vector<Point2I> mMaterialSizes;
Vector<PlaneF> mPlanes;
Vector<Point3F> mPoints;
public:
U32 numPlanes(){return(mPlanes.size());}
U32 insertPlane(const PlaneF & plane);
const PlaneF & getPlane(U32 index){return(mPlanes[index]);}
U32 numPoints(){return(mPoints.size());}
U32 insertPoint(const Point3F & pnt);
const Point3F & getPoint(U32 index){return(mPoints[index]);}
U32 numMaterials(){return(mMaterialNames.size());}
U32 insertMaterial(Mtl * material);
const char * getMaterial(U32 index){return(mMaterialNames[index]);}
void addSceneObject(SceneObject * obj){mSceneObjects.push_back(obj);}
void processSceneObjects();
Point3F getSurfaceCenter(Surface & surface);
const char * getWadName();
void exportToMap(const char * fileName, U32 detailNum);
};
extern EditGeometry * gWorkingGeometry;
// ------------------------------------------------------------------
class DetailEnumerator : public ITreeEnumProc
{
private:
Vector<EditGeometry *> mDetails;
CollisionDetail mCollisionDetail;
public:
DetailEnumerator();
~DetailEnumerator();
// ITreeEnumProc
int callback(INode * node);
void enumScene(IScene * scene);
EditGeometry * createDetail(U32 minPixels);
EditGeometry * getNodeDetail(INode * node);
bool isCollisionHullObject(INode * node);
void sortDetails();
bool sequentialDetails();
U32 numDetails() { return(mDetails.size()); }
EditGeometry * getDetail(U32 index) { return(mDetails[index]); }
CollisionDetail * getCollisionDetail() { return(&mCollisionDetail); }
};
//------------------------------------------------------------------------------
// main plugin class
class Exporter : public SceneExport
{
public:
DetailEnumerator mDetailEnum;
MapProperties mMapProperties;
bool getMapProperties();
const char * generateMapName(const char * baseName, U32 detail, U32 numDetails);
// SceneExport
const TCHAR * Ext(int index);
int DoExport(const TCHAR * name, ExpInterface * expIFace, Interface * iFace, BOOL suppressPrompts=FALSE, DWORD options=0);
// -- inlines
int ExtCount(){return(1);}
const TCHAR * LongDesc(){return(_T("WorldCraft 3.3 Map Exporter"));}
#if defined(TORQUE_DEBUG)
const TCHAR * ShortDesc(){return(_T("WorldCraft 3.3 Map File(DBG)"));}
#else
const TCHAR * ShortDesc(){return(_T("WorldCraft 3.3 Map File"));}
#endif
const TCHAR * AuthorName(){return(_T("JohnF"));}
const TCHAR * CopyrightMessage(){return(_T("Copyright GarageGames.com, 2001"));}
const TCHAR * OtherMessage1(){return(_T(""));}
const TCHAR * OtherMessage2(){return(_T(""));}
unsigned int Version(){return(gcProgramVersion);}
void ShowAbout(HWND hWnd){};
};
//------------------------------------------------------------------------------
// This class gives MAX a description of our plugin
class PluginDescription : public ClassDesc
{
public:
// ClassDesc
int IsPublic(){return(true);}
void * Create(BOOL loading = false){return(new Exporter);}
const TCHAR * ClassName(){return _T("Torque WorldCraft 3.3 Map Exporter");}
SClass_ID SuperClassID(){return(SCENE_EXPORT_CLASS_ID);}
Class_ID ClassID(){return(Class_ID(0x4a23445d, 0x577b4b6b));}
const TCHAR * Category() {return _T("");}
void DeleteThis(){}
};
#endif