refactor. ich habe den teil aus dem exampleSphere rausgezogen der generell gebraucht wird. displaySzene() nimmt eine szene an und lässt den raytracer fr jeden Pixel laufen
This commit is contained in:
+56
@@ -0,0 +1,56 @@
|
||||
//
|
||||
// Created by ary on 29.07.2026.
|
||||
//
|
||||
|
||||
#include "interface.h"
|
||||
#include "examples.h"
|
||||
#include "structs.h"
|
||||
#include "vectorOp.h"
|
||||
#include "raytrace.h"
|
||||
#include <stdlib.h>
|
||||
|
||||
void displaySzene(sphere **objectList, int objectCount, camera cam1, int width, int height, int channels, unsigned char **image) {
|
||||
const vec3 worldUp = (vec3){0, 1, 0};
|
||||
vec3 screenX = vec3Cross(worldUp, cam1.direction);
|
||||
vec3 screenY = vec3Cross(screenX, cam1.direction);
|
||||
vec3 screenMiddlePoint = vec3Add(cam1.origin, vec3Scale(cam1.direction, cam1.screenDistance));
|
||||
vec3 screenTopLeft = vec3Add(
|
||||
vec3Add(screenMiddlePoint,
|
||||
vec3Scale(screenY, -cam1.height/2.0)),///////////////////////////////////////////////////////////////////////////////////////////////////////////////aendern minus weg
|
||||
vec3Scale(screenX, -cam1.width/2.0)
|
||||
);
|
||||
double pixelStepX = cam1.width / cam1.resolutionX;
|
||||
double pixelStepY = cam1.height / cam1.resolutionY;
|
||||
vec3 vecPixelStepX = vec3Scale(screenX, pixelStepX);
|
||||
vec3 vecPixelStepY = vec3Scale(screenY, pixelStepY);
|
||||
for (int i = 0; i < height * width; i++) {
|
||||
int step = i *channels;
|
||||
int x = i % width;
|
||||
int y = i / width;
|
||||
RGBA pixelColor;
|
||||
|
||||
vec3 *pixelOrigin = (vec3 *)malloc(sizeof(vec3));
|
||||
*pixelOrigin = vec3Add(screenTopLeft,
|
||||
vec3Add(
|
||||
vec3Scale(vecPixelStepX, x),
|
||||
vec3Scale(vecPixelStepY, y)
|
||||
)
|
||||
);
|
||||
|
||||
ray *lightRay = (ray *)malloc(sizeof(ray));;
|
||||
lightRay->origin = cam1.origin;
|
||||
|
||||
lightRay->direction = vec3Normalize(vec3Subtract(*pixelOrigin, cam1.origin));
|
||||
|
||||
pixelColor = raytraceSphere(objectList, lightRay);
|
||||
free(pixelOrigin);
|
||||
free(lightRay);
|
||||
|
||||
(*image)[step] = (int)(pixelColor.r * 255.0);
|
||||
(*image)[step+1] = (int)(pixelColor.g * 255.0);
|
||||
(*image)[step+2] = (int)(pixelColor.b * 255.0);
|
||||
if (channels == 4) {
|
||||
(*image)[step+3] = 255;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user