1
0
Fork 0
mirror of https://git.coom.tech/drummyfish/small3dlib.git synced 2024-11-20 20:29:58 +01:00

Add S3L_F shorthand

This commit is contained in:
Miloslav Ciz 2022-09-21 15:53:10 +02:00
parent 5bf6c79140
commit f474f3530e
9 changed files with 229 additions and 228 deletions

View file

@ -115,7 +115,7 @@ The basic philosophy is:
also provided. also provided.
- Fixed point arithmetics is used as a principle, but there is no abstraction above it, everything is simply - Fixed point arithmetics is used as a principle, but there is no abstraction above it, everything is simply
an integer (`S3L_Unit` type). The space is considered to be a uniform dense grid of discrete points, and what would normally be an integer (`S3L_Unit` type). The space is considered to be a uniform dense grid of discrete points, and what would normally be
a 1.0 float value is an int value equal to `S3L_FRACTIONS_PER_UNIT` units. Numbers are normalized by this a 1.0 float value is an int value equal to `S3L_FRACTIONS_PER_UNIT` units (aka `S3L_F`). Numbers are normalized by this
constant, so e.g. the sin function returns a value from `-S3L_FRACTIONS_PER_UNIT` to `S3L_FRACTIONS_PER_UNIT`. You have to constant, so e.g. the sin function returns a value from `-S3L_FRACTIONS_PER_UNIT` to `S3L_FRACTIONS_PER_UNIT`. You have to
pass numbers of this format to the library functions, but of course you may chooe to use floats in other places of your program. pass numbers of this format to the library functions, but of course you may chooe to use floats in other places of your program.

View file

