File indexing completed on 2026-04-09 07:48:54
0001 #pragma once
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050
0051
0052
0053
0054
0055
0056
0057
0058
0059
0060
0061
0062
0063
0064
0065
0066 #include "csg_intersect_leaf_head.h"
0067 #include "OpticksCSG.h"
0068 #include "squad.h"
0069
0070 #include "CSGNode.h"
0071 #include "CSGPrim.h"
0072
0073 #include "csg_robust_quadratic_roots.h"
0074 #include "csg_classify.h"
0075
0076 #if !defined(PRODUCTION) && defined(DEBUG_RECORD)
0077 #include <csignal>
0078 #endif
0079
0080 #if !defined(PRODUCTION) && defined(DEBUG_CYLINDER)
0081 #include "CSGDebug_Cylinder.hh"
0082 #endif
0083
0084 #if !defined(PRODUCTION) && defined(DEBUG_PIDXYZ)
0085 #include <stdio.h>
0086 #endif
0087
0088
0089 #include "csg_intersect_leaf_sphere.h"
0090 #include "csg_intersect_leaf_zsphere.h"
0091 #include "csg_intersect_leaf_cylinder.h"
0092 #include "csg_intersect_leaf_box3.h"
0093 #include "csg_intersect_leaf_newcone.h"
0094 #include "csg_intersect_leaf_convexpolyhedron.h"
0095 #include "csg_intersect_leaf_hyperboloid.h"
0096
0097 #include "csg_intersect_leaf_halfspace.h"
0098 #include "csg_intersect_leaf_phicut.h"
0099
0100 #if !defined(PRODUCTION) && defined(CSG_EXTRA)
0101 #include "csg_intersect_leaf_plane.h"
0102 #include "csg_intersect_leaf_slab.h"
0103 #include "csg_intersect_leaf_thetacut.h"
0104 #include "csg_intersect_leaf_oldcone.h"
0105 #include "csg_intersect_leaf_oldcylinder.h"
0106 #include "csg_intersect_leaf_infcylinder.h"
0107 #include "csg_intersect_leaf_disc.h"
0108 #endif
0109
0110
0111
0112
0113
0114
0115
0116
0117
0118
0119
0120
0121
0122 LEAF_FUNC
0123 float distance_leaf( const float3& global_position, const CSGNode* node, const float4* plan, const qat4* itra )
0124 {
0125 const unsigned typecode = node->typecode() ;
0126 const unsigned gtransformIdx = node->gtransformIdx() ;
0127 const bool complement = node->is_complement();
0128
0129 const qat4* q = gtransformIdx > 0 ? itra + gtransformIdx - 1 : nullptr ;
0130
0131 float3 local_position = q ? q->right_multiply(global_position, 1.f) : global_position ;
0132 float distance = 0.f ;
0133
0134 switch(typecode)
0135 {
0136 case CSG_SPHERE: distance = distance_leaf_sphere( local_position, node->q0 ) ; break ;
0137 case CSG_ZSPHERE: distance = distance_leaf_zsphere( local_position, node->q0, node->q1 ) ; break ;
0138 case CSG_CYLINDER: distance = distance_leaf_cylinder( local_position, node->q0, node->q1 ) ; break ;
0139 case CSG_BOX3: distance = distance_leaf_box3( local_position, node->q0 ) ; break ;
0140 case CSG_CONE: distance = 0.f ; break ;
0141 case CSG_CONVEXPOLYHEDRON: distance = distance_leaf_convexpolyhedron( local_position, node, plan ) ; break ;
0142 case CSG_HYPERBOLOID: distance = 0.f ; break ;
0143 case CSG_PHICUT: distance = distance_leaf_phicut( local_position, node->q0 ) ; break ;
0144 #if !defined(PRODUCTION) && defined(CSG_EXTRA)
0145 case CSG_PLANE: distance = distance_leaf_plane( local_position, node->q0 ) ; break ;
0146 case CSG_SLAB: distance = distance_leaf_slab( local_position, node->q0, node->q1 ) ; break ;
0147 case CSG_OLDCYLINDER: distance = distance_leaf_cylinder( local_position, node->q0, node->q1 ) ; break ;
0148 #endif
0149 }
0150
0151 const float sd = complement ? -distance : distance ;
0152 #if !defined(PRODUCTION) && defined(DEBUG)
0153 printf("//distance_leaf typecode %d name %s complement %d sd %10.4f \n", typecode, CSG::Name(typecode), complement, sd );
0154 #endif
0155 return sd ;
0156 }
0157
0158
0159
0160
0161
0162
0163
0164
0165
0166
0167
0168
0169
0170
0171
0172
0173
0174 LEAF_FUNC
0175 void intersect_leaf(bool& valid_isect, float4& isect, const CSGNode* node, const float4* plan, const qat4* itra, const float t_min , const float3& ray_origin , const float3& ray_direction, bool dumpxyz )
0176 {
0177 valid_isect = false ;
0178 isect.x = 0.f ;
0179 isect.y = 0.f ;
0180 isect.z = 0.f ;
0181 isect.w = 0.f ;
0182
0183 const unsigned typecode = node->typecode() ;
0184 const unsigned gtransformIdx = node->gtransformIdx() ;
0185 const bool complement = node->is_complement();
0186
0187 const qat4* q = gtransformIdx > 0 ? itra + gtransformIdx - 1 : nullptr ;
0188
0189 float3 origin = q ? q->right_multiply(ray_origin, 1.f) : ray_origin ;
0190 float3 direction = q ? q->right_multiply(ray_direction, 0.f) : ray_direction ;
0191
0192 #if !defined(PRODUCTION) && defined(DEBUG_RECORD)
0193 printf("//[intersect_leaf typecode %d name %s gtransformIdx %d \n", typecode, CSG::Name(typecode), gtransformIdx );
0194 #endif
0195
0196 #if !defined(PRODUCTION) && defined(DEBUG)
0197
0198
0199
0200
0201
0202
0203
0204
0205
0206
0207
0208
0209
0210
0211 #endif
0212
0213 switch(typecode)
0214 {
0215 case CSG_SPHERE: intersect_leaf_sphere( valid_isect, isect, node->q0, t_min, origin, direction ) ; break ;
0216 case CSG_ZSPHERE: intersect_leaf_zsphere( valid_isect, isect, node->q0, node->q1, t_min, origin, direction ) ; break ;
0217 case CSG_CYLINDER: intersect_leaf_cylinder( valid_isect, isect, node->q0, node->q1, t_min, origin, direction ) ; break ;
0218 case CSG_BOX3: intersect_leaf_box3( valid_isect, isect, node->q0, t_min, origin, direction ) ; break ;
0219 case CSG_CONE: intersect_leaf_newcone( valid_isect, isect, node->q0, t_min, origin, direction ) ; break ;
0220 case CSG_CONVEXPOLYHEDRON: intersect_leaf_convexpolyhedron( valid_isect, isect, node, plan, t_min, origin, direction ) ; break ;
0221 case CSG_HYPERBOLOID: intersect_leaf_hyperboloid( valid_isect, isect, node->q0, t_min, origin, direction ) ; break ;
0222 case CSG_PHICUT: intersect_leaf_phicut_simple( valid_isect, isect, node->q0, t_min, origin, direction ) ; break ;
0223 case CSG_HALFSPACE: intersect_leaf_halfspace( valid_isect, isect, node->q0, t_min, origin, direction ) ; break ;
0224 #if !defined(PRODUCTION) && defined(CSG_EXTRA)
0225 case CSG_PLANE: intersect_leaf_plane( valid_isect, isect, node->q0, t_min, origin, direction ) ; break ;
0226 case CSG_SLAB: intersect_leaf_slab( valid_isect, isect, node->q0, node->q1, t_min, origin, direction ) ; break ;
0227 case CSG_OLDCYLINDER: intersect_leaf_oldcylinder( valid_isect, isect, node->q0, node->q1, t_min, origin, direction ) ; break ;
0228 case CSG_THETACUT: intersect_leaf_thetacut( valid_isect, isect, node->q0, node->q1, t_min, origin, direction ) ; break ;
0229 case CSG_OLDCONE: intersect_leaf_oldcone( valid_isect, isect, node->q0, t_min, origin, direction ) ; break ;
0230 case CSG_INFCYLINDER: intersect_leaf_infcylinder( valid_isect, isect, node->q0, node->q1, t_min, origin, direction ) ; break ;
0231 case CSG_DISC: intersect_leaf_disc( valid_isect, isect, node->q0, node->q1, t_min, origin, direction ) ; break ;
0232 #endif
0233 }
0234
0235
0236
0237
0238 #if defined(DEBUG_PIDXYZ)
0239
0240
0241
0242
0243
0244
0245
0246
0247
0248 #endif
0249
0250
0251
0252 #if !defined(WITH_HEISENBUG)
0253
0254 if(valid_isect && q ) q->left_multiply_inplace( isect, 0.f ) ;
0255
0256
0257
0258
0259
0260
0261
0262
0263
0264 if(complement)
0265 {
0266 #if defined(DEBUG_PIDXYZ)
0267
0268 #endif
0269
0270
0271 isect.x = valid_isect ? -isect.x : -0.f ;
0272 isect.y = valid_isect ? -isect.y : isect.y ;
0273 isect.z = valid_isect ? -isect.z : isect.z ;
0274 }
0275
0276 #else
0277
0278
0279
0280
0281 if(valid_isect)
0282 {
0283 if(q) q->left_multiply_inplace( isect, 0.f );
0284
0285 if(complement)
0286 {
0287 isect.x = -isect.x ;
0288 isect.y = -isect.y ;
0289 isect.z = -isect.z ;
0290 }
0291 }
0292 else
0293 {
0294
0295 if(complement) isect.x = -0.f ;
0296
0297 }
0298 #endif
0299
0300
0301
0302
0303 #if !defined(PRODUCTION) && defined(DEBUG_RECORD)
0304 printf("//]intersect_leaf typecode %d name %s valid_isect %d isect (%10.4f %10.4f %10.4f %10.4f) \n", typecode, CSG::Name(typecode), valid_isect, isect.x, isect.y, isect.z, isect.w);
0305 #endif
0306
0307 #if defined(DEBUG_PIDXYZ)
0308
0309
0310
0311
0312
0313
0314
0315
0316
0317
0318
0319
0320
0321
0322
0323 #endif
0324 }
0325