1 /****************************************************************************
2  *                  objects.h
3  *
4  * This module contains all defines, typedefs, and prototypes for OBJECTS.CPP.
5  *
6  * from Persistence of Vision(tm) Ray Tracer version 3.6.
7  * Copyright 1991-2003 Persistence of Vision Team
8  * Copyright 2003-2004 Persistence of Vision Raytracer Pty. Ltd.
9  *---------------------------------------------------------------------------
10  * NOTICE: This source code file is provided so that users may experiment
11  * with enhancements to POV-Ray and to port the software to platforms other
12  * than those supported by the POV-Ray developers. There are strict rules
13  * regarding how you are permitted to use this file. These rules are contained
14  * in the distribution and derivative versions licenses which should have been
15  * provided with this file.
16  *
17  * These licences may be found online, linked from the end-user license
18  * agreement that is located at http://www.povray.org/povlegal.html
19  *---------------------------------------------------------------------------
20  * This program is based on the popular DKB raytracer version 2.12.
21  * DKBTrace was originally written by David K. Buck.
22  * DKBTrace Ver 2.0-2.12 were written by David K. Buck & Aaron A. Collins.
23  *---------------------------------------------------------------------------
24  *
25  *===========================================================================
26  * This file is part of MegaPOV, a modified and unofficial version of POV-Ray
27  * For more information on MegaPOV visit our website:
28  * http://megapov.inetart.net/
29  *===========================================================================
30  *
31  * $RCSfile: objects.h,v $
32  * $Revision: 1.11 $
33  * $Author: chris $
34  *
35  *****************************************************************************/
36 
37 /* NOTE: FRAME.H contains other object stuff. */
38 
39 #ifndef OBJECTS_H
40 #define OBJECTS_H
41 
42 BEGIN_POV_NAMESPACE
43 
44 /*****************************************************************************
45 * Global preprocessor defines
46 ******************************************************************************/
47 
48 /*
49  * [DB 7/94]
50  *
51  * The flag field is used to store all possible flags that are
52  * used for objects (up to 32).
53  *
54  * The flages are manipulated using the following macros:
55  *
56  *   Set_Flag    (Object, Flag) : set    specified Flag in Object
57  *   Clear_Flag  (Object, Flag) : clear  specified Flag in Object
58  *   Invert_Flag (Object, Flag) : invert specified Flag in Object
59  *   Test_Flag   (Object, Flag) : test   specified Flag in Object
60  *
61  *   Copy_Flag   (Object1, Object2, Flag) : Set the Flag in Object1 to the
62  *                                          value of the Flag in Object2.
63  *   Bool_Flag   (Object, Flag, Bool)     : if(Bool) Set flag else Clear flag
64  *
65  * Object is a pointer to the object.
66  * Flag is the number of the flag to test.
67  *
68  */
69 
70 #define NO_SHADOW_FLAG            0x0000001L /* Object doesn't cast shadows            */
71 #define CLOSED_FLAG               0x0000002L /* Object is closed                       */
72 #define INVERTED_FLAG             0x0000004L /* Object is inverted                     */
73 #define SMOOTHED_FLAG             0x0000008L /* Object is smoothed                     */
74 #define CYLINDER_FLAG             0x0000010L /* Object is a cylinder                   */
75 #define DEGENERATE_FLAG           0x0000020L /* Object is degenerate                   */
76 #define STURM_FLAG                0x0000040L /* Object should use sturmian root solver */
77 #define OPAQUE_FLAG               0x0000080L /* Object is opaque                       */
78 #define MULTITEXTURE_FLAG         0x0000100L /* Object is multi-textured               */
79 #define INFINITE_FLAG             0x0000200L /* Object is infinite                     */
80 #define HIERARCHY_FLAG            0x0000400L /* Object can have a bounding hierarchy   */
81 #define HOLLOW_FLAG               0x0000800L /* Object is hollow (atmosphere inside)   */
82 #define HOLLOW_SET_FLAG           0x0001000L /* Hollow explicitly set in scene file    */
83 #define UV_FLAG                   0x0002000L /* Object uses UV mapping                 */
84 #define DOUBLE_ILLUMINATE_FLAG    0x0004000L /* Illuminate both sides of the surface   */
85 #define NO_IMAGE_FLAG             0x0008000L /* Object doesn't catch camera rays    [ENB 9/97] */
86 #define NO_REFLECTION_FLAG        0x0010000L /* Object doesn't cast reflection rays [ENB 9/97] */
87 #define NO_GLOBAL_LIGHTS_FLAG     0x0020000L /* Object doesn't receive light from global lights */
88 #define NO_GLOBAL_LIGHTS_SET_FLAG 0x0040000L /* Object doesn't receive light from global lights explicitly set in scene file */
89 /* Photon-related flags */
90 #define PH_TARGET_FLAG            0x0080000L /* object receives photons */
91 #define PH_PASSTHRU_FLAG          0x0100000L /* this is pass through object */
92 #define PH_RFL_ON_FLAG            0x0200000L /* this object reflects photons */
93 #define PH_RFL_OFF_FLAG           0x0400000L /* this object does not reflect photons */
94 #define PH_RFR_ON_FLAG            0x0800000L /* this object refracts photons */
95 #define PH_RFR_OFF_FLAG           0x1000000L /* this object does not refract photons */
96 #define PH_IGNORE_PHOTONS_FLAG    0x2000000L /* this object ignores photons */
97 
98 #ifdef NO_RADIOSITY_PATCH /* Christoph Hormann January 2004 */
99 #define NO_RADIOSITY_FLAG         0x4000000L /* Object is not used in radiosity */
100 #endif
101 
102 // #define INVERT_NO_SHADOW_GROUP   0x2000000L // invert Lights on NO shadow
103 
104 
105 #define Set_Flag(Object, Flag)     \
106   { (Object)->Flags |=  (Flag); }
107 
108 #define Clear_Flag(Object, Flag)   \
109   { (Object)->Flags &= ~(Flag); }
110 
111 #define Invert_Flag(Object, Flag)  \
112   { (Object)->Flags ^=  (Flag); }
113 
114 #define Test_Flag(Object, Flag)    \
115   ((Object)->Flags & (Flag))
116 
117 #define Copy_Flag(Object1, Object2, Flag) \
118   { (Object1)->Flags = (((Object1)->Flags) & (~Flag)) | \
119                        (((Object2)->Flags) &  (Flag)); }
120 
121 #define Bool_Flag(Object, Flag, Bool) \
122   { if(Bool){ (Object)->Flags |=  (Flag); } else { (Object)->Flags &= ~(Flag); }}
123 
124 
125 
126 /* Object types. */
127 
128 #define BASIC_OBJECT                0
129 #define PATCH_OBJECT                1 /* Has no inside, no inverse */
130 #define TEXTURED_OBJECT             2 /* Has texture, possibly in children */
131 #define IS_COMPOUND_OBJECT          4 /* Has children field */
132 #define STURM_OK_OBJECT             8 /* STRUM legal */
133 //#define WATER_LEVEL_OK_OBJECT      16 /* WATER_LEVEL legal */
134 #define LIGHT_SOURCE_OBJECT        32 /* link me in frame.light_sources */
135 #define BOUNDING_OBJECT            64 /* This is a holder for bounded object */
136 //#define SMOOTH_OK_OBJECT          128 /* SMOOTH legal */
137 #define IS_CHILD_OBJECT           256 /* Object is inside a COMPOUND */
138 /* NK 1998 - DOUBLE_ILLUMINATE is not used anymore - use DOUBLE_ILLUMINATE_FLAG */
139 #define HIERARCHY_OK_OBJECT       512 /* NO_HIERARCHY legal */
140 #define LT_SRC_UNION_OBJECT      1024 /* Union of light_source objects only */
141 #define LIGHT_GROUP_OBJECT       2048 /* light_group union object [trf] */
142 #define LIGHT_GROUP_LIGHT_OBJECT 4096 /* light in light_group object [trf] */
143 #define CSG_DIFFERENCE_OBJECT    8192 /* csg difference object */
144 #ifdef MOTION_BLUR_PATCH
145 #define MOTION_BLUR_OBJECT		 16384
146 #define CHILDREN_FLAGS (PATCH_OBJECT+TEXTURED_OBJECT+MOTION_BLUR_OBJECT)  /* Reverse inherited flags */
147 #else
148 #define CHILDREN_FLAGS (PATCH_OBJECT+TEXTURED_OBJECT)  /* Reverse inherited flags */
149 #endif
150 
151 
152 /*****************************************************************************
153 * Global typedefs
154 ******************************************************************************/
155 
156 #ifdef NO_RADIOSITY_PATCH /* Christoph Hormann January 2004 */
157 #define TEST_RAY_FLAGS(obj) \
158   ( \
159    (!In_Radiosity_Ray && \
160     (!backtraceFlag && \
161       (!Test_Flag((obj), NO_IMAGE_FLAG) || \
162        In_Reflection_Ray == true) && \
163       (!Test_Flag((obj), NO_REFLECTION_FLAG) || \
164        In_Reflection_Ray == false) \
165     ) \
166     || \
167     ( \
168      backtraceFlag && !Test_Flag((obj), NO_SHADOW_FLAG) \
169     ) \
170    ) || \
171    ( \
172     In_Radiosity_Ray && !Test_Flag((obj), NO_RADIOSITY_FLAG) \
173    ) \
174   )
175 
176 
177 #define TEST_RAY_FLAGS_SHADOW(obj) \
178   ( \
179    (!In_Radiosity_Ray && \
180     (!backtraceFlag && \
181       (!Test_Flag((obj), NO_IMAGE_FLAG) || \
182        In_Reflection_Ray == true) && \
183       (!Test_Flag((obj), NO_REFLECTION_FLAG) || \
184        In_Reflection_Ray == false) \
185     ) \
186     || \
187     ( \
188      backtraceFlag && !Test_Flag((obj), NO_SHADOW_FLAG) \
189     ) \
190     || \
191     ( \
192      shadow_flag && !Test_Flag((obj), NO_SHADOW_FLAG) \
193     ) \
194    ) || \
195    ( \
196     In_Radiosity_Ray && !Test_Flag((obj), NO_RADIOSITY_FLAG) \
197    ) \
198   )
199 
200 #else
201 #define TEST_RAY_FLAGS(obj) \
202       (  (!backtraceFlag && (!Test_Flag((obj), NO_IMAGE_FLAG) || In_Reflection_Ray == true) && \
203           (!Test_Flag((obj), NO_REFLECTION_FLAG) || In_Reflection_Ray == false)) \
204        || (backtraceFlag && !Test_Flag((obj), NO_SHADOW_FLAG)))
205 
206 #define TEST_RAY_FLAGS_SHADOW(obj) \
207       (  (!backtraceFlag && (!Test_Flag((obj), NO_IMAGE_FLAG) || In_Reflection_Ray == true) && \
208           (!Test_Flag((obj), NO_REFLECTION_FLAG) || In_Reflection_Ray == false)) \
209        || (backtraceFlag && !Test_Flag((obj), NO_SHADOW_FLAG)) \
210        || (shadow_flag && !Test_Flag((obj), NO_SHADOW_FLAG)))
211 #endif
212 
213 
214 
215 
216 /*****************************************************************************
217 * Global variables
218 ******************************************************************************/
219 
220 extern unsigned int Number_of_istacks;
221 extern unsigned int Max_Intersections;
222 extern ISTACK *free_istack;
223 
224 
225 
226 /*****************************************************************************
227 * Global functions
228 ******************************************************************************/
229 
230 void Default_UVCoord (UV_VECT Result, OBJECT *Object, INTERSECTION *Inter);
231 
232 bool Intersection (INTERSECTION *Ray_Intersection, OBJECT *Object, RAY *Ray);
233 bool Ray_In_Bound (RAY *Ray, OBJECT *Bounding_Object);
234 bool Point_In_Clip (VECTOR IPoint, OBJECT *Clip);
235 OBJECT *Copy_Object (OBJECT *Old);
236 void Translate_Object (OBJECT *Object, VECTOR Vector, TRANSFORM *Trans);
237 void Rotate_Object (OBJECT *Object, VECTOR Vector, TRANSFORM *Trans);
238 void Scale_Object (OBJECT *Object, VECTOR Vector, TRANSFORM *Trans);
239 void Transform_Object (OBJECT *Object, TRANSFORM *Trans);
240 bool Inside_Object (VECTOR IPoint, OBJECT *Vector);
241 void Invert_Object (OBJECT *Object);
242 void Destroy_Object (OBJECT *Object);
243 ISTACK *open_istack (void);
244 void close_istack (ISTACK *istk);
245 void Destroy_IStacks (void);
246 void Destroy_Single_Object (OBJECT **ObjectPtr);
247 void Default_UVCoord (UV_VECT Result, OBJECT *Object, INTERSECTION *Inter);
248 
249 END_POV_NAMESPACE
250 
251 #endif
252