Files
SimpleRayTracing/header/Geometry/GeometryUtilities.h
Misaki 6800810369 Update project structure and improve performance
Added new files for BVH, AABB, and Debug functionalities.
Added new utility functions in Common.h.
Added gamma correction function in PostProcessing.h.
Changed the return type of path_trace to vec4s for alpha blending.
Changed BSDF function signatures to include sample index and bounce.
Changed the BSDF.h to replace inline functions with declarations.
Changed the Light and SkyLight evaluation functions to include throughput and sample index.
Changed the sphere creation function in GeometryUtilities.h for better quality.
Changed the scene structure to include a BVH tree for improved ray intersection.
Changed the scene initialization parameters for better performance.
Created new Debug functions for ray intersection counting.
Created new functions for triangle collection management in Triangle.c.
Improved pixel updating logic in Window.c.
Improved ray intersection performance with new BVH implementation.
Removed unused includes from Common.h.
Removed old library linking methods in CMakeLists.txt.
2025-04-21 15:56:19 +09:00

76 lines
2.9 KiB
C

#ifndef GEOMETRY_UTILITIES_H
#define GEOMETRY_UTILITIES_H
#include "Triangle.h"
inline void quad_create(vec3s center, vec3s forward, vec3s up, float size, uint8_t material_id, triangle_collection_t* collection)
{
float half_size = size / 2.0f;
vec3s right = glms_vec3_cross(forward, up);
vec3s scaled_right = glms_vec3_scale(right, half_size);
vec3s scaled_up = glms_vec3_scale(up, half_size);
vec3s temp_sub = glms_vec3_sub(center, scaled_right);
vec3s temp_add = glms_vec3_add(center, scaled_right);
vec3s top_left = glms_vec3_add(temp_sub, scaled_up);
vec3s top_right = glms_vec3_add(temp_add, scaled_up);
vec3s bottom_right = glms_vec3_sub(temp_add, scaled_up);
vec3s bottom_left = glms_vec3_sub(temp_sub, scaled_up);
triangle_create(top_left, top_right, bottom_left, material_id, collection);
triangle_create(top_right, bottom_right, bottom_left, material_id, collection);
}
inline void sphere_create(vec3s center, float radius, uint8_t material_id, triangle_collection_t* collection)
{
int segments = 16;
int rings = 16;
for (int i = 0; i < rings; i++)
{
float theta1 = (float)i / (float)rings * (float)M_PI;
float theta2 = (float)(i + 1) / (float)rings * (float)M_PI;
for (int j = 0; j < segments; j++)
{
float phi1 = (float)j / (float)segments * 2.0f * (float)M_PI;
float phi2 = (float)(j + 1) / (float)segments * 2.0f * (float)M_PI;
vec3s p1 = {
center.x + radius * sinf(theta1) * cosf(phi1),
center.y + radius * cosf(theta1),
center.z + radius * sinf(theta1) * sinf(phi1)
};
vec3s p2 = {
center.x + radius * sinf(theta2) * cosf(phi1),
center.y + radius * cosf(theta2),
center.z + radius * sinf(theta2) * sinf(phi1)
};
vec3s p3 = {
center.x + radius * sinf(theta2) * cosf(phi2),
center.y + radius * cosf(theta2),
center.z + radius * sinf(theta2) * sinf(phi2)
};
vec3s p4 = {
center.x + radius * sinf(theta1) * cosf(phi2),
center.y + radius * cosf(theta1),
center.z + radius * sinf(theta1) * sinf(phi2)
};
// vec3s n1 = glms_vec3_normalize(glms_vec3_sub(p1, center));
// vec3s n2 = glms_vec3_normalize(glms_vec3_sub(p2, center));
// vec3s n3 = glms_vec3_normalize(glms_vec3_sub(p3, center));
// vec3s n4 = glms_vec3_normalize(glms_vec3_sub(p4, center));
// triangle_create_with_normals(p3, p2, p1, n3, n2, n1, material_id, collection);
// triangle_create_with_normals(p3, p1, p4, n3, n1, n4, material_id, collection);
triangle_create(p3, p2, p1, material_id, collection);
triangle_create(p3, p1, p4, material_id, collection);
}
}
}
#endif // GEOMETRY_UTILITIES_H