1 /* This ICEd due to an incomplete fix for PR57993. */
6 extern double sqrt (double __x
) throw ();
7 typedef long unsigned int size_t;
12 void *pov_malloc (size_t size
, const char *file
, int line
, const char *msg
);
13 typedef struct Object_Struct OBJECT
;
14 typedef struct Ray_Struct RAY
;
15 typedef struct istack_struct ISTACK
;
16 typedef struct istk_entry INTERSECTION
;
17 typedef double UV_VECT
[2];
18 typedef double VECTOR
[3];
19 typedef struct Transform_Struct TRANSFORM
;
20 typedef struct Method_Struct METHODS
;
21 typedef int (*ALL_INTERSECTIONS_METHOD
) (OBJECT
*, RAY
*, ISTACK
*);
22 typedef int (*INSIDE_METHOD
) (VECTOR
, OBJECT
*);
23 typedef void (*NORMAL_METHOD
) (VECTOR
, OBJECT
*, INTERSECTION
*);
24 typedef void (*UVCOORD_METHOD
) (UV_VECT
, OBJECT
*, INTERSECTION
*);
25 typedef void *(*COPY_METHOD
) (OBJECT
*);
26 typedef void (*TRANSLATE_METHOD
) (OBJECT
*, VECTOR
, TRANSFORM
*);
27 typedef void (*ROTATE_METHOD
) (OBJECT
*, VECTOR
, TRANSFORM
*);
28 typedef void (*SCALE_METHOD
) (OBJECT
*, VECTOR
, TRANSFORM
*);
29 typedef void (*TRANSFORM_METHOD
) (OBJECT
*, TRANSFORM
*);
30 typedef void (*INVERT_METHOD
) (OBJECT
*);
31 typedef void (*DESTROY_METHOD
) (OBJECT
*);
34 ALL_INTERSECTIONS_METHOD All_Intersections_Method
;
35 INSIDE_METHOD Inside_Method
;
36 NORMAL_METHOD Normal_Method
;
37 UVCOORD_METHOD UVCoord_Method
;
38 COPY_METHOD Copy_Method
;
39 TRANSLATE_METHOD Translate_Method
;
40 ROTATE_METHOD Rotate_Method
;
41 SCALE_METHOD Scale_Method
;
42 TRANSFORM_METHOD Transform_Method
;
43 INVERT_METHOD Invert_Method
;
44 DESTROY_METHOD Destroy_Method
;
46 typedef struct Bicubic_Patch_Struct BICUBIC_PATCH
;
47 typedef struct Bezier_Node_Struct BEZIER_NODE
;
48 struct Bezier_Node_Struct
53 struct Bicubic_Patch_Struct
56 int Patch_Type
, U_Steps
, V_Steps
;
57 VECTOR Control_Points
[4][4];
58 BEZIER_NODE
*Node_Tree
;
62 CSV
, SYS
, PPM
, TARGA
, PNG
, NONE
68 0, Number_Of_Pixels_Supersampled
, Number_Of_Samples
, Number_Of_Rays
,
69 Calls_To_DNoise
, Calls_To_Noise
, ADC_Saves
, Istack_overflows
,
70 Ray_RBezier_Tests
, Ray_RBezier_Tests_Succeeded
, Ray_Bicubic_Tests
,
71 Ray_Bicubic_Tests_Succeeded
, Ray_Blob_Tests
, Ray_Blob_Tests_Succeeded
,
72 Blob_Element_Tests
, Blob_Element_Tests_Succeeded
, Blob_Bound_Tests
,
73 Blob_Bound_Tests_Succeeded
, Ray_Box_Tests
, Ray_Box_Tests_Succeeded
,
74 Ray_Cone_Tests
, Ray_Cone_Tests_Succeeded
, Ray_CSG_Intersection_Tests
,
75 Ray_CSG_Intersection_Tests_Succeeded
, Ray_CSG_Merge_Tests
,
76 Ray_CSG_Merge_Tests_Succeeded
, Ray_CSG_Union_Tests
,
77 Ray_CSG_Union_Tests_Succeeded
, Ray_Disc_Tests
, Ray_Disc_Tests_Succeeded
,
78 Ray_Fractal_Tests
, Ray_Fractal_Tests_Succeeded
, Ray_HField_Tests
,
79 Ray_HField_Tests_Succeeded
, Ray_HField_Box_Tests
,
80 Ray_HField_Box_Tests_Succeeded
, Ray_HField_Triangle_Tests
,
81 Ray_HField_Triangle_Tests_Succeeded
, Ray_HField_Block_Tests
,
82 Ray_HField_Block_Tests_Succeeded
, Ray_HField_Cell_Tests
,
83 Ray_HField_Cell_Tests_Succeeded
, Ray_IsoSurface_Tests
,
84 Ray_IsoSurface_Tests_Succeeded
, Ray_IsoSurface_Bound_Tests
,
85 Ray_IsoSurface_Bound_Tests_Succeeded
, Ray_IsoSurface_Cache
,
86 Ray_IsoSurface_Cache_Succeeded
, Ray_Lathe_Tests
,
87 Ray_Lathe_Tests_Succeeded
, Lathe_Bound_Tests
,
88 Lathe_Bound_Tests_Succeeded
, Ray_Mesh_Tests
, Ray_Mesh_Tests_Succeeded
,
89 Ray_Plane_Tests
, Ray_Plane_Tests_Succeeded
, Ray_Polygon_Tests
,
90 Ray_Polygon_Tests_Succeeded
, Ray_Prism_Tests
, Ray_Prism_Tests_Succeeded
,
91 Prism_Bound_Tests
, Prism_Bound_Tests_Succeeded
, Ray_Parametric_Tests
,
92 Ray_Parametric_Tests_Succeeded
, Ray_Par_Bound_Tests
,
93 Ray_Par_Bound_Tests_Succeeded
, Ray_Quadric_Tests
,
94 Ray_Quadric_Tests_Succeeded
, Ray_Poly_Tests
, Ray_Poly_Tests_Succeeded
,
95 Ray_Sphere_Tests
, Ray_Sphere_Tests_Succeeded
, Ray_Sphere_Sweep_Tests
,
96 Ray_Sphere_Sweep_Tests_Succeeded
, Ray_Superellipsoid_Tests
,
97 Ray_Superellipsoid_Tests_Succeeded
, Ray_Sor_Tests
,
98 Ray_Sor_Tests_Succeeded
, Sor_Bound_Tests
, Sor_Bound_Tests_Succeeded
,
99 Ray_Torus_Tests
, Ray_Torus_Tests_Succeeded
, Torus_Bound_Tests
,
100 Torus_Bound_Tests_Succeeded
, Ray_Triangle_Tests
,
101 Ray_Triangle_Tests_Succeeded
, Ray_TTF_Tests
, Ray_TTF_Tests_Succeeded
,
102 Bounding_Region_Tests
, Bounding_Region_Tests_Succeeded
,
103 Clipping_Region_Tests
, Clipping_Region_Tests_Succeeded
,
104 Ray_IsoSurface_Find_Root
, Ray_Function_VM_Calls
,
105 Ray_Function_VM_Instruction_Est
, VBuffer_Tests
, VBuffer_Tests_Succeeded
,
106 LBuffer_Tests
, LBuffer_Tests_Succeeded
, Media_Samples
, Media_Intervals
,
107 Reflected_Rays_Traced
, Refracted_Rays_Traced
, Transmitted_Rays_Traced
,
108 Internal_Reflected_Rays_Traced
, Shadow_Cache_Hits
,
109 Shadow_Rays_Succeeded
, Shadow_Ray_Tests
, nChecked
, nEnqueued
,
110 totalQueues
, totalQueueResets
, totalQueueResizes
, Polynomials_Tested
,
111 Roots_Eliminated
, MemStat_Smallest_Alloc
, MemStat_Largest_Alloc
,
112 MemStat_Largest_Mem_Usage
, Number_Of_Photons_Shot
,
113 Number_Of_Photons_Stored
, Number_Of_Global_Photons_Stored
,
114 Number_Of_Media_Photons_Stored
, Priority_Queue_Add
,
115 Priority_Queue_Remove
, Gather_Performed_Count
, Gather_Expanded_Count
,
119 static int All_Bicubic_Patch_Intersections (OBJECT
* Object
, RAY
* Ray
,
120 ISTACK
* Depth_Stack
);
121 static int Inside_Bicubic_Patch (VECTOR IPoint
, OBJECT
* Object
);
122 static void Bicubic_Patch_Normal (VECTOR Result
, OBJECT
* Object
,
123 INTERSECTION
* Inter
);
124 static void Bicubic_Patch_UVCoord (UV_VECT Result
, OBJECT
* Object
,
125 INTERSECTION
* Inter
);
126 static BICUBIC_PATCH
*Copy_Bicubic_Patch (OBJECT
* Object
);
127 static void Translate_Bicubic_Patch (OBJECT
* Object
, VECTOR Vector
,
129 static void Rotate_Bicubic_Patch (OBJECT
* Object
, VECTOR Vector
,
131 static void Scale_Bicubic_Patch (OBJECT
* Object
, VECTOR Vector
,
133 static void Transform_Bicubic_Patch (OBJECT
* Object
, TRANSFORM
* Trans
);
134 static void Invert_Bicubic_Patch (OBJECT
* Object
);
135 static void Destroy_Bicubic_Patch (OBJECT
* Object
);
136 static METHODS Bicubic_Patch_Methods
= {
137 All_Bicubic_Patch_Intersections
, Inside_Bicubic_Patch
,
138 Bicubic_Patch_Normal
, Bicubic_Patch_UVCoord
,
139 (COPY_METHOD
) Copy_Bicubic_Patch
, Translate_Bicubic_Patch
,
140 Rotate_Bicubic_Patch
, Scale_Bicubic_Patch
, Transform_Bicubic_Patch
,
141 Invert_Bicubic_Patch
, Destroy_Bicubic_Patch
143 static void bezier_value (VECTOR (*Control_Points
)[4][4], double u0
,
144 double v0
, VECTOR P
, VECTOR N
)
148 double u
[4], uu
[4], v
[4], vv
[4];
149 double du
[4], duu
[4], dv
[4], dvv
[4];
150 for (i
= 1; i
< 4; i
++)
152 vv
[i
] = vv
[i
- 1] * (1.0 - v0
);
153 dvv
[i
] = -i
* vv
[i
- 1];
155 for (i
= 0; i
< 4; i
++)
157 for (j
= 0; j
< 4; j
++)
159 t
= c
* ut
* (dv
[j
] * vv
[3 - j
] + v
[j
] * dvv
[3 - j
]);
164 static int intersect_subpatch (BICUBIC_PATCH
* Shape
, RAY
* ray
,
165 VECTOR V1
[3], double uu
[3], double vv
[3],
166 double *Depth
, VECTOR P
, VECTOR N
, double *u
,
170 VECTOR B
[3], IB
[3], NN
[3];
171 bezier_value ((VECTOR (*)[4][4]) & Shape
->Control_Points
, uu
[1], vv
[1],
174 static int bezier_tree_walker (RAY
* Ray
, BICUBIC_PATCH
* Shape
,
175 BEZIER_NODE
* Node
, ISTACK
* Depth_Stack
)
182 if (Node
->Node_Type
== 0)
184 for (i
= 0; i
< Node
->Count
; i
++)
187 if (intersect_subpatch (Shape
, Ray
, V1
, uu
, vv
, &Depth
, P
, N
, &u
, &v
))
192 static int All_Bicubic_Patch_Intersections (OBJECT
* Object
, RAY
* Ray
,
193 ISTACK
* Depth_Stack
)
196 switch (((BICUBIC_PATCH
*) Object
)->Patch_Type
)
200 bezier_tree_walker (Ray
, (BICUBIC_PATCH
*) Object
,
201 ((BICUBIC_PATCH
*) Object
)->Node_Tree
,
205 BICUBIC_PATCH
*Create_Bicubic_Patch ()
209 (BICUBIC_PATCH
*) pov_malloc ((sizeof (BICUBIC_PATCH
)), "bezier.cpp",
210 2079, ("bicubic patch"));
211 New
->Methods
= &Bicubic_Patch_Methods
;