control central sphere from application code

This commit is contained in:
ktyl 2023-02-23 00:00:25 +00:00
parent b3c5440736
commit 0f21b16ed7
2 changed files with 24 additions and 15 deletions

View File

@ -2,14 +2,10 @@ RayHit trace(Ray ray)
{ {
RayHit hit = createRayHit(); RayHit hit = createRayHit();
Sphere s; // floor
s.cr = vec4(0.0,0.0,0.0,5.0);
s.albedo = vec3(1.0,0.0,0.0);
s.material = MAT_CHROME;
intersectSphere(ray, hit, s);
intersectPlane(ray, hit, vec3(0.0,-1.5,0.0),vec3(0.0,1.0,0.0)); intersectPlane(ray, hit, vec3(0.0,-1.5,0.0),vec3(0.0,1.0,0.0));
// spheres
for (int i = 0; i < _activeSpheres; i++) for (int i = 0; i < _activeSpheres; i++)
{ {
intersectSphere(ray, hit, _spheres[i]); intersectSphere(ray, hit, _spheres[i]);

View File

@ -13,20 +13,33 @@ void makeSpheres(struct Sphere *spheres, int count, float t)
{1.0,1.0,1.0} {1.0,1.0,1.0}
}; };
// distance from center
float d = 6.0;
float radius = 0.5;
float x;
vec3 sc = {0.0,0.0,1.0}; vec3 sc = {0.0,0.0,1.0};
for (int i = 0; i < count; i++) int sphereIdx = 0;
// a shiny sphere in the middle which bobs around
int middleSpheres = 1;
sc[0] = 2.5*sin(t*2.67);
sc[1] = 1.5+sin(t*1.09);
sc[2] = 2.5*cos(-t*2.13);
float radius = 1.7;
vec3 col = {0.0,0.0,0.0};
spheres[sphereIdx++] = makeSphere(sc,radius,col,1);
// rainbow spheres
int rainbowSpheres = count - middleSpheres;
// distance from center
float d = 6.0;
radius = 0.5;
float x;
for (int i = 0; i < rainbowSpheres; i++)
{ {
x = 2.0*CGLM_PI * (float)i/(float)count; x = 2.0*CGLM_PI * (float)i/(float)rainbowSpheres;
sc[0] = sin(x)*d; sc[0] = sin(x)*d;
sc[1] = sin(x*3.0-5.0*sin(t)); sc[1] = sin(x*3.0-5.0*sin(t));
sc[2] = cos(x)*d; sc[2] = cos(x)*d;
float ic = i/(float)count*CGLM_PI*2.0; float ic = i/(float)rainbowSpheres*CGLM_PI*2.0;
float r = sin(ic); float r = sin(ic);
float g = sin(ic+CGLM_PI/1.5); float g = sin(ic+CGLM_PI/1.5);
float b = sin(ic+2.0*CGLM_PI/1.5); float b = sin(ic+2.0*CGLM_PI/1.5);
@ -35,8 +48,8 @@ void makeSpheres(struct Sphere *spheres, int count, float t)
glm_vec3_scale(col, 0.5, col); glm_vec3_scale(col, 0.5, col);
glm_vec3_adds(col, 0.5, col); glm_vec3_adds(col, 0.5, col);
int material = i % 2 == 0; int material = 0;
spheres[i] = makeSphere(sc,radius,col,material); spheres[sphereIdx++] = makeSphere(sc,radius,col,material);
} }
} }