1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270
|
/*******************************************************************************
Copyright (c) 2012, Jonathan Hiller
This file is part of the AMF Tools suite. http://amf.wikispaces.com/
AMF Tools is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
AMF Tools 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 Lesser General Public License for more details.
See <http://www.opensource.org/licenses/lgpl-3.0.html> for license details.
*******************************************************************************/
#ifndef AMFFILE_H
#define AMFFILE_H
#include "nAmf.h"
#include "Vec3D.h"
#include "MeshSlice.h"
//for file imports
#include "STL_File.h"
#include "X3D_File.h"
/*DEPRECATED*/ enum EnvelopeData {ENVL_XMIN, ENVL_YMIN, ENVL_ZMIN, ENVL_XMAX, ENVL_YMAX, ENVL_ZMAX, ENVL_XSIZE, ENVL_YSIZE, ENVL_ZSIZE};
enum InstanceParamD {INST_DX, INST_DY, INST_DZ, INST_RX, INST_RY, INST_RZ};
enum ColorView {CV_ALL, CV_VERT, CV_TRI, CV_TRICOLOR, CV_TRITEX, CV_VOL, CV_OBJ, CV_MAT}; //what colors to draw the vertex
enum ViewMode {VM_SOLID, VM_WIREFRAME, VM_SOLIDPLUSWIRE};
class nObjectExt;
class AmfFile :
protected nAmf
{
public:
AmfFile(void);
~AmfFile(void);
AmfFile(const AmfFile& In);
AmfFile& operator=(const AmfFile& In);
//Amf I/O
bool Save(std::string AmfFilePath, bool Compressed = true); //LastError
bool Load(std::string AmfFilePath, bool StrictLoad = true); //LastError
bool ImportAmf(std::string AmfFilePath, bool StrictLoad = true); //merges this AMF with the current AMF
void ClearAll();
//importing meshes
bool ImportMesh(std::string MeshFilePath, int AmfObjectIndex=0, int AmfMeshIndex=0); //LastError //imports a mesh into a mesh node specified (stl or x3d only)
bool LoadStl(std::string StlFilePath); //LastError //imports an stl into a mesh node specified
bool GetStlMeshSize(double* XSize, double* YSize, double* ZSize); //LastError
bool ImportStl(int AmfObjectIndex=0, int AmfMeshIndex=0); //LastError //imports an stl into a mesh node specified
bool LoadX3d(std::string X3dFilePath, std::string ImagePath="", std::string* ImgPathErrorReturn = NULL); //LastError //imports an x3d into a mesh node specified
bool GetX3dMeshSize(double* XSize, double* YSize, double* ZSize); //LastError
bool ImportX3d(int AmfObjectIndex=0, int AmfMeshIndex=0); //LastError //imports an x3d into a mesh node specified
//exporting meshes
bool ExportSTL(std::string StlFilePath);
//Units
void SetImportUnits(UnitSystem Units);
UnitSystem GetUnits(void) {return aUnit;}
std::string GetUnitsString(void){return GetUnitsString(aUnit);}
std::string GetUnitsString(UnitSystem SysIn);
void SetUnits(UnitSystem UnitSystemIn) {aUnit = UnitSystemIn; UnitsExist = true;}
double ConvertUnits(double Value, UnitSystem OriginalUnits, UnitSystem DesiredUnits);
double ToCurrentUnits(double Value, UnitSystem OriginalUnits){return ConvertUnits(Value, OriginalUnits, aUnit);}
double FromCurrentUnits(double Value, UnitSystem DesiredUnits){return ConvertUnits(Value, aUnit, DesiredUnits);}
//Size of Amf
double GetEnvelopeData(EnvelopeData Data); //DEPRECATED
//TODO: rethink these
bool GetEnvlMin(double* pXMinOut, double* pYMinOut, double* pZMinOut, int RenderIndex=-1);
bool GetEnvlMax(double* pXMaxOut, double* pYMaxOut, double* pZMaxOut, int RenderIndex=-1);
bool GetEnvlSize(double* pXSizeOut, double* pYSizeOut, double* pZSizeOut, int RenderIndex=-1);
bool GetEnvlRotQuat(double* pWRotOut, double* pXRotOut, double* pYRotOut, double* pZRotOut, int RenderIndex=-1);
bool GetEnvlRotAngleAxis(double* pAngleRadOut, double* pNXOut, double* pNYOut, double* pNZOut, int RenderIndex=-1);
bool GetEnvlOrigin(double* pXOriginOut, double* pYOriginOut, double* pZOriginOut, int RenderIndex=-1);
bool GetEnvlDims(double* pIDimOut, double* pJDimOut, double* pKDimOut, int RenderIndex=-1);
bool Scale(double ScaleFactor, bool ScaleConstellations=true, bool ScaleEquations = false) {return Scale(ScaleFactor, ScaleFactor, ScaleFactor, ScaleConstellations, ScaleEquations);}
bool Scale(double ScaleFactorX, double ScaleFactorY, double ScaleFactorZ, bool ScaleConstellations=true, bool ScaleEquations = false);
//Amf Objects:
int GetObjectCount(void) {return GetNumObjects();}
std::string GetObjectName(int ObjectIndex);
void RenameObject(int ObjectIndex, std::string NewName);
int AddObject(std::string Name = "") {AppendObject(Name); return Objects.size()-1;}
void RemoveObject(int ObjectIndex);
void TranslateObject(int ObjectIndex, double dx, double dy, double dz);
void RotateObject(int ObjectIndex, double rx, double ry, double rz);
//Amf Meshes
int GetMeshCount(int ObjectIndex);
//Amf Volumes
int GetVolumeCount(int ObjectIndex, int MeshIndex);
std::string GetVolumeName(int ObjectIndex, int MeshIndex, int VolumeIndex);
void RenameVolume(int ObjectIndex, int MeshIndex, int VolumeIndex, std::string NewName);
int GetVolumeMaterialIndex(int ObjectIndex, int MeshIndex, int VolumeIndex);
bool SetVolumeMaterialIndex(int ObjectIndex, int MeshIndex, int VolumeIndex, int MaterialIndex);
//Amf Constellations:
int GetConstellationCount(void) {return GetNumConstellations();}
std::string GetConstellationName(int ConstellationIndex);
void RenameConstellation(int ConstellationIndex, std::string NewName);
int AddConstellation(std::string Name = "") {AppendConstellation(Name); return Constellations.size()-1;}
void RemoveConstellation(int ConstellationIndex);
bool IsConstellationReferencedBy(int ConstellationIndex, int ConstellationIndexToCheck);
//Amf Instances
int GetInstanceCount(int ConstellationIndex);
int AddInstance(int ConstellationIndex);
void RemoveInstance(int ConstellationIndex, int InstanceIndex);
bool SetInstanceObjectIndex(int ConstellationIndex, int InstanceIndex, int InstanceObjectIndex);
bool SetInstanceConstellationIndex(int ConstellationIndex, int InstanceIndex, int InstanceConstellationIndex);
int GetInstanceObjectIndex(int ConstellationIndex, int InstanceIndex);
int GetInstanceConstellationIndex(int ConstellationIndex, int InstanceIndex);
bool SetInstanceParam(int ConstellationIndex, int InstanceIndex, InstanceParamD ParamD, double Value);
double GetInstanceParam(int ConstellationIndex, int InstanceIndex, InstanceParamD ParamD);
//Amf Materials:
int GetMaterialCount(void) {return GetNumMaterials();}
std::string GetMaterialName(int MaterialIndex);
void RenameMaterial(int MaterialIndex, std::string NewName);
int AddMaterial(std::string Name = "") {AppendMaterial(Name); return Materials.size()-1;}
int AddMaterial(std::string Name, int Red, int Green, int Blue) {int MatIndex=AddMaterial(Name); SetMaterialColorI(MatIndex, Red, Green, Blue); return MatIndex;}
int AddMaterial(std::string Name, double Red, double Green, double Blue) {int MatIndex=AddMaterial(Name); SetMaterialColorD(MatIndex, Red, Green, Blue); return MatIndex;}
void RemoveMaterial(int MaterialIndex);
bool IsMaterialReferencedBy(int MaterialIndex, int MaterialIndexToCheck);
bool SetMaterialColorD(int MaterialIndex, double Red, double Green, double Blue);
bool SetMaterialColorI(int MaterialIndex, int Red, int Green, int Blue){return SetMaterialColorD(MaterialIndex, Red/255.0, Green/255.0, Blue/255.0);}
bool GetMaterialColorD(int MaterialIndex, double *Red, double *Green, double *Blue);
bool GetMaterialColorI(int MaterialIndex, int *Red, int *Green, int *Blue);
//Amf Composites
int GetCompositeCount(int MaterialIndex);
void ClearComposites(int MaterialIndex);
int AddComposite(int MaterialIndex, int MaterialIndexToComposite = 0);
void RemoveComposite(int MaterialIndex, int CompositeIndex);
bool SetCompositeMaterialIndex(int MaterialIndex, int CompositeIndex, int CompositeMaterialIndex); //1-based (because 0 always VOID material
int GetCompositeMaterialIndex(int MaterialIndex, int CompositeIndex); //1-based (because 0 always VOID material
std::string GetCompositeEquation(int MaterialIndex, int CompositeIndex); //use! ToAmfString()
bool SetCompositeEquation(int MaterialIndex, int CompositeIndex, std::string Equation);
//Amf Textures:
int GetTextureCount(void) {return GetNumTextures();}
//Output utilities
bool SetSubdivisionLevel(int Level=4);
void DrawGL(); //draw everything!
/// int GetRenderedMeshCount(void); //number of meshes drawn on the screen
unsigned char* GetSliceBitmapRGBA(double PixelSizeX, double PixelSizeY, double SliceHeightZ, int* XSizeOut, int* YSizeOut, double SurfaceDepth = 0.0);
int* GetSliceSegmentsXY(double ZHeight, int* NumSegmentsOut);
//Errors and information
std::string GetInfoString(bool MeshInfo = true);
std::string* pLastErrorMsg() {return &LastError;}
std::string GetLastErrorMsg() {return LastError;}
//Real time status info on long i/o operations
bool* pCancelIO() {return &CancelIO;}
int* pCurTick(){return &CurTick;}
int* pMaxTick(){return &MaxTick;}
std::string* pStatusMsg(){return &CurrentMessage;}
std::vector<nObjectExt> RenderedObjs; //todo: this should be protected...
protected:
//Amf I/O utilities
//bool CheckValid(bool Strict=true, std::string* pMessage = 0);
//Import meshes Utilities/members
CSTL_File StlFile;
CX3D_File X3dFile;
enum Channel{CR, CG, CB, CA};
int AddTexture(CSimpleImage* pImageIn, Channel ChannelToGet, bool TiledIn = true); //adds texture, returns the ID it was added with. If the volume already has a texture on this channel, it resizes the texture to add this one and adjusts all texmap coordinates accordingly
void ToOneTexturePerVolume(void); //if a volume references more than one texture
void X3dFillImportInfo(nMesh* pMesh, std::vector<nVolume*>* pVolumes, std::vector<int>* pCoordsBeginIndex); //resizes pVolume to the number of x3d shapes and fills with a pointer to the volume (creating new volumes) each should be loaded in to. alse fills pCoordsBeginIndex with what vertex index in the AMF mesh vertex list these coordinates start...
//Units utilities
UnitSystem CurImportUnits; //units system of the current importing mesh...
double GetImportScaleFactor(void); //gets scaling factor based on CurImportUnits and current Amf Units. Sets amf units to CurImportUnits if first mesh to be imported.
//Amf Size Utilities/members
bool ComputeBoundingBox();
void GetMinMax(double& xMinOut, double& yMinOut, double& zMinOut, double& xMaxOut, double& yMaxOut, double& zMaxOut);
void GetSize(double& xOut, double& yOut, double& zOut);
double MinX, MaxX, MinY, MaxY, MinZ, MaxZ;
//Amf node Utilities
nObject* GetObject(int ObjectIndex, bool CanCreate = false);
nMesh* GetMesh(int ObjectIndex, int MeshIndex, bool CanCreate = false);
nVolume* GetVolume(int ObjectIndex, int MeshIndex, int VolumeIndex, bool CanCreate = false);
nConstellation* GetConstellation(int ConstellationIndex, bool CanCreate = false);
nMaterial* GetMaterial(int MaterialIndex, bool CanCreate = false);
nInstance* GetInstance(int ConstellationIndex, int InstanceIndex, bool CanCreate = false);
nComposite* GetComposite(int MaterialIndex, int CompositeIndex, bool CanCreate = false);
// int MaterialIDToIndex(int MaterialID);
int MaterialIndexToID(int MaterialIndex) {nMaterial* pMat = GetMaterial(MaterialIndex); if(pMat) return pMat->aID; else return -1;}
//Real Time status info utilities
bool CancelIO; //!< Cancels any input/output operations
int CurTick; //!< Current progress (with respect to MaxTick) of the current input/output operation.
int MaxTick; //!< Total possible progress of the current input/output operation.
std::string CurrentMessage; //!< Status of the current input/output operation.
//Rendering utilities
bool NeedRender; //Flag set to true whenever anything pertaining to the visuals of the amf is changed...
bool Render(); //generates RenderedObjs, calls RenderMeshes() if flag set;
int SubDivLevel; //how many times do we want to subdivide curved triangles?
ColorView CurColorView;
ViewMode CurViewMode;
bool RenderConstellation(nConstellation* pConst, std::vector<int>* pIndexStack, Vec3D CurOff, CQuat CurRot, ColorView CurColorView, ViewMode CurViewMode, int SubDivLevel); //for recursion
bool RenderObject(nObject* pObj, std::vector<int>* pIndexStack, Vec3D CurOff, CQuat CurRot, ColorView CurColorView, ViewMode CurViewMode, int SubDivLevel); //actually adds an object to RenderedObjs
nObjectExt* GetRenderObject(int RenderIndex);
CMeshSlice* GetRenderMesh(int RenderIndex);
//Slicing Utilitoes
bool GenerateLayer(double PixelSizeX, double PixelSizeY, double SliceHeightZ, double SurfaceDepthIn = 0.0, std::string* pMessage = NULL);
void ImposeBitmap(CSimpleImage* pBase, CSimpleImage* pImposed, int BaseXOrigin, int BaseYOrigin, int XOrigin, int YOrigin); //X, Y origin is the location within pBase that pImposed should be added.
CSimpleImage CurSlice;
//Errors and information utilities
std::string LastError;
void ClearError() {LastError = "";}
};
#define d2r 2*3.1415926/360.0
class nObjectExt{ //class to "unwind" an nObject to from its constellations (and render/slice mesh to in absolute coordinates!)
public:
nObjectExt(nAmf* pAmfIn, nObject* ObjIn, std::vector<int>* pIndexStack, Vec3D& OffsetIn, CQuat& RotIn, ColorView& CurColorViewIn, ViewMode& CurViewModeIn, int& SubDivLevelIn) {RenderMesh(pAmfIn, ObjIn, pIndexStack, OffsetIn, RotIn, CurColorViewIn, CurViewModeIn, SubDivLevelIn);}
nObjectExt(const nObjectExt& O) {*this = O;} //copy constructor
nObjectExt& operator=(const nObjectExt& O) {pAmf = O.pAmf; /*Offset = O.Offset; Rot = O.Rot; */Meshes = O.Meshes; MaterialIDs = O.MaterialIDs; return *this; }; //overload equals
std::vector<CMeshSlice> Meshes; //one for each VOLUME of each mesh...
std::vector<int> MaterialIDs; //store material ID for each mesh
static CColor nColor2CColor(nColor& ColorIn, Vec3D* pLoc = NULL);
// CQuat GetRot(void) {return Rot;}
// Vec3D GetOffset(void) {return Offset;}
// Vec3D OriginalLoc(Vec3D& vIn){return (vIn-Offset).Rot(Rot.Inverse());} //returns the location of vIn in the original coordinate system of the object
// static void GetColorCallback(double xIn, double yIn, double zIn, double* rOut, double* gOut, double* bOut, double* aOut, int aObjectID); //function to get color based on location
// static std::vector<nObjectExt*> aThis; //keep a static array of pointers to all our objects so we can have a static callback function to get colors.
protected:
nAmf* pAmf;
bool RenderMesh(nAmf* pAmfIn, nObject* pObj, std::vector<int>* pIndexStack, Vec3D& OffsetIn, CQuat& RotIn, ColorView& CurColorView, ViewMode& CurViewMode, int& SubDivLevel); //call on
bool AddTriangle(bool SubDivide, int CurSubDivLevel); //TODO
// Vec3D Offset;
// CQuat Rot;
};
#endif //AMFFILE_H
|