@ -62,7 +62,7 @@ void clearScreenBlue()
for (uint16_t y = 0; y < S3L_RESOLUTION_Y; ++y) for (uint16_t y = 0; y < S3L_RESOLUTION_Y; ++y)
{ {
S3L_Unit t = S3L_min(S3L_FRACTIONS_PER_UNIT,((y * S3L_FRACTIONS_PER_UNIT) / S3L_RESOLUTION_Y) * 4); S3L_Unit t = S3L_min(S3L_F,((y * S3L_F) / S3L_RESOLUTION_Y) * 4);
uint32_t r = S3L_interpolateByUnit(200,242,t); uint32_t r = S3L_interpolateByUnit(200,242,t);
uint32_t g = S3L_interpolateByUnit(102,255,t); uint32_t g = S3L_interpolateByUnit(102,255,t);
@ -125,8 +125,8 @@ void draw()
static inline uint8_t collision(S3L_Vec4 worldPosition) static inline uint8_t collision(S3L_Vec4 worldPosition)
{ {
worldPosition.x /= S3L_FRACTIONS_PER_UNIT; worldPosition.x /= S3L_F;
worldPosition.z /= -S3L_FRACTIONS_PER_UNIT; worldPosition.z /= -S3L_F;
uint16_t index = worldPosition.z * 8 + worldPosition.x; uint16_t index = worldPosition.z * 8 + worldPosition.x;
@ -176,8 +176,8 @@ int main(void)
S3L_vec4Init(&carDirection); S3L_vec4Init(&carDirection);
scene.camera.transform.translation.y = S3L_FRACTIONS_PER_UNIT / 2; scene.camera.transform.translation.y = S3L_F / 2;
scene.camera.transform.rotation.x = -S3L_FRACTIONS_PER_UNIT / 16; scene.camera.transform.rotation.x = -S3L_F / 16;
int16_t velocity = 0; int16_t velocity = 0;
@ -241,7 +241,7 @@ int main(void)
else else
models[1].transform.rotation.z = (models[1].transform.rotation.z * 3) / 4; models[1].transform.rotation.z = (models[1].transform.rotation.z * 3) / 4;
S3L_rotationToDirections(models[1].transform.rotation,S3L_FRACTIONS_PER_UNIT,&carDirection,0,0); S3L_rotationToDirections(models[1].transform.rotation,S3L_F,&carDirection,0,0);
S3L_Vec4 previousCarPos = models[1].transform.translation; S3L_Vec4 previousCarPos = models[1].transform.translation;
@ -254,8 +254,8 @@ int main(void)
else else
friction = 1; friction = 1;
models[1].transform.translation.x += (carDirection.x * step) / S3L_FRACTIONS_PER_UNIT; models[1].transform.translation.x += (carDirection.x * step) / S3L_F;
models[1].transform.translation.z += (carDirection.z * step) / S3L_FRACTIONS_PER_UNIT; models[1].transform.translation.z += (carDirection.z * step) / S3L_F;
uint8_t coll = collision(models[1].transform.translation); uint8_t coll = collision(models[1].transform.translation);
@ -269,14 +269,14 @@ int main(void)
else if (coll == 2) else if (coll == 2)
{ {
// teleport the car // teleport the car
models[1].transform.translation.x += 5 * S3L_FRACTIONS_PER_UNIT; models[1].transform.translation.x += 5 * S3L_F;
models[1].transform.translation.z += 2 * S3L_FRACTIONS_PER_UNIT; models[1].transform.translation.z += 2 * S3L_F;
} }
else else
{ {
// teleport the car // teleport the car
models[1].transform.translation.x -= 5 * S3L_FRACTIONS_PER_UNIT; models[1].transform.translation.x -= 5 * S3L_F;
models[1].transform.translation.z -= 2 * S3L_FRACTIONS_PER_UNIT; models[1].transform.translation.z -= 2 * S3L_F;
} }
} }
@ -286,13 +286,13 @@ int main(void)
velocity = S3L_min(0,velocity + stepFriction * friction); velocity = S3L_min(0,velocity + stepFriction * friction);
S3L_Unit cameraDistance = S3L_Unit cameraDistance =
S3L_interpolate(S3L_FRACTIONS_PER_UNIT / 2,(3 * S3L_FRACTIONS_PER_UNIT) / 4,S3L_abs(velocity),MAX_VELOCITY); S3L_interpolate(S3L_F / 2,(3 * S3L_F) / 4,S3L_abs(velocity),MAX_VELOCITY);
scene.camera.transform.translation.x = scene.camera.transform.translation.x =
scene.models[1].transform.translation.x - (carDirection.x * cameraDistance) / S3L_FRACTIONS_PER_UNIT; scene.models[1].transform.translation.x - (carDirection.x * cameraDistance) / S3L_F;
scene.camera.transform.translation.z = scene.camera.transform.translation.z =
scene.models[1].transform.translation.z - (carDirection.z * cameraDistance) / S3L_FRACTIONS_PER_UNIT; scene.models[1].transform.translation.z - (carDirection.z * cameraDistance) / S3L_F;
scene.camera.transform.rotation.y = models[1].transform.rotation.y; scene.camera.transform.rotation.y = models[1].transform.rotation.y;

View file

@ -15,7 +15,7 @@
#include "../small3dlib.h" // now include the library #include "../small3dlib.h" // now include the library
#define U S3L_FRACTIONS_PER_UNIT // this is the library unit, like e.g. 1 meter #define U S3L_F // this is the library unit, like e.g. 1 meter
S3L_Unit triangleVertices[] = { // x, y, z S3L_Unit triangleVertices[] = { // x, y, z
U, 0, 0, // vertex 1 U, 0, 0, // vertex 1
@ -50,8 +50,8 @@ int main()
S3L_sceneInit(&triangleModel,1,&scene); S3L_sceneInit(&triangleModel,1,&scene);
// shift the camera a little bit so that we can see the triangle // shift the camera a little bit so that we can see the triangle
scene.camera.transform.translation.z = -2 * S3L_FRACTIONS_PER_UNIT; scene.camera.transform.translation.z = -2 * S3L_F;
scene.camera.transform.translation.y = S3L_FRACTIONS_PER_UNIT / 2; scene.camera.transform.translation.y = S3L_F / 2;
S3L_newFrame(); // has to be called before each frame S3L_newFrame(); // has to be called before each frame
S3L_drawScene(scene); /* this starts the scene rendering, the library S3L_drawScene(scene); /* this starts the scene rendering, the library

View file

@ -16,7 +16,7 @@
#define S3L_PERSPECTIVE_CORRECTION 0 #define S3L_PERSPECTIVE_CORRECTION 0
#endif #endif
#define S3L_NEAR (S3L_FRACTIONS_PER_UNIT / 5) #define S3L_NEAR (S3L_F / 5)
#define S3L_Z_BUFFER 1 #define S3L_Z_BUFFER 1
@ -82,9 +82,9 @@ void drawPixel(S3L_PixelInfo *p)
S3L_vec3Normalize(&normal); S3L_vec3Normalize(&normal);
S3L_Unit shading = S3L_Unit shading =
(S3L_vec3Dot(normal,toLight) + S3L_FRACTIONS_PER_UNIT) / 2; (S3L_vec3Dot(normal,toLight) + S3L_F) / 2;
shading = S3L_interpolate(shading,0,p->depth,32 * S3L_FRACTIONS_PER_UNIT); shading = S3L_interpolate(shading,0,p->depth,32 * S3L_F);
int index = (p->y * S3L_RESOLUTION_X + p->x) * 3; int index = (p->y * S3L_RESOLUTION_X + p->x) * 3;
@ -105,9 +105,9 @@ int main()
S3L_sceneInit(&alligatorModel,1,&scene); S3L_sceneInit(&alligatorModel,1,&scene);
scene.camera.transform.translation.z = -8 * S3L_FRACTIONS_PER_UNIT; scene.camera.transform.translation.z = -8 * S3L_F;
scene.camera.transform.translation.x = 9 * S3L_FRACTIONS_PER_UNIT; scene.camera.transform.translation.x = 9 * S3L_F;
scene.camera.transform.translation.y = 6 * S3L_FRACTIONS_PER_UNIT; scene.camera.transform.translation.y = 6 * S3L_F;
S3L_lookAt(scene.models[0].transform.translation,&(scene.camera.transform)); S3L_lookAt(scene.models[0].transform.translation,&(scene.camera.transform));

View file

@ -239,8 +239,8 @@ void drawPixel(S3L_PixelInfo *p)
specularIntensity = 0.7; specularIntensity = 0.7;
specularPower = 10.0; specularPower = 10.0;
u = position.x / ((float) S3L_FRACTIONS_PER_UNIT * 2); u = position.x / ((float) S3L_F * 2);
v = position.z / ((float) S3L_FRACTIONS_PER_UNIT * 2); v = position.z / ((float) S3L_F * 2);
uint8_t textureNormal[3]; uint8_t textureNormal[3];
uint8_t textureNormal2[3]; uint8_t textureNormal2[3];
@ -248,7 +248,7 @@ void drawPixel(S3L_PixelInfo *p)
sampleTexture(sandNormalTexture,SANDNORMAL_TEXTURE_WIDTH,SANDNORMAL_TEXTURE_HEIGHT,u,v,textureNormal); sampleTexture(sandNormalTexture,SANDNORMAL_TEXTURE_WIDTH,SANDNORMAL_TEXTURE_HEIGHT,u,v,textureNormal);
sampleTexture(grassNormalTexture,GRASSNORMAL_TEXTURE_WIDTH,GRASSNORMAL_TEXTURE_HEIGHT,u / 2,v / 2,textureNormal2); sampleTexture(grassNormalTexture,GRASSNORMAL_TEXTURE_WIDTH,GRASSNORMAL_TEXTURE_HEIGHT,u / 2,v / 2,textureNormal2);
blend = S3L_clamp(position.y * 4 - S3L_FRACTIONS_PER_UNIT,0,S3L_FRACTIONS_PER_UNIT); blend = S3L_clamp(position.y * 4 - S3L_F,0,S3L_F);
textureNormal[0] = S3L_interpolateByUnit(textureNormal[0],textureNormal2[0],blend); textureNormal[0] = S3L_interpolateByUnit(textureNormal[0],textureNormal2[0],blend);
textureNormal[1] = S3L_interpolateByUnit(textureNormal[1],textureNormal2[1],blend); textureNormal[1] = S3L_interpolateByUnit(textureNormal[1],textureNormal2[1],blend);
@ -263,16 +263,16 @@ void drawPixel(S3L_PixelInfo *p)
specularIntensity = 0.2; specularIntensity = 0.2;
specularPower = 20.0; specularPower = 20.0;
u = S3L_interpolateBarycentric(uv0.x,uv1.x,uv2.x,p->barycentric) / ((float) S3L_FRACTIONS_PER_UNIT); u = S3L_interpolateBarycentric(uv0.x,uv1.x,uv2.x,p->barycentric) / ((float) S3L_F);
v = S3L_interpolateBarycentric(uv0.y,uv1.y,uv2.y,p->barycentric) / ((float) S3L_FRACTIONS_PER_UNIT); v = S3L_interpolateBarycentric(uv0.y,uv1.y,uv2.y,p->barycentric) / ((float) S3L_F);
} }
S3L_vec3Normalize(&normal); S3L_vec3Normalize(&normal);
S3L_reflect(toLightDirection,normal,&reflected); S3L_reflect(toLightDirection,normal,&reflected);
float diffuse = 0.5 - (S3L_vec3Dot(toLightDirection,normal) / ((float) S3L_FRACTIONS_PER_UNIT)) * 0.5; float diffuse = 0.5 - (S3L_vec3Dot(toLightDirection,normal) / ((float) S3L_F)) * 0.5;
float specular = 0.5 + (S3L_vec3Dot(reflected,toCameraDirection) / ((float) S3L_FRACTIONS_PER_UNIT)) * 0.5; float specular = 0.5 + (S3L_vec3Dot(reflected,toCameraDirection) / ((float) S3L_F)) * 0.5;
float fog = (p->depth / ((float) S3L_FRACTIONS_PER_UNIT * 20)); float fog = (p->depth / ((float) S3L_F * 20));
if (fog > 1.0) if (fog > 1.0)
fog = 1.0; fog = 1.0;
@ -285,7 +285,7 @@ void drawPixel(S3L_PixelInfo *p)
{ {
S3L_Unit waterDepth = (p->previousZ - p->depth) / 2; S3L_Unit waterDepth = (p->previousZ - p->depth) / 2;
float transparency = waterDepth / ((float) (S3L_FRACTIONS_PER_UNIT / 3)); float transparency = waterDepth / ((float) (S3L_F / 3));
transparency = transparency > 1.0 ? 1.0 : transparency; transparency = transparency > 1.0 ? 1.0 : transparency;
@ -298,7 +298,7 @@ void drawPixel(S3L_PixelInfo *p)
previousColor[1] = frameBuffer[index + 1]; previousColor[1] = frameBuffer[index + 1];
previousColor[2] = frameBuffer[index + 2]; previousColor[2] = frameBuffer[index + 2];
float fresnel = 0.5 + (S3L_vec3Dot(toCameraDirection,normal) / ((float) S3L_FRACTIONS_PER_UNIT)) * 0.5; float fresnel = 0.5 + (S3L_vec3Dot(toCameraDirection,normal) / ((float) S3L_F)) * 0.5;
color[0] = interpolate(150,0,fresnel); color[0] = interpolate(150,0,fresnel);
color[1] = interpolate(230,10,fresnel); color[1] = interpolate(230,10,fresnel);
@ -347,9 +347,9 @@ void createGeometry()
for (int y = 0; y < GRID_H; ++y) for (int y = 0; y < GRID_H; ++y)
for (int x = 0; x < GRID_W; ++x) for (int x = 0; x < GRID_W; ++x)
{ {
terrainVertices[i] = (x - GRID_W / 2) * S3L_FRACTIONS_PER_UNIT; terrainVertices[i] = (x - GRID_W / 2) * S3L_F;
terrainVertices[i + 1] = (heightMap[i / 3] - 1) * S3L_FRACTIONS_PER_UNIT / 4; terrainVertices[i + 1] = (heightMap[i / 3] - 1) * S3L_F / 4;
terrainVertices[i + 2] = (y - GRID_H / 2) * S3L_FRACTIONS_PER_UNIT; terrainVertices[i + 2] = (y - GRID_H / 2) * S3L_F;
waterVertices[i] = terrainVertices[i]; waterVertices[i] = terrainVertices[i];
waterVertices[i + 1] = 0; waterVertices[i + 1] = 0;
@ -385,7 +385,7 @@ void createGeometry()
void animateWater() void animateWater()
{ {
for (int i = 1; i < GRID_W * GRID_H * 3; i += 3) for (int i = 1; i < GRID_W * GRID_H * 3; i += 3)
waterVertices[i] = S3L_FRACTIONS_PER_UNIT / 4 + sin(frame * 0.2) * S3L_FRACTIONS_PER_UNIT / 4; waterVertices[i] = S3L_F / 4 + sin(frame * 0.2) * S3L_F / 4;
S3L_computeModelNormals(models[WATER_MODEL_INDEX],waterNormals,0); S3L_computeModelNormals(models[WATER_MODEL_INDEX],waterNormals,0);
} }
@ -426,11 +426,11 @@ int main()
models[1] = treeModel; models[1] = treeModel;
models[2] = treeModel; models[2] = treeModel;
S3L_Unit scale = S3L_FRACTIONS_PER_UNIT / 4; S3L_Unit scale = S3L_F / 4;
S3L_transform3DSet(0,1.2 * S3L_FRACTIONS_PER_UNIT,-1.5 * S3L_FRACTIONS_PER_UNIT,0,0,0,scale,scale,scale,&(models[0].transform)); S3L_transform3DSet(0,1.2 * S3L_F,-1.5 * S3L_F,0,0,0,scale,scale,scale,&(models[0].transform));
S3L_transform3DSet(0.95 * S3L_FRACTIONS_PER_UNIT,1.3 * S3L_FRACTIONS_PER_UNIT,0,0,0,0,scale,scale * 1.3,scale,&(models[1].transform)); S3L_transform3DSet(0.95 * S3L_F,1.3 * S3L_F,0,0,0,0,scale,scale * 1.3,scale,&(models[1].transform));
S3L_transform3DSet(-2 * S3L_FRACTIONS_PER_UNIT,0.8 * S3L_FRACTIONS_PER_UNIT,1.5 * S3L_FRACTIONS_PER_UNIT,0,0,0,scale,scale,scale,&(models[2].transform)); S3L_transform3DSet(-2 * S3L_F,0.8 * S3L_F,1.5 * S3L_F,0,0,0,scale,scale,scale,&(models[2].transform));
S3L_model3DInit( S3L_model3DInit(
terrainVertices, terrainVertices,
@ -458,16 +458,16 @@ int main()
S3L_transform3DInit(&transform0); S3L_transform3DInit(&transform0);
S3L_transform3DInit(&transform1); S3L_transform3DInit(&transform1);
transform0.translation.x = -2 * S3L_FRACTIONS_PER_UNIT; transform0.translation.x = -2 * S3L_F;
transform0.translation.y = 5 * S3L_FRACTIONS_PER_UNIT; transform0.translation.y = 5 * S3L_F;
transform0.translation.z = -14 * S3L_FRACTIONS_PER_UNIT; transform0.translation.z = -14 * S3L_F;
transform0.rotation.x = -S3L_FRACTIONS_PER_UNIT / 12; transform0.rotation.x = -S3L_F / 12;
transform1.rotation.y = S3L_FRACTIONS_PER_UNIT / 8; transform1.rotation.y = S3L_F / 8;
transform1.translation.x = 5 * S3L_FRACTIONS_PER_UNIT; transform1.translation.x = 5 * S3L_F;
transform1.translation.y = 6 * S3L_FRACTIONS_PER_UNIT; transform1.translation.y = 6 * S3L_F;
transform1.translation.z = 3 * S3L_FRACTIONS_PER_UNIT; transform1.translation.z = 3 * S3L_F;
transform1.rotation.x = transform0.rotation.x; transform1.rotation.x = transform0.rotation.x;
transform1.rotation.y = transform0.rotation.y; transform1.rotation.y = transform0.rotation.y;

View file

@ -22,7 +22,7 @@
#define S3L_PERSPECTIVE_CORRECTION 0 #define S3L_PERSPECTIVE_CORRECTION 0
#endif #endif
#define S3L_NEAR (S3L_FRACTIONS_PER_UNIT / 5) #define S3L_NEAR (S3L_F / 5)
#define S3L_USE_WIDER_TYPES 0 #define S3L_USE_WIDER_TYPES 0
#define S3L_FLAT 0 #define S3L_FLAT 0
@ -137,7 +137,7 @@ void drawPixel(S3L_PixelInfo *p)
#else #else
16 16
#endif #endif
) / S3L_FRACTIONS_PER_UNIT; ) / S3L_F;
r = S3L_clamp(((S3L_Unit) r) - fog,0,255); r = S3L_clamp(((S3L_Unit) r) - fog,0,255);
g = S3L_clamp(((S3L_Unit) g) - fog,0,255); g = S3L_clamp(((S3L_Unit) g) - fog,0,255);
@ -193,10 +193,10 @@ int main(void)
{ {
sdlInit(); sdlInit();
teleportPoint.x = 6 * S3L_FRACTIONS_PER_UNIT; teleportPoint.x = 6 * S3L_F;
teleportPoint.y = -3 * S3L_FRACTIONS_PER_UNIT; teleportPoint.y = -3 * S3L_F;
teleportPoint.z = 3 * S3L_FRACTIONS_PER_UNIT / 2; teleportPoint.z = 3 * S3L_F / 2;
teleportPoint.w = S3L_FRACTIONS_PER_UNIT; teleportPoint.w = S3L_F;
nextT = clock(); nextT = clock();

View file

@ -93,7 +93,7 @@ void animate(double time)
{ {
time = (1.0 + sin(time * 8)) / 2; time = (1.0 + sin(time * 8)) / 2;
S3L_Unit t = time * S3L_FRACTIONS_PER_UNIT; S3L_Unit t = time * S3L_F;
for (S3L_Index i = 0; i < CAT1_VERTEX_COUNT * 3; i += 3) for (S3L_Index i = 0; i < CAT1_VERTEX_COUNT * 3; i += 3)
{ {
@ -244,14 +244,14 @@ void drawPixel(S3L_PixelInfo *p)
{ {
int16_t l = S3L_interpolateBarycentric(l0,l1,l2,p->barycentric); int16_t l = S3L_interpolateBarycentric(l0,l1,l2,p->barycentric);
r = S3L_clamp((((int16_t) r) * l) / S3L_FRACTIONS_PER_UNIT,0,255); r = S3L_clamp((((int16_t) r) * l) / S3L_F,0,255);
g = S3L_clamp((((int16_t) g) * l) / S3L_FRACTIONS_PER_UNIT,0,255); g = S3L_clamp((((int16_t) g) * l) / S3L_F,0,255);
b = S3L_clamp((((int16_t) b) * l) / S3L_FRACTIONS_PER_UNIT,0,255); b = S3L_clamp((((int16_t) b) * l) / S3L_F,0,255);
} }
if (fog) if (fog)
{ {
int16_t f = ((p->depth - S3L_NEAR) * 255) / (S3L_FRACTIONS_PER_UNIT * 64); int16_t f = ((p->depth - S3L_NEAR) * 255) / (S3L_F * 64);
f *= 2; f *= 2;
@ -348,7 +348,7 @@ int main(void)
cat1ModelInit(); cat1ModelInit();
cat2ModelInit(); cat2ModelInit();
scene.camera.transform.translation.z = -S3L_FRACTIONS_PER_UNIT * 8; scene.camera.transform.translation.z = -S3L_F * 8;
catModel = cat1Model; catModel = cat1Model;
catModel.vertices = catVertices; catModel.vertices = catVertices;
@ -433,17 +433,17 @@ int main(void)
{ {
if (state[SDL_SCANCODE_LEFT]) if (state[SDL_SCANCODE_LEFT])
scene.camera.focalLength = scene.camera.focalLength =
S3L_min(S3L_FRACTIONS_PER_UNIT * 5,scene.camera.focalLength + fovStep); S3L_min(S3L_F * 5,scene.camera.focalLength + fovStep);
else if (state[SDL_SCANCODE_RIGHT]) else if (state[SDL_SCANCODE_RIGHT])
scene.camera.focalLength = scene.camera.focalLength =
S3L_max(S3L_FRACTIONS_PER_UNIT / 2,scene.camera.focalLength - fovStep); S3L_max(S3L_F / 2,scene.camera.focalLength - fovStep);
if (state[SDL_SCANCODE_UP]) if (state[SDL_SCANCODE_UP])
scene.camera.transform.translation.z = scene.camera.transform.translation.z =
S3L_min(S3L_FRACTIONS_PER_UNIT, scene.camera.transform.translation.z + moveStep); S3L_min(S3L_F, scene.camera.transform.translation.z + moveStep);
else if (state[SDL_SCANCODE_DOWN]) else if (state[SDL_SCANCODE_DOWN])
scene.camera.transform.translation.z = scene.camera.transform.translation.z =
S3L_max(-S3L_FRACTIONS_PER_UNIT * 16, scene.camera.transform.translation.z - moveStep); S3L_max(-S3L_F * 16, scene.camera.transform.translation.z - moveStep);
} }
if (state[SDL_SCANCODE_KP_0]) if (state[SDL_SCANCODE_KP_0])

View file

@ -18,7 +18,7 @@
// we'll use a predefined geometry of a cube from the library: // we'll use a predefined geometry of a cube from the library:
S3L_Unit cubeVertices[] = { S3L_CUBE_VERTICES(S3L_FRACTIONS_PER_UNIT) }; S3L_Unit cubeVertices[] = { S3L_CUBE_VERTICES(S3L_F) };
S3L_Index cubeTriangles[] = { S3L_CUBE_TRIANGLES }; S3L_Index cubeTriangles[] = { S3L_CUBE_TRIANGLES };
S3L_Model3D cubeModel; // 3D model, has a geometry, position, rotation etc. S3L_Model3D cubeModel; // 3D model, has a geometry, position, rotation etc.
@ -69,7 +69,7 @@ int main()
// shift the camera a little bit backwards so that it's not inside the cube: // shift the camera a little bit backwards so that it's not inside the cube:
scene.camera.transform.translation.z = -2 * S3L_FRACTIONS_PER_UNIT; scene.camera.transform.translation.z = -2 * S3L_F;
for (int i = 0; i < 200; ++i) // render 200 frames for (int i = 0; i < 200; ++i) // render 200 frames
{ {

View file

@ -10,7 +10,7 @@
license: CC0 1.0 (public domain) license: CC0 1.0 (public domain)
found at https://creativecommons.org/publicdomain/zero/1.0/ found at https://creativecommons.org/publicdomain/zero/1.0/
+ additional waiver of all IP + additional waiver of all IP
version: 0.902d version: 0.903d
Before including the library, define S3L_PIXEL_FUNCTION to the name of the Before including the library, define S3L_PIXEL_FUNCTION to the name of the
function you'll be using to draw single pixels (this function will be called function you'll be using to draw single pixels (this function will be called
@ -68,7 +68,7 @@
We use row vectors. We use row vectors.
In 3D space, a left-handed coord. system is used. One spatial unit is split In 3D space, a left-handed coord. system is used. One spatial unit is split
into S3L_FRACTIONS_PER_UNIT fractions (fixed point arithmetic). into S3L_FRACTIONS_PER_UNITs fractions (fixed point arithmetic).
y ^ y ^
| _ | _
@ -178,7 +178,7 @@
#define S3L_SIN_METHOD 0 #define S3L_SIN_METHOD 0
#endif #endif
/** Units of measurement in 3D space. There is S3L_FRACTIONS_PER_UNIT in one /** Units of measurement in 3D space. There is S3L_F in one
spatial unit. By dividing the unit into fractions we effectively achieve a spatial unit. By dividing the unit into fractions we effectively achieve a
fixed point arithmetic. The number of fractions is a constant that serves as fixed point arithmetic. The number of fractions is a constant that serves as
1.0 in floating point arithmetic (normalization etc.). */ 1.0 in floating point arithmetic (normalization etc.). */
@ -195,6 +195,7 @@ typedef
BE REDEFINED, so rather don't do it (otherwise things may overflow etc.). */ BE REDEFINED, so rather don't do it (otherwise things may overflow etc.). */
#define S3L_FRACTIONS_PER_UNIT 512 #define S3L_FRACTIONS_PER_UNIT 512
#define S3L_F S3L_FRACTIONS_PER_UNIT
typedef typedef
#if S3L_USE_WIDER_TYPES #if S3L_USE_WIDER_TYPES
@ -350,7 +351,7 @@ typedef
/** Distance of the near clipping plane. Points in front or EXATLY ON this /** Distance of the near clipping plane. Points in front or EXATLY ON this
plane are considered outside the frustum. This must be >= 0. */ plane are considered outside the frustum. This must be >= 0. */
#define S3L_NEAR (S3L_FRACTIONS_PER_UNIT / 4) #define S3L_NEAR (S3L_F / 4)
#endif #endif
#if S3L_NEAR <= 0 #if S3L_NEAR <= 0
@ -807,7 +808,7 @@ static inline void S3L_rotate2DPoint(S3L_Unit *x, S3L_Unit *y, S3L_Unit angle);
#define S3L_HALF_RESOLUTION_Y (S3L_RESOLUTION_Y >> 1) #define S3L_HALF_RESOLUTION_Y (S3L_RESOLUTION_Y >> 1)
#define S3L_PROJECTION_PLANE_HEIGHT\ #define S3L_PROJECTION_PLANE_HEIGHT\
((S3L_RESOLUTION_Y * S3L_FRACTIONS_PER_UNIT * 2) / S3L_RESOLUTION_X) ((S3L_RESOLUTION_Y * S3L_F * 2) / S3L_RESOLUTION_X)
#if S3L_Z_BUFFER == 1 #if S3L_Z_BUFFER == 1
#define S3L_MAX_DEPTH 2147483647 #define S3L_MAX_DEPTH 2147483647
@ -909,81 +910,81 @@ static inline int8_t S3L_stencilTest(
static const S3L_Unit S3L_sinTable[S3L_SIN_TABLE_LENGTH] = static const S3L_Unit S3L_sinTable[S3L_SIN_TABLE_LENGTH] =
{ {
/* 511 was chosen here as a highest number that doesn't overflow during /* 511 was chosen here as a highest number that doesn't overflow during
compilation for S3L_FRACTIONS_PER_UNIT == 1024 */ compilation for S3L_F == 1024 */
(0*S3L_FRACTIONS_PER_UNIT)/511, (6*S3L_FRACTIONS_PER_UNIT)/511, (0*S3L_F)/511, (6*S3L_F)/511,
(12*S3L_FRACTIONS_PER_UNIT)/511, (18*S3L_FRACTIONS_PER_UNIT)/511, (12*S3L_F)/511, (18*S3L_F)/511,
(25*S3L_FRACTIONS_PER_UNIT)/511, (31*S3L_FRACTIONS_PER_UNIT)/511, (25*S3L_F)/511, (31*S3L_F)/511,
(37*S3L_FRACTIONS_PER_UNIT)/511, (43*S3L_FRACTIONS_PER_UNIT)/511, (37*S3L_F)/511, (43*S3L_F)/511,
(50*S3L_FRACTIONS_PER_UNIT)/511, (56*S3L_FRACTIONS_PER_UNIT)/511, (50*S3L_F)/511, (56*S3L_F)/511,
(62*S3L_FRACTIONS_PER_UNIT)/511, (68*S3L_FRACTIONS_PER_UNIT)/511, (62*S3L_F)/511, (68*S3L_F)/511,
(74*S3L_FRACTIONS_PER_UNIT)/511, (81*S3L_FRACTIONS_PER_UNIT)/511, (74*S3L_F)/511, (81*S3L_F)/511,
(87*S3L_FRACTIONS_PER_UNIT)/511, (93*S3L_FRACTIONS_PER_UNIT)/511, (87*S3L_F)/511, (93*S3L_F)/511,
(99*S3L_FRACTIONS_PER_UNIT)/511, (105*S3L_FRACTIONS_PER_UNIT)/511, (99*S3L_F)/511, (105*S3L_F)/511,
(111*S3L_FRACTIONS_PER_UNIT)/511, (118*S3L_FRACTIONS_PER_UNIT)/511, (111*S3L_F)/511, (118*S3L_F)/511,
(124*S3L_FRACTIONS_PER_UNIT)/511, (130*S3L_FRACTIONS_PER_UNIT)/511, (124*S3L_F)/511, (130*S3L_F)/511,
(136*S3L_FRACTIONS_PER_UNIT)/511, (142*S3L_FRACTIONS_PER_UNIT)/511, (136*S3L_F)/511, (142*S3L_F)/511,
(148*S3L_FRACTIONS_PER_UNIT)/511, (154*S3L_FRACTIONS_PER_UNIT)/511, (148*S3L_F)/511, (154*S3L_F)/511,
(160*S3L_FRACTIONS_PER_UNIT)/511, (166*S3L_FRACTIONS_PER_UNIT)/511, (160*S3L_F)/511, (166*S3L_F)/511,
(172*S3L_FRACTIONS_PER_UNIT)/511, (178*S3L_FRACTIONS_PER_UNIT)/511, (172*S3L_F)/511, (178*S3L_F)/511,
(183*S3L_FRACTIONS_PER_UNIT)/511, (189*S3L_FRACTIONS_PER_UNIT)/511, (183*S3L_F)/511, (189*S3L_F)/511,
(195*S3L_FRACTIONS_PER_UNIT)/511, (201*S3L_FRACTIONS_PER_UNIT)/511, (195*S3L_F)/511, (201*S3L_F)/511,
(207*S3L_FRACTIONS_PER_UNIT)/511, (212*S3L_FRACTIONS_PER_UNIT)/511, (207*S3L_F)/511, (212*S3L_F)/511,
(218*S3L_FRACTIONS_PER_UNIT)/511, (224*S3L_FRACTIONS_PER_UNIT)/511, (218*S3L_F)/511, (224*S3L_F)/511,
(229*S3L_FRACTIONS_PER_UNIT)/511, (235*S3L_FRACTIONS_PER_UNIT)/511, (229*S3L_F)/511, (235*S3L_F)/511,
(240*S3L_FRACTIONS_PER_UNIT)/511, (246*S3L_FRACTIONS_PER_UNIT)/511, (240*S3L_F)/511, (246*S3L_F)/511,
(251*S3L_FRACTIONS_PER_UNIT)/511, (257*S3L_FRACTIONS_PER_UNIT)/511, (251*S3L_F)/511, (257*S3L_F)/511,
(262*S3L_FRACTIONS_PER_UNIT)/511, (268*S3L_FRACTIONS_PER_UNIT)/511, (262*S3L_F)/511, (268*S3L_F)/511,
(273*S3L_FRACTIONS_PER_UNIT)/511, (278*S3L_FRACTIONS_PER_UNIT)/511, (273*S3L_F)/511, (278*S3L_F)/511,
(283*S3L_FRACTIONS_PER_UNIT)/511, (289*S3L_FRACTIONS_PER_UNIT)/511, (283*S3L_F)/511, (289*S3L_F)/511,
(294*S3L_FRACTIONS_PER_UNIT)/511, (299*S3L_FRACTIONS_PER_UNIT)/511, (294*S3L_F)/511, (299*S3L_F)/511,
(304*S3L_FRACTIONS_PER_UNIT)/511, (309*S3L_FRACTIONS_PER_UNIT)/511, (304*S3L_F)/511, (309*S3L_F)/511,
(314*S3L_FRACTIONS_PER_UNIT)/511, (319*S3L_FRACTIONS_PER_UNIT)/511, (314*S3L_F)/511, (319*S3L_F)/511,
(324*S3L_FRACTIONS_PER_UNIT)/511, (328*S3L_FRACTIONS_PER_UNIT)/511, (324*S3L_F)/511, (328*S3L_F)/511,
(333*S3L_FRACTIONS_PER_UNIT)/511, (338*S3L_FRACTIONS_PER_UNIT)/511, (333*S3L_F)/511, (338*S3L_F)/511,
(343*S3L_FRACTIONS_PER_UNIT)/511, (347*S3L_FRACTIONS_PER_UNIT)/511, (343*S3L_F)/511, (347*S3L_F)/511,
(352*S3L_FRACTIONS_PER_UNIT)/511, (356*S3L_FRACTIONS_PER_UNIT)/511, (352*S3L_F)/511, (356*S3L_F)/511,
(361*S3L_FRACTIONS_PER_UNIT)/511, (365*S3L_FRACTIONS_PER_UNIT)/511, (361*S3L_F)/511, (365*S3L_F)/511,
(370*S3L_FRACTIONS_PER_UNIT)/511, (374*S3L_FRACTIONS_PER_UNIT)/511, (370*S3L_F)/511, (374*S3L_F)/511,
(378*S3L_FRACTIONS_PER_UNIT)/511, (382*S3L_FRACTIONS_PER_UNIT)/511, (378*S3L_F)/511, (382*S3L_F)/511,
(386*S3L_FRACTIONS_PER_UNIT)/511, (391*S3L_FRACTIONS_PER_UNIT)/511, (386*S3L_F)/511, (391*S3L_F)/511,
(395*S3L_FRACTIONS_PER_UNIT)/511, (398*S3L_FRACTIONS_PER_UNIT)/511, (395*S3L_F)/511, (398*S3L_F)/511,
(402*S3L_FRACTIONS_PER_UNIT)/511, (406*S3L_FRACTIONS_PER_UNIT)/511, (402*S3L_F)/511, (406*S3L_F)/511,
(410*S3L_FRACTIONS_PER_UNIT)/511, (414*S3L_FRACTIONS_PER_UNIT)/511, (410*S3L_F)/511, (414*S3L_F)/511,
(417*S3L_FRACTIONS_PER_UNIT)/511, (421*S3L_FRACTIONS_PER_UNIT)/511, (417*S3L_F)/511, (421*S3L_F)/511,
(424*S3L_FRACTIONS_PER_UNIT)/511, (428*S3L_FRACTIONS_PER_UNIT)/511, (424*S3L_F)/511, (428*S3L_F)/511,
(431*S3L_FRACTIONS_PER_UNIT)/511, (435*S3L_FRACTIONS_PER_UNIT)/511, (431*S3L_F)/511, (435*S3L_F)/511,
(438*S3L_FRACTIONS_PER_UNIT)/511, (441*S3L_FRACTIONS_PER_UNIT)/511, (438*S3L_F)/511, (441*S3L_F)/511,
(444*S3L_FRACTIONS_PER_UNIT)/511, (447*S3L_FRACTIONS_PER_UNIT)/511, (444*S3L_F)/511, (447*S3L_F)/511,
(450*S3L_FRACTIONS_PER_UNIT)/511, (453*S3L_FRACTIONS_PER_UNIT)/511, (450*S3L_F)/511, (453*S3L_F)/511,
(456*S3L_FRACTIONS_PER_UNIT)/511, (459*S3L_FRACTIONS_PER_UNIT)/511, (456*S3L_F)/511, (459*S3L_F)/511,
(461*S3L_FRACTIONS_PER_UNIT)/511, (464*S3L_FRACTIONS_PER_UNIT)/511, (461*S3L_F)/511, (464*S3L_F)/511,
(467*S3L_FRACTIONS_PER_UNIT)/511, (469*S3L_FRACTIONS_PER_UNIT)/511, (467*S3L_F)/511, (469*S3L_F)/511,
(472*S3L_FRACTIONS_PER_UNIT)/511, (474*S3L_FRACTIONS_PER_UNIT)/511, (472*S3L_F)/511, (474*S3L_F)/511,
(476*S3L_FRACTIONS_PER_UNIT)/511, (478*S3L_FRACTIONS_PER_UNIT)/511, (476*S3L_F)/511, (478*S3L_F)/511,
(481*S3L_FRACTIONS_PER_UNIT)/511, (483*S3L_FRACTIONS_PER_UNIT)/511, (481*S3L_F)/511, (483*S3L_F)/511,
(485*S3L_FRACTIONS_PER_UNIT)/511, (487*S3L_FRACTIONS_PER_UNIT)/511, (485*S3L_F)/511, (487*S3L_F)/511,
(488*S3L_FRACTIONS_PER_UNIT)/511, (490*S3L_FRACTIONS_PER_UNIT)/511, (488*S3L_F)/511, (490*S3L_F)/511,
(492*S3L_FRACTIONS_PER_UNIT)/511, (494*S3L_FRACTIONS_PER_UNIT)/511, (492*S3L_F)/511, (494*S3L_F)/511,
(495*S3L_FRACTIONS_PER_UNIT)/511, (497*S3L_FRACTIONS_PER_UNIT)/511, (495*S3L_F)/511, (497*S3L_F)/511,
(498*S3L_FRACTIONS_PER_UNIT)/511, (499*S3L_FRACTIONS_PER_UNIT)/511, (498*S3L_F)/511, (499*S3L_F)/511,
(501*S3L_FRACTIONS_PER_UNIT)/511, (502*S3L_FRACTIONS_PER_UNIT)/511, (501*S3L_F)/511, (502*S3L_F)/511,
(503*S3L_FRACTIONS_PER_UNIT)/511, (504*S3L_FRACTIONS_PER_UNIT)/511, (503*S3L_F)/511, (504*S3L_F)/511,
(505*S3L_FRACTIONS_PER_UNIT)/511, (506*S3L_FRACTIONS_PER_UNIT)/511, (505*S3L_F)/511, (506*S3L_F)/511,
(507*S3L_FRACTIONS_PER_UNIT)/511, (507*S3L_FRACTIONS_PER_UNIT)/511, (507*S3L_F)/511, (507*S3L_F)/511,
(508*S3L_FRACTIONS_PER_UNIT)/511, (509*S3L_FRACTIONS_PER_UNIT)/511, (508*S3L_F)/511, (509*S3L_F)/511,
(509*S3L_FRACTIONS_PER_UNIT)/511, (510*S3L_FRACTIONS_PER_UNIT)/511, (509*S3L_F)/511, (510*S3L_F)/511,
(510*S3L_FRACTIONS_PER_UNIT)/511, (510*S3L_FRACTIONS_PER_UNIT)/511, (510*S3L_F)/511, (510*S3L_F)/511,
(510*S3L_FRACTIONS_PER_UNIT)/511, (510*S3L_FRACTIONS_PER_UNIT)/511 (510*S3L_F)/511, (510*S3L_F)/511
}; };
#endif #endif
#define S3L_SIN_TABLE_UNIT_STEP\ #define S3L_SIN_TABLE_UNIT_STEP\
(S3L_FRACTIONS_PER_UNIT / (S3L_SIN_TABLE_LENGTH * 4)) (S3L_F / (S3L_SIN_TABLE_LENGTH * 4))
void S3L_vec4Init(S3L_Vec4 *v) void S3L_vec4Init(S3L_Vec4 *v)
{ {
v->x = 0; v->y = 0; v->z = 0; v->w = S3L_FRACTIONS_PER_UNIT; v->x = 0; v->y = 0; v->z = 0; v->w = S3L_F;
} }
void S3L_vec4Set(S3L_Vec4 *v, S3L_Unit x, S3L_Unit y, S3L_Unit z, S3L_Unit w) void S3L_vec4Set(S3L_Vec4 *v, S3L_Unit x, S3L_Unit y, S3L_Unit z, S3L_Unit w)
@ -1011,7 +1012,7 @@ void S3L_vec3Sub(S3L_Vec4 *result, S3L_Vec4 substracted)
void S3L_mat4Init(S3L_Mat4 m) void S3L_mat4Init(S3L_Mat4 m)
{ {
#define M(x,y) m[x][y] #define M(x,y) m[x][y]
#define S S3L_FRACTIONS_PER_UNIT #define S S3L_F
M(0,0) = S; M(1,0) = 0; M(2,0) = 0; M(3,0) = 0; M(0,0) = S; M(1,0) = 0; M(2,0) = 0; M(3,0) = 0;
M(0,1) = 0; M(1,1) = S; M(2,1) = 0; M(3,1) = 0; M(0,1) = 0; M(1,1) = S; M(2,1) = 0; M(3,1) = 0;
@ -1031,16 +1032,16 @@ void S3L_mat4Copy(S3L_Mat4 src, S3L_Mat4 dst)
S3L_Unit S3L_vec3Dot(S3L_Vec4 a, S3L_Vec4 b) S3L_Unit S3L_vec3Dot(S3L_Vec4 a, S3L_Vec4 b)
{ {
return (a.x * b.x + a.y * b.y + a.z * b.z) / S3L_FRACTIONS_PER_UNIT; return (a.x * b.x + a.y * b.y + a.z * b.z) / S3L_F;
} }
void S3L_reflect(S3L_Vec4 toLight, S3L_Vec4 normal, S3L_Vec4 *result) void S3L_reflect(S3L_Vec4 toLight, S3L_Vec4 normal, S3L_Vec4 *result)
{ {
S3L_Unit d = 2 * S3L_vec3Dot(toLight,normal); S3L_Unit d = 2 * S3L_vec3Dot(toLight,normal);
result->x = (normal.x * d) / S3L_FRACTIONS_PER_UNIT - toLight.x; result->x = (normal.x * d) / S3L_F - toLight.x;
result->y = (normal.y * d) / S3L_FRACTIONS_PER_UNIT - toLight.y; result->y = (normal.y * d) / S3L_F - toLight.y;
result->z = (normal.z * d) / S3L_FRACTIONS_PER_UNIT - toLight.z; result->z = (normal.z * d) / S3L_F - toLight.z;
} }
void S3L_vec3Cross(S3L_Vec4 a, S3L_Vec4 b, S3L_Vec4 *result) void S3L_vec3Cross(S3L_Vec4 a, S3L_Vec4 b, S3L_Vec4 *result)
@ -1167,7 +1168,7 @@ void S3L_computeModelNormals(S3L_Model3D model, S3L_Unit *dst,
} }
} }
n.x = S3L_FRACTIONS_PER_UNIT; n.x = S3L_F;
n.y = 0; n.y = 0;
n.z = 0; n.z = 0;
@ -1233,7 +1234,7 @@ void S3L_vec4Xmat4(S3L_Vec4 *v, S3L_Mat4 m)
((vBackup.x * m[col][0]) +\ ((vBackup.x * m[col][0]) +\
(vBackup.y * m[col][1]) +\ (vBackup.y * m[col][1]) +\
(vBackup.z * m[col][2]) +\ (vBackup.z * m[col][2]) +\
(vBackup.w * m[col][3])) / S3L_FRACTIONS_PER_UNIT (vBackup.w * m[col][3])) / S3L_F
v->x = dotCol(0); v->x = dotCol(0);
v->y = dotCol(1); v->y = dotCol(1);
@ -1247,9 +1248,9 @@ void S3L_vec3Xmat4(S3L_Vec4 *v, S3L_Mat4 m)
#undef dotCol #undef dotCol
#define dotCol(col)\ #define dotCol(col)\
(vBackup.x * m[col][0]) / S3L_FRACTIONS_PER_UNIT +\ (vBackup.x * m[col][0]) / S3L_F +\
(vBackup.y * m[col][1]) / S3L_FRACTIONS_PER_UNIT +\ (vBackup.y * m[col][1]) / S3L_F +\
(vBackup.z * m[col][2]) / S3L_FRACTIONS_PER_UNIT +\ (vBackup.z * m[col][2]) / S3L_F +\
m[col][3] m[col][3]
vBackup.x = v->x; vBackup.x = v->x;
@ -1260,7 +1261,7 @@ void S3L_vec3Xmat4(S3L_Vec4 *v, S3L_Mat4 m)
v->x = dotCol(0); v->x = dotCol(0);
v->y = dotCol(1); v->y = dotCol(1);
v->z = dotCol(2); v->z = dotCol(2);
v->w = S3L_FRACTIONS_PER_UNIT; v->w = S3L_F;
} }
#undef dotCol #undef dotCol
@ -1307,12 +1308,12 @@ S3L_Unit S3L_interpolate(S3L_Unit v1, S3L_Unit v2, S3L_Unit t, S3L_Unit tMax)
S3L_Unit S3L_interpolateByUnit(S3L_Unit v1, S3L_Unit v2, S3L_Unit t) S3L_Unit S3L_interpolateByUnit(S3L_Unit v1, S3L_Unit v2, S3L_Unit t)
{ {
return v1 + ((v2 - v1) * t) / S3L_FRACTIONS_PER_UNIT; return v1 + ((v2 - v1) * t) / S3L_F;
} }
S3L_Unit S3L_interpolateByUnitFrom0(S3L_Unit v2, S3L_Unit t) S3L_Unit S3L_interpolateByUnitFrom0(S3L_Unit v2, S3L_Unit t)
{ {
return (v2 * t) / S3L_FRACTIONS_PER_UNIT; return (v2 * t) / S3L_F;
} }
S3L_Unit S3L_interpolateFrom0(S3L_Unit v2, S3L_Unit t, S3L_Unit tMax) S3L_Unit S3L_interpolateFrom0(S3L_Unit v2, S3L_Unit t, S3L_Unit tMax)
@ -1343,7 +1344,7 @@ void S3L_mat4Xmat4(S3L_Mat4 m1, S3L_Mat4 m2)
for (uint16_t i = 0; i < 4; ++i) for (uint16_t i = 0; i < 4; ++i)
m1[col][row] += m1[col][row] +=
(mat1[i][row] * m2[col][i]) / S3L_FRACTIONS_PER_UNIT; (mat1[i][row] * m2[col][i]) / S3L_F;
} }
} }
@ -1381,21 +1382,21 @@ S3L_Unit S3L_sin(S3L_Unit x)
sign = -1; sign = -1;
} }
x %= S3L_FRACTIONS_PER_UNIT; x %= S3L_F;
if (x > S3L_FRACTIONS_PER_UNIT / 2) if (x > S3L_F / 2)
{ {
x -= S3L_FRACTIONS_PER_UNIT / 2; x -= S3L_F / 2;
sign *= -1; sign *= -1;
} }
S3L_Unit tmp = S3L_FRACTIONS_PER_UNIT - 2 * x; S3L_Unit tmp = S3L_F - 2 * x;
#define _PI2 ((S3L_Unit) (9.8696044 * S3L_FRACTIONS_PER_UNIT)) #define _PI2 ((S3L_Unit) (9.8696044 * S3L_F))
return sign * // Bhaskara's approximation return sign * // Bhaskara's approximation
(((32 * x * _PI2) / S3L_FRACTIONS_PER_UNIT) * tmp) / (((32 * x * _PI2) / S3L_F) * tmp) /
((_PI2 * (5 * S3L_FRACTIONS_PER_UNIT - (8 * x * tmp) / ((_PI2 * (5 * S3L_F - (8 * x * tmp) /
S3L_FRACTIONS_PER_UNIT)) / S3L_FRACTIONS_PER_UNIT); S3L_F)) / S3L_F);
#undef _PI2 #undef _PI2
#endif #endif
} }
@ -1403,7 +1404,7 @@ S3L_Unit S3L_sin(S3L_Unit x)
S3L_Unit S3L_asin(S3L_Unit x) S3L_Unit S3L_asin(S3L_Unit x)
{ {
#if S3L_SIN_METHOD == 0 #if S3L_SIN_METHOD == 0
x = S3L_clamp(x,-S3L_FRACTIONS_PER_UNIT,S3L_FRACTIONS_PER_UNIT); x = S3L_clamp(x,-S3L_F,S3L_F);
int8_t sign = 1; int8_t sign = 1;
@ -1433,8 +1434,8 @@ S3L_Unit S3L_asin(S3L_Unit x)
return sign * middle; return sign * middle;
#else #else
S3L_Unit low = -1 * S3L_FRACTIONS_PER_UNIT / 4, S3L_Unit low = -1 * S3L_F / 4,
high = S3L_FRACTIONS_PER_UNIT / 4, high = S3L_F / 4,
middle; middle;
while (low <= high) // binary search while (low <= high) // binary search
@ -1457,15 +1458,15 @@ S3L_Unit S3L_asin(S3L_Unit x)
S3L_Unit S3L_cos(S3L_Unit x) S3L_Unit S3L_cos(S3L_Unit x)
{ {
return S3L_sin(x + S3L_FRACTIONS_PER_UNIT / 4); return S3L_sin(x + S3L_F / 4);
} }
void S3L_correctBarycentricCoords(S3L_Unit barycentric[3]) void S3L_correctBarycentricCoords(S3L_Unit barycentric[3])
{ {
barycentric[0] = S3L_clamp(barycentric[0],0,S3L_FRACTIONS_PER_UNIT); barycentric[0] = S3L_clamp(barycentric[0],0,S3L_F);
barycentric[1] = S3L_clamp(barycentric[1],0,S3L_FRACTIONS_PER_UNIT); barycentric[1] = S3L_clamp(barycentric[1],0,S3L_F);
S3L_Unit d = S3L_FRACTIONS_PER_UNIT - barycentric[0] - barycentric[1]; S3L_Unit d = S3L_F - barycentric[0] - barycentric[1];
if (d < 0) if (d < 0)
{ {
@ -1483,7 +1484,7 @@ void S3L_makeTranslationMat(
S3L_Mat4 m) S3L_Mat4 m)
{ {
#define M(x,y) m[x][y] #define M(x,y) m[x][y]
#define S S3L_FRACTIONS_PER_UNIT #define S S3L_F
M(0,0) = S; M(1,0) = 0; M(2,0) = 0; M(3,0) = 0; M(0,0) = S; M(1,0) = 0; M(2,0) = 0; M(3,0) = 0;
M(0,1) = 0; M(1,1) = S; M(2,1) = 0; M(3,1) = 0; M(0,1) = 0; M(1,1) = S; M(2,1) = 0; M(3,1) = 0;
@ -1505,7 +1506,7 @@ void S3L_makeScaleMatrix(
M(0,0) = scaleX; M(1,0) = 0; M(2,0) = 0; M(3,0) = 0; M(0,0) = scaleX; M(1,0) = 0; M(2,0) = 0; M(3,0) = 0;
M(0,1) = 0; M(1,1) = scaleY; M(2,1) = 0; M(3,1) = 0; M(0,1) = 0; M(1,1) = scaleY; M(2,1) = 0; M(3,1) = 0;
M(0,2) = 0; M(1,2) = 0; M(2,2) = scaleZ; M(3,2) = 0; M(0,2) = 0; M(1,2) = 0; M(2,2) = scaleZ; M(3,2) = 0;
M(0,3) = 0; M(1,3) = 0; M(2,3) = 0; M(3,3) = S3L_FRACTIONS_PER_UNIT; M(0,3) = 0; M(1,3) = 0; M(2,3) = 0; M(3,3) = S3L_F;
#undef M #undef M
} }
@ -1529,7 +1530,7 @@ void S3L_makeRotationMatrixZXY(
S3L_Unit cz = S3L_cos(byZ); S3L_Unit cz = S3L_cos(byZ);
#define M(x,y) m[x][y] #define M(x,y) m[x][y]
#define S S3L_FRACTIONS_PER_UNIT #define S S3L_F
M(0,0) = (cy * cz) / S + (sy * sx * sz) / (S * S); M(0,0) = (cy * cz) / S + (sy * sx * sz) / (S * S);
M(1,0) = (cx * sz) / S; M(1,0) = (cx * sz) / S;
@ -1549,7 +1550,7 @@ void S3L_makeRotationMatrixZXY(
M(0,3) = 0; M(0,3) = 0;
M(1,3) = 0; M(1,3) = 0;
M(2,3) = 0; M(2,3) = 0;
M(3,3) = S3L_FRACTIONS_PER_UNIT; M(3,3) = S3L_F;
#undef M #undef M
#undef S #undef S
@ -1636,9 +1637,9 @@ void S3L_vec3Normalize(S3L_Vec4 *v)
if (l == 0) if (l == 0)
return; return;
v->x = (v->x * S3L_FRACTIONS_PER_UNIT) / l; v->x = (v->x * S3L_F) / l;
v->y = (v->y * S3L_FRACTIONS_PER_UNIT) / l; v->y = (v->y * S3L_F) / l;
v->z = (v->z * S3L_FRACTIONS_PER_UNIT) / l; v->z = (v->z * S3L_F) / l;
} }
void S3L_vec3NormalizeFast(S3L_Vec4 *v) void S3L_vec3NormalizeFast(S3L_Vec4 *v)
@ -1648,18 +1649,18 @@ void S3L_vec3NormalizeFast(S3L_Vec4 *v)
if (l == 0) if (l == 0)
return; return;
v->x = (v->x * S3L_FRACTIONS_PER_UNIT) / l; v->x = (v->x * S3L_F) / l;
v->y = (v->y * S3L_FRACTIONS_PER_UNIT) / l; v->y = (v->y * S3L_F) / l;
v->z = (v->z * S3L_FRACTIONS_PER_UNIT) / l; v->z = (v->z * S3L_F) / l;
} }
void S3L_transform3DInit(S3L_Transform3D *t) void S3L_transform3DInit(S3L_Transform3D *t)
{ {
S3L_vec4Init(&(t->translation)); S3L_vec4Init(&(t->translation));
S3L_vec4Init(&(t->rotation)); S3L_vec4Init(&(t->rotation));
t->scale.x = S3L_FRACTIONS_PER_UNIT; t->scale.x = S3L_F;
t->scale.y = S3L_FRACTIONS_PER_UNIT; t->scale.y = S3L_F;
t->scale.z = S3L_FRACTIONS_PER_UNIT; t->scale.z = S3L_F;
t->scale.w = 0; t->scale.w = 0;
} }
@ -1682,7 +1683,7 @@ void S3L_project3DPointToScreen(
S3L_Unit s = point.w; S3L_Unit s = point.w;
point.w = S3L_FRACTIONS_PER_UNIT; point.w = S3L_F;
S3L_vec3Xmat4(&point,m); S3L_vec3Xmat4(&point,m);
@ -1702,7 +1703,7 @@ void S3L_project3DPointToScreen(
(point.z <= 0) ? 0 : (point.z <= 0) ? 0 :
( (
(s * camera.focalLength * S3L_RESOLUTION_X) / (s * camera.focalLength * S3L_RESOLUTION_X) /
(point.z * S3L_FRACTIONS_PER_UNIT) (point.z * S3L_F)
); );
} }
@ -1716,19 +1717,19 @@ void S3L_lookAt(S3L_Vec4 pointTo, S3L_Transform3D *t)
S3L_Unit dx = v.x; S3L_Unit dx = v.x;
S3L_Unit l = S3L_vec2Length(v); S3L_Unit l = S3L_vec2Length(v);
dx = (v.x * S3L_FRACTIONS_PER_UNIT) / S3L_nonZero(l); // normalize dx = (v.x * S3L_F) / S3L_nonZero(l); // normalize
t->rotation.y = -1 * S3L_asin(dx); t->rotation.y = -1 * S3L_asin(dx);
if (v.y < 0) if (v.y < 0)
t->rotation.y = S3L_FRACTIONS_PER_UNIT / 2 - t->rotation.y; t->rotation.y = S3L_F / 2 - t->rotation.y;
v.x = pointTo.y - t->translation.y; v.x = pointTo.y - t->translation.y;
v.y = l; v.y = l;
l = S3L_vec2Length(v); l = S3L_vec2Length(v);
dx = (v.x * S3L_FRACTIONS_PER_UNIT) / S3L_nonZero(l); dx = (v.x * S3L_F) / S3L_nonZero(l);
t->rotation.x = S3L_asin(dx); t->rotation.x = S3L_asin(dx);
} }
@ -1760,7 +1761,7 @@ void S3L_transform3DSet(
void S3L_cameraInit(S3L_Camera *camera) void S3L_cameraInit(S3L_Camera *camera)
{ {
camera->focalLength = S3L_FRACTIONS_PER_UNIT; camera->focalLength = S3L_F;
S3L_transform3DInit(&(camera->transform)); S3L_transform3DInit(&(camera->transform));
} }
@ -1804,7 +1805,7 @@ void S3L_pixelInfoInit(S3L_PixelInfo *p)
{ {
p->x = 0; p->x = 0;
p->y = 0; p->y = 0;
p->barycentric[0] = S3L_FRACTIONS_PER_UNIT; p->barycentric[0] = S3L_F;
p->barycentric[1] = 0; p->barycentric[1] = 0;
p->barycentric[2] = 0; p->barycentric[2] = 0;
p->modelIndex = 0; p->modelIndex = 0;
@ -1888,7 +1889,7 @@ static inline S3L_Unit S3L_interpolateBarycentric(
(value0 * barycentric[0]) + (value0 * barycentric[0]) +
(value1 * barycentric[1]) + (value1 * barycentric[1]) +
(value2 * barycentric[2]) (value2 * barycentric[2])
) / S3L_FRACTIONS_PER_UNIT; ) / S3L_F;
} }
void S3L_mapProjectionPlaneToScreen( void S3L_mapProjectionPlaneToScreen(
@ -1898,11 +1899,11 @@ void S3L_mapProjectionPlaneToScreen(
{ {
*screenX = *screenX =
S3L_HALF_RESOLUTION_X + S3L_HALF_RESOLUTION_X +
(point.x * S3L_HALF_RESOLUTION_X) / S3L_FRACTIONS_PER_UNIT; (point.x * S3L_HALF_RESOLUTION_X) / S3L_F;
*screenY = *screenY =
S3L_HALF_RESOLUTION_Y - S3L_HALF_RESOLUTION_Y -
(point.y * S3L_HALF_RESOLUTION_X) / S3L_FRACTIONS_PER_UNIT; (point.y * S3L_HALF_RESOLUTION_X) / S3L_F;
} }
void S3L_zBufferClear(void) void S3L_zBufferClear(void)
@ -1952,7 +1953,7 @@ void S3L_drawTriangle(
S3L_Vec4 *tPointSS, *lPointSS, *rPointSS; /* points in Screen Space (in S3L_Vec4 *tPointSS, *lPointSS, *rPointSS; /* points in Screen Space (in
S3L_Units, normalized by S3L_Units, normalized by
S3L_FRACTIONS_PER_UNIT) */ S3L_F) */
S3L_Unit *barycentric0; // bar. coord that gets higher from L to R S3L_Unit *barycentric0; // bar. coord that gets higher from L to R
S3L_Unit *barycentric1; // bar. coord that gets higher from R to L S3L_Unit *barycentric1; // bar. coord that gets higher from R to L
@ -1997,9 +1998,9 @@ void S3L_drawTriangle(
#undef assignPoints #undef assignPoints
#if S3L_FLAT #if S3L_FLAT
*barycentric0 = S3L_FRACTIONS_PER_UNIT / 3; *barycentric0 = S3L_F / 3;
*barycentric1 = S3L_FRACTIONS_PER_UNIT / 3; *barycentric1 = S3L_F / 3;
*barycentric2 = S3L_FRACTIONS_PER_UNIT - 2 * (S3L_FRACTIONS_PER_UNIT / 3); *barycentric2 = S3L_F - 2 * (S3L_F / 3);
#endif #endif
p.triangleSize[0] = rPointSS->x - lPointSS->x; p.triangleSize[0] = rPointSS->x - lPointSS->x;
@ -2082,13 +2083,13 @@ void S3L_drawTriangle(
s##Dx = p2##PointSS->x - p1##PointSS->x;\ s##Dx = p2##PointSS->x - p1##PointSS->x;\
s##Dy = p2##PointSS->y - p1##PointSS->y;\ s##Dy = p2##PointSS->y - p1##PointSS->y;\
initDepthFLS(s,p1,p2)\ initDepthFLS(s,p1,p2)\
s##SideFLS.stepScaled = (S3L_FRACTIONS_PER_UNIT << S3L_FAST_LERP_QUALITY)\ s##SideFLS.stepScaled = (S3L_F << S3L_FAST_LERP_QUALITY)\
/ (s##Dy != 0 ? s##Dy : 1);\ / (s##Dy != 0 ? s##Dy : 1);\
s##SideFLS.valueScaled = 0;\ s##SideFLS.valueScaled = 0;\
if (!down)\ if (!down)\
{\ {\
s##SideFLS.valueScaled =\ s##SideFLS.valueScaled =\
S3L_FRACTIONS_PER_UNIT << S3L_FAST_LERP_QUALITY;\ S3L_F << S3L_FAST_LERP_QUALITY;\
s##SideFLS.stepScaled *= -1;\ s##SideFLS.stepScaled *= -1;\
}\ }\
s##Inc = s##Dx >= 0 ? 1 : -1;\ s##Inc = s##Dx >= 0 ? 1 : -1;\
@ -2118,10 +2119,10 @@ void S3L_drawTriangle(
#if S3L_PERSPECTIVE_CORRECTION == 1 #if S3L_PERSPECTIVE_CORRECTION == 1
#define Z_RECIP_NUMERATOR\ #define Z_RECIP_NUMERATOR\
(S3L_FRACTIONS_PER_UNIT * S3L_FRACTIONS_PER_UNIT * S3L_FRACTIONS_PER_UNIT) (S3L_F * S3L_F * S3L_F)
#elif S3L_PERSPECTIVE_CORRECTION == 2 #elif S3L_PERSPECTIVE_CORRECTION == 2
#define Z_RECIP_NUMERATOR\ #define Z_RECIP_NUMERATOR\
(S3L_FRACTIONS_PER_UNIT * S3L_FRACTIONS_PER_UNIT) (S3L_F * S3L_F)
#endif #endif
/* ^ This numerator is a number by which we divide values for the /* ^ This numerator is a number by which we divide values for the
reciprocals. For PC == 2 it has to be lower because linear interpolation reciprocals. For PC == 2 it has to be lower because linear interpolation
@ -2170,7 +2171,7 @@ void S3L_drawTriangle(
S3L_Unit *tmp = barycentric##b0;\ S3L_Unit *tmp = barycentric##b0;\
barycentric##b0 = barycentric##b1;\ barycentric##b0 = barycentric##b1;\
barycentric##b1 = tmp;\ barycentric##b1 = tmp;\
s0##SideFLS.valueScaled = (S3L_FRACTIONS_PER_UNIT\ s0##SideFLS.valueScaled = (S3L_F\
<< S3L_FAST_LERP_QUALITY) - s0##SideFLS.valueScaled;\ << S3L_FAST_LERP_QUALITY) - s0##SideFLS.valueScaled;\
s0##SideFLS.stepScaled *= -1;\ s0##SideFLS.stepScaled *= -1;\
manageSplitPerspective(s0,s1) manageSplitPerspective(s0,s1)
@ -2275,13 +2276,13 @@ void S3L_drawTriangle(
( (
S3L_interpolateFrom0(rOverZ,i,rowLength) S3L_interpolateFrom0(rOverZ,i,rowLength)
* depthPC.valueScaled * depthPC.valueScaled
) / (Z_RECIP_NUMERATOR / S3L_FRACTIONS_PER_UNIT); ) / (Z_RECIP_NUMERATOR / S3L_F);
b1PC.valueScaled = b1PC.valueScaled =
( (
(lOverZ - S3L_interpolateFrom0(lOverZ,i,rowLength)) (lOverZ - S3L_interpolateFrom0(lOverZ,i,rowLength))
* depthPC.valueScaled * depthPC.valueScaled
) / (Z_RECIP_NUMERATOR / S3L_FRACTIONS_PER_UNIT); ) / (Z_RECIP_NUMERATOR / S3L_F);
int8_t rowCount = S3L_PC_APPROX_LENGTH; int8_t rowCount = S3L_PC_APPROX_LENGTH;
#endif #endif
@ -2329,7 +2330,7 @@ void S3L_drawTriangle(
( (
S3L_interpolateFrom0(rOverZ,nextI,rowLength) S3L_interpolateFrom0(rOverZ,nextI,rowLength)
* nextDepthScaled * nextDepthScaled
) / (Z_RECIP_NUMERATOR / S3L_FRACTIONS_PER_UNIT); ) / (Z_RECIP_NUMERATOR / S3L_F);
b0PC.stepScaled = b0PC.stepScaled =
(nextValue - b0PC.valueScaled) / S3L_PC_APPROX_LENGTH; (nextValue - b0PC.valueScaled) / S3L_PC_APPROX_LENGTH;
@ -2338,7 +2339,7 @@ void S3L_drawTriangle(
( (
(lOverZ - S3L_interpolateFrom0(lOverZ,nextI,rowLength)) (lOverZ - S3L_interpolateFrom0(lOverZ,nextI,rowLength))
* nextDepthScaled * nextDepthScaled
) / (Z_RECIP_NUMERATOR / S3L_FRACTIONS_PER_UNIT); ) / (Z_RECIP_NUMERATOR / S3L_F);
b1PC.stepScaled = b1PC.stepScaled =
(nextValue - b1PC.valueScaled) / S3L_PC_APPROX_LENGTH; (nextValue - b1PC.valueScaled) / S3L_PC_APPROX_LENGTH;
@ -2366,7 +2367,7 @@ void S3L_drawTriangle(
( (
rOverZ rOverZ
* nextDepthScaled * nextDepthScaled
) / (Z_RECIP_NUMERATOR / S3L_FRACTIONS_PER_UNIT); ) / (Z_RECIP_NUMERATOR / S3L_F);
b0PC.stepScaled = b0PC.stepScaled =
(nextValue - b0PC.valueScaled) / maxI; (nextValue - b0PC.valueScaled) / maxI;
@ -2405,20 +2406,20 @@ void S3L_drawTriangle(
( (
S3L_interpolateFrom0(rOverZ,i,rowLength) S3L_interpolateFrom0(rOverZ,i,rowLength)
* p.depth * p.depth
) / (Z_RECIP_NUMERATOR / S3L_FRACTIONS_PER_UNIT); ) / (Z_RECIP_NUMERATOR / S3L_F);
*barycentric1 = *barycentric1 =
( (
(lOverZ - S3L_interpolateFrom0(lOverZ,i,rowLength)) (lOverZ - S3L_interpolateFrom0(lOverZ,i,rowLength))
* p.depth * p.depth
) / (Z_RECIP_NUMERATOR / S3L_FRACTIONS_PER_UNIT); ) / (Z_RECIP_NUMERATOR / S3L_F);
#elif S3L_PERSPECTIVE_CORRECTION == 2 #elif S3L_PERSPECTIVE_CORRECTION == 2
*barycentric0 = S3L_getFastLerpValue(b0PC); *barycentric0 = S3L_getFastLerpValue(b0PC);
*barycentric1 = S3L_getFastLerpValue(b1PC); *barycentric1 = S3L_getFastLerpValue(b1PC);
#endif #endif
*barycentric2 = *barycentric2 =
S3L_FRACTIONS_PER_UNIT - *barycentric0 - *barycentric1; S3L_F - *barycentric0 - *barycentric1;
#endif #endif
#if S3L_NEAR_CROSS_STRATEGY == 3 #if S3L_NEAR_CROSS_STRATEGY == 3
@ -2501,12 +2502,12 @@ void S3L_rotate2DPoint(S3L_Unit *x, S3L_Unit *y, S3L_Unit angle)
S3L_Unit xBackup = *x; S3L_Unit xBackup = *x;
*x = *x =
(angleCos * (*x)) / S3L_FRACTIONS_PER_UNIT - (angleCos * (*x)) / S3L_F -
(angleSin * (*y)) / S3L_FRACTIONS_PER_UNIT; (angleSin * (*y)) / S3L_F;
*y = *y =
(angleSin * xBackup) / S3L_FRACTIONS_PER_UNIT + (angleSin * xBackup) / S3L_F +
(angleCos * (*y)) / S3L_FRACTIONS_PER_UNIT; (angleCos * (*y)) / S3L_F;
} }
void S3L_makeWorldMatrix(S3L_Transform3D worldTransform, S3L_Mat4 m) void S3L_makeWorldMatrix(S3L_Transform3D worldTransform, S3L_Mat4 m)
@ -2652,7 +2653,7 @@ void _S3L_projectVertex(
result->x = model->vertices[vertexIndex]; result->x = model->vertices[vertexIndex];
result->y = model->vertices[vertexIndex + 1]; result->y = model->vertices[vertexIndex + 1];
result->z = model->vertices[vertexIndex + 2]; result->z = model->vertices[vertexIndex + 2];
result->w = S3L_FRACTIONS_PER_UNIT; // needed for translation result->w = S3L_F; // needed for translation
S3L_vec3Xmat4(result,projectionMatrix); S3L_vec3Xmat4(result,projectionMatrix);
@ -2719,30 +2720,30 @@ void _S3L_projectTriangle(
for (int i = 0; i < 3; ++i) for (int i = 0; i < 3; ++i)
S3L_vec4Init(&(_S3L_triangleRemapBarycentrics[i])); S3L_vec4Init(&(_S3L_triangleRemapBarycentrics[i]));
_S3L_triangleRemapBarycentrics[0].x = S3L_FRACTIONS_PER_UNIT; _S3L_triangleRemapBarycentrics[0].x = S3L_F;
_S3L_triangleRemapBarycentrics[1].y = S3L_FRACTIONS_PER_UNIT; _S3L_triangleRemapBarycentrics[1].y = S3L_F;
_S3L_triangleRemapBarycentrics[2].z = S3L_FRACTIONS_PER_UNIT; _S3L_triangleRemapBarycentrics[2].z = S3L_F;
#endif #endif
#define interpolateVertex \ #define interpolateVertex \
S3L_Unit ratio =\ S3L_Unit ratio =\
((transformed[be].z - S3L_NEAR) * S3L_FRACTIONS_PER_UNIT) /\ ((transformed[be].z - S3L_NEAR) * S3L_F) /\
(transformed[be].z - transformed[in].z);\ (transformed[be].z - transformed[in].z);\
transformed[in].x = transformed[be].x - \ transformed[in].x = transformed[be].x - \
((transformed[be].x - transformed[in].x) * ratio) /\ ((transformed[be].x - transformed[in].x) * ratio) /\
S3L_FRACTIONS_PER_UNIT;\ S3L_F;\
transformed[in].y = transformed[be].y -\ transformed[in].y = transformed[be].y -\
((transformed[be].y - transformed[in].y) * ratio) /\ ((transformed[be].y - transformed[in].y) * ratio) /\
S3L_FRACTIONS_PER_UNIT;\ S3L_F;\
transformed[in].z = S3L_NEAR;\ transformed[in].z = S3L_NEAR;\
if (beI != 0) {\ if (beI != 0) {\
beI->x = (beI->x * ratio) / S3L_FRACTIONS_PER_UNIT;\ beI->x = (beI->x * ratio) / S3L_F;\
beI->y = (beI->y * ratio) / S3L_FRACTIONS_PER_UNIT;\ beI->y = (beI->y * ratio) / S3L_F;\
beI->z = (beI->z * ratio) / S3L_FRACTIONS_PER_UNIT;\ beI->z = (beI->z * ratio) / S3L_F;\
ratio = S3L_FRACTIONS_PER_UNIT - ratio;\ ratio = S3L_F - ratio;\
beI->x += (beB->x * ratio) / S3L_FRACTIONS_PER_UNIT;\ beI->x += (beB->x * ratio) / S3L_F;\
beI->y += (beB->y * ratio) / S3L_FRACTIONS_PER_UNIT;\ beI->y += (beB->y * ratio) / S3L_F;\
beI->z += (beB->z * ratio) / S3L_FRACTIONS_PER_UNIT; } beI->z += (beB->z * ratio) / S3L_F; }
if (infront == 2) if (infront == 2)
{ {