Not a member of GistPad yet?
Sign Up,
it unlocks many cool features!
- // holy shit
- bool raycast_voxels(
- cfvec3 origin,
- cfvec3 dir,
- float max_dist,
- cfvec3i hit_pos,
- cfvec3i hit_normal,
- uint64_t* opaque_mask
- ) {
- cf_vec3_normalize(dir);
- cfvec3i voxel = {
- (int)floorf(origin[0]),
- (int)floorf(origin[1]),
- (int)floorf(origin[2])
- };
- cfvec3i step = {
- sign(dir[0]),
- sign(dir[1]),
- sign(dir[2])
- };
- cfvec3 t_delta = {
- fabsf(dir[0]) < 1e-6 ? 1e30f : fabsf(1.0f / dir[0]),
- fabsf(dir[1]) < 1e-6 ? 1e30f : fabsf(1.0f / dir[1]),
- fabsf(dir[2]) < 1e-6 ? 1e30f : fabsf(1.0f / dir[2])
- };
- cfvec3 voxel_boundary;
- voxel_boundary[0] = (step[0] > 0 ? (voxel[0] + 1) : voxel[0]);
- voxel_boundary[1] = (step[1] > 0 ? (voxel[1] + 1) : voxel[1]);
- voxel_boundary[2] = (step[2] > 0 ? (voxel[2] + 1) : voxel[2]);
- cfvec3 t_max = {
- (dir[0] == 0) ? 1e30f : (voxel_boundary[0] - origin[0]) / dir[0],
- (dir[1] == 0) ? 1e30f : (voxel_boundary[1] - origin[1]) / dir[1],
- (dir[2] == 0) ? 1e30f : (voxel_boundary[2] - origin[2]) / dir[2]
- };
- float dist = 0.0f;
- for (int i = 0; i < 256; i++) {
- // bounds check (your chunk size)
- if (voxel[0] < 0 || voxel[1] < 0 || voxel[2] < 0 ||
- voxel[0] >= CS_P || voxel[1] >= CS_P || voxel[2] >= CS_P)
- return false;
- // check voxel
- int idx = cf_terrain_get_zxy_index(voxel[0], voxel[1], voxel[2]);
- if (opaque_mask[(voxel[1] * CS_P) + voxel[0]] & (1ull << voxel[2])) {
- return true;
- }
- // step
- if (t_max[0] < t_max[1]) {
- if (t_max[0] < t_max[2]) {
- voxel[0] += step[0];
- dist = t_max[0];
- t_max[0] += t_delta[0];
- } else {
- voxel[2] += step[2];
- dist = t_max[2];
- t_max[2] += t_delta[2];
- }
- } else {
- if (t_max[1] < t_max[2]) {
- voxel[1] += step[1];
- dist = t_max[1];
- t_max[1] += t_delta[1];
- } else {
- voxel[2] += step[2];
- dist = t_max[2];
- t_max[2] += t_delta[2];
- }
- }
- if (dist > max_dist)
- return false;
- }
- return false;
- }
RAW Paste Data
Copied
