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