1 /* 2 Open Asset Import Library (assimp) 3 ---------------------------------------------------------------------- 4 5 Copyright (c) 2006-2017, assimp team 6 7 All rights reserved. 8 9 Redistribution and use of this software in source and binary forms, 10 with or without modification, are permitted provided that the 11 following conditions are met: 12 13 * Redistributions of source code must retain the above 14 copyright notice, this list of conditions and the 15 following disclaimer. 16 17 * Redistributions in binary form must reproduce the above 18 copyright notice, this list of conditions and the 19 following disclaimer in the documentation and/or other 20 materials provided with the distribution. 21 22 * Neither the name of the assimp team, nor the names of its 23 contributors may be used to endorse or promote products 24 derived from this software without specific prior 25 written permission of the assimp team. 26 27 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 28 "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 29 LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 30 A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 31 OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 32 SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 33 LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 34 DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 35 THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 36 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 37 OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 38 39 ---------------------------------------------------------------------- 40 */ 41 42 /** @file COBScene.h 43 * @brief Utilities for the COB importer. 44 */ 45 #ifndef INCLUDED_AI_COB_SCENE_H 46 #define INCLUDED_AI_COB_SCENE_H 47 48 #include <memory> 49 #include <deque> 50 #include <map> 51 52 #include "BaseImporter.h" 53 #include <assimp/material.h> 54 55 namespace Assimp { 56 namespace COB { 57 58 // ------------------ 59 /** Represents a single vertex index in a face */ 60 struct VertexIndex 61 { 62 // intentionally uninitialized 63 unsigned int pos_idx,uv_idx; 64 }; 65 66 // ------------------ 67 /** COB Face data structure */ 68 struct Face 69 { 70 // intentionally uninitialized 71 unsigned int material, flags; 72 std::vector<VertexIndex> indices; 73 }; 74 75 // ------------------ 76 /** COB chunk header information */ 77 struct ChunkInfo 78 { 79 enum {NO_SIZE=UINT_MAX}; 80 ChunkInfoChunkInfo81 ChunkInfo () 82 : id (0) 83 , parent_id (0) 84 , version (0) 85 , size (NO_SIZE) 86 {} 87 88 // Id of this chunk, unique within file 89 unsigned int id; 90 91 // and the corresponding parent 92 unsigned int parent_id; 93 94 // version. v1.23 becomes 123 95 unsigned int version; 96 97 // chunk size in bytes, only relevant for binary files 98 // NO_SIZE is also valid. 99 unsigned int size; 100 }; 101 102 // ------------------ 103 /** A node in the scenegraph */ 104 struct Node : public ChunkInfo 105 { 106 enum Type { 107 TYPE_MESH,TYPE_GROUP,TYPE_LIGHT,TYPE_CAMERA,TYPE_BONE 108 }; 109 ~NodeNode110 virtual ~Node() {} NodeNode111 Node(Type type) : type(type), unit_scale(1.f){} 112 113 Type type; 114 115 // used during resolving 116 typedef std::deque<const Node*> ChildList; 117 mutable ChildList temp_children; 118 119 // unique name 120 std::string name; 121 122 // local mesh transformation 123 aiMatrix4x4 transform; 124 125 // scaling for this node to get to the metric system 126 float unit_scale; 127 }; 128 129 // ------------------ 130 /** COB Mesh data structure */ 131 struct Mesh : public Node 132 { 133 using ChunkInfo::operator=; 134 enum DrawFlags { 135 SOLID = 0x1, 136 TRANS = 0x2, 137 WIRED = 0x4, 138 BBOX = 0x8, 139 HIDE = 0x10 140 }; 141 MeshMesh142 Mesh() 143 : Node(TYPE_MESH) 144 , draw_flags(SOLID) 145 {} 146 147 // vertex elements 148 std::vector<aiVector2D> texture_coords; 149 std::vector<aiVector3D> vertex_positions; 150 151 // face data 152 std::vector<Face> faces; 153 154 // misc. drawing flags 155 unsigned int draw_flags; 156 157 // used during resolving 158 typedef std::deque<Face*> FaceRefList; 159 typedef std::map< unsigned int,FaceRefList > TempMap; 160 TempMap temp_map; 161 }; 162 163 // ------------------ 164 /** COB Group data structure */ 165 struct Group : public Node 166 { 167 using ChunkInfo::operator=; GroupGroup168 Group() : Node(TYPE_GROUP) {} 169 }; 170 171 // ------------------ 172 /** COB Bone data structure */ 173 struct Bone : public Node 174 { 175 using ChunkInfo::operator=; BoneBone176 Bone() : Node(TYPE_BONE) {} 177 }; 178 179 // ------------------ 180 /** COB Light data structure */ 181 struct Light : public Node 182 { 183 enum LightType { 184 SPOT,LOCAL,INFINITE 185 }; 186 187 using ChunkInfo::operator=; LightLight188 Light() : Node(TYPE_LIGHT),angle(),inner_angle(),ltype(SPOT) {} 189 190 aiColor3D color; 191 float angle,inner_angle; 192 193 LightType ltype; 194 }; 195 196 // ------------------ 197 /** COB Camera data structure */ 198 struct Camera : public Node 199 { 200 using ChunkInfo::operator=; CameraCamera201 Camera() : Node(TYPE_CAMERA) {} 202 }; 203 204 // ------------------ 205 /** COB Texture data structure */ 206 struct Texture 207 { 208 std::string path; 209 aiUVTransform transform; 210 }; 211 212 // ------------------ 213 /** COB Material data structure */ 214 struct Material : ChunkInfo 215 { 216 using ChunkInfo::operator=; 217 enum Shader { 218 FLAT,PHONG,METAL 219 }; 220 221 enum AutoFacet { 222 FACETED,AUTOFACETED,SMOOTH 223 }; 224 MaterialMaterial225 Material() : alpha(),exp(),ior(),ka(),ks(1.f), 226 matnum(UINT_MAX), 227 shader(FLAT),autofacet(FACETED), 228 autofacet_angle() 229 {} 230 231 std::string type; 232 233 aiColor3D rgb; 234 float alpha, exp, ior,ka,ks; 235 236 unsigned int matnum; 237 Shader shader; 238 239 AutoFacet autofacet; 240 float autofacet_angle; 241 242 std::shared_ptr<Texture> tex_env,tex_bump,tex_color; 243 }; 244 245 // ------------------ 246 /** Embedded bitmap, for instance for the thumbnail image */ 247 struct Bitmap : ChunkInfo 248 { BitmapBitmap249 Bitmap() : orig_size() {} 250 struct BitmapHeader 251 { 252 }; 253 254 BitmapHeader head; 255 size_t orig_size; 256 std::vector<char> buff_zipped; 257 }; 258 259 typedef std::deque< std::shared_ptr<Node> > NodeList; 260 typedef std::vector< Material > MaterialList; 261 262 // ------------------ 263 /** Represents a master COB scene, even if we loaded just a single COB file */ 264 struct Scene 265 { 266 NodeList nodes; 267 MaterialList materials; 268 269 // becomes *0 later 270 Bitmap thumbnail; 271 }; 272 273 } // end COB 274 } // end Assimp 275 276 #endif 277