1 /* -*- c -*- */
2 #ifndef INCLUDED_LIB3DS_NODE_H
3 #define INCLUDED_LIB3DS_NODE_H
4 /*
5  * The 3D Studio File Format Library
6  * Copyright (C) 1996-2007 by Jan Eric Kyprianidis <www.kyprianidis.com>
7  * All rights reserved.
8  *
9  * This program is  free  software;  you can redistribute it and/or modify it
10  * under the terms of the  GNU Lesser General Public License  as published by
11  * the  Free Software Foundation;  either version 2.1 of the License,  or (at
12  * your option) any later version.
13  *
14  * This  program  is  distributed in  the  hope that it will  be useful,  but
15  * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
16  * or  FITNESS FOR A  PARTICULAR PURPOSE.  See the  GNU Lesser General Public
17  * License for more details.
18  *
19  * You should  have received  a copy of the GNU Lesser General Public License
20  * along with  this program;  if not, write to the  Free Software Foundation,
21  * Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
22  *
23  * $Id: node.h,v 1.12 2007/06/20 17:04:09 jeh Exp $
24  */
25 
26 #ifndef INCLUDED_LIB3DS_TRACKS_H
27 #include <lib3ds/tracks.h>
28 #endif
29 
30 #ifdef __cplusplus
31 extern "C" {
32 #endif
33 
34 /**
35  * Scene graph ambient color node data
36  * \ingroup node
37  */
38 typedef struct Lib3dsAmbientData {
39     Lib3dsRgb col;
40     Lib3dsLin3Track col_track;
41 } Lib3dsAmbientData;
42 
43 /**
44  * Scene graph object instance node data
45  * \ingroup node
46  */
47 typedef struct Lib3dsObjectData {
48     Lib3dsVector pivot;
49     char instance[64];
50     Lib3dsVector bbox_min;
51     Lib3dsVector bbox_max;
52     Lib3dsVector pos;
53     Lib3dsLin3Track pos_track;
54     Lib3dsQuat rot;
55     Lib3dsQuatTrack rot_track;
56     Lib3dsVector scl;
57     Lib3dsLin3Track scl_track;
58     Lib3dsFloat morph_smooth;
59     char morph[64];
60     Lib3dsMorphTrack morph_track;
61     Lib3dsBool hide;
62     Lib3dsBoolTrack hide_track;
63 } Lib3dsObjectData;
64 
65 /**
66  * Scene graph camera node data
67  * \ingroup node
68  */
69 typedef struct Lib3dsCameraData {
70     Lib3dsVector pos;
71     Lib3dsLin3Track pos_track;
72     Lib3dsFloat fov;
73     Lib3dsLin1Track fov_track;
74     Lib3dsFloat roll;
75     Lib3dsLin1Track roll_track;
76 } Lib3dsCameraData;
77 
78 /**
79  * Scene graph camera target node data
80  * \ingroup node
81  */
82 typedef struct Lib3dsTargetData {
83     Lib3dsVector pos;
84     Lib3dsLin3Track pos_track;
85 } Lib3dsTargetData;
86 
87 /**
88  * Scene graph light node data
89  * \ingroup node
90  */
91 typedef struct Lib3dsLightData {
92     Lib3dsVector pos;
93     Lib3dsLin3Track pos_track;
94     Lib3dsRgb col;
95     Lib3dsLin3Track col_track;
96     Lib3dsFloat hotspot;
97     Lib3dsLin1Track hotspot_track;
98     Lib3dsFloat falloff;
99     Lib3dsLin1Track falloff_track;
100     Lib3dsFloat roll;
101     Lib3dsLin1Track roll_track;
102 } Lib3dsLightData;
103 
104 /**
105  * Scene graph spotlight target node data
106  * \ingroup node
107  */
108 typedef struct Lib3dsSpotData {
109     Lib3dsVector pos;
110     Lib3dsLin3Track pos_track;
111 } Lib3dsSpotData;
112 
113 /**
114  * Scene graph node data union
115  * \ingroup node
116  */
117 typedef union Lib3dsNodeData {
118     Lib3dsAmbientData ambient;
119     Lib3dsObjectData object;
120     Lib3dsCameraData camera;
121     Lib3dsTargetData target;
122     Lib3dsLightData light;
123     Lib3dsSpotData spot;
124 } Lib3dsNodeData;
125 
126 /*!
127  * \ingroup node
128  */
129 #define LIB3DS_NO_PARENT 65535
130 
131 /**
132  * Scene graph node
133  * \ingroup node
134  */
135 struct Lib3dsNode {
136     Lib3dsUserData user;
137     Lib3dsNode *next;
138     Lib3dsNode *childs;
139     Lib3dsNode *parent;
140     Lib3dsNodeTypes type;
141     Lib3dsWord node_id;
142     char name[64];
143     Lib3dsWord flags1;
144     Lib3dsWord flags2;
145     Lib3dsWord parent_id;
146     Lib3dsMatrix matrix;
147     Lib3dsNodeData data;
148 };
149 
150 /**
151  * Node flags #1
152  * \ingroup node
153  */
154 typedef enum {
155   LIB3DS_HIDDEN = 0x800
156 } Lib3dsNodeFlags1;
157 
158 /**
159  * Node flags #2
160  * \ingroup node
161  */
162 typedef enum {
163   LIB3DS_SHOW_PATH = 0x1,
164   LIB3DS_SMOOTHING = 0x2,
165   LIB3DS_MOTION_BLUR = 0x10,
166   LIB3DS_MORPH_MATERIALS = 0x40
167 } Lib3dsNodeFlags2;
168 
169 extern LIB3DSAPI Lib3dsNode* lib3ds_node_new_ambient();
170 extern LIB3DSAPI Lib3dsNode* lib3ds_node_new_object();
171 extern LIB3DSAPI Lib3dsNode* lib3ds_node_new_camera();
172 extern LIB3DSAPI Lib3dsNode* lib3ds_node_new_target();
173 extern LIB3DSAPI Lib3dsNode* lib3ds_node_new_light();
174 extern LIB3DSAPI Lib3dsNode* lib3ds_node_new_spot();
175 extern LIB3DSAPI void lib3ds_node_free(Lib3dsNode *node);
176 extern LIB3DSAPI void lib3ds_node_eval(Lib3dsNode *node, Lib3dsFloat t);
177 extern LIB3DSAPI Lib3dsNode* lib3ds_node_by_name(Lib3dsNode *node, const char* name,
178   Lib3dsNodeTypes type);
179 extern LIB3DSAPI Lib3dsNode* lib3ds_node_by_id(Lib3dsNode *node, Lib3dsWord node_id);
180 extern LIB3DSAPI void lib3ds_node_dump(Lib3dsNode *node, Lib3dsIntd level);
181 extern LIB3DSAPI Lib3dsBool lib3ds_node_read(Lib3dsNode *node, Lib3dsFile *file, Lib3dsIo *io);
182 extern LIB3DSAPI Lib3dsBool lib3ds_node_write(Lib3dsNode *node, Lib3dsFile *file, Lib3dsIo *io);
183 
184 #ifdef __cplusplus
185 }
186 #endif
187 #endif
188 
189