mirror of
https://git.coom.tech/drummyfish/small3dlib.git
synced 2024-11-20 20:29:58 +01:00
Add vector normalization
This commit is contained in:
parent
f4a4ca06b4
commit
3d78f32ff3
2 changed files with 56 additions and 23 deletions
55
small3dlib.h
55
small3dlib.h
|
@ -276,9 +276,10 @@ typedef struct
|
|||
} S3L_Vec4;
|
||||
|
||||
static inline void S3L_initVec4(S3L_Vec4 *v);
|
||||
|
||||
static inline void S3L_vec3Add(S3L_Vec4 *result, S3L_Vec4 added);
|
||||
static inline void S3L_vec3Sub(S3L_Vec4 *result, S3L_Vec4 substracted);
|
||||
S3L_Unit S3L_vec3Length(S3L_Vec4 v);
|
||||
void S3L_normalizeVec3(S3L_Vec4 *v);
|
||||
|
||||
#define S3L_logVec4(v)\
|
||||
printf("Vec4: %d %d %d %d\n",((v).x),((v).y),((v).z),((v).w))
|
||||
|
@ -444,6 +445,9 @@ static inline S3L_Unit S3L_nonZero(S3L_Unit value);
|
|||
S3L_Unit S3L_sin(S3L_Unit x);
|
||||
static inline S3L_Unit S3L_cos(S3L_Unit x);
|
||||
|
||||
S3L_Unit S3L_vec3Length(S3L_Vec4 v);
|
||||
S3L_Unit S3L_sqrt(S3L_Unit value);
|
||||
|
||||
/** Interpolated between two values, v1 and v2, in the same ratio as t is to
|
||||
tMax. Does NOT prevent zero division. */
|
||||
static inline S3L_Unit S3L_interpolate(
|
||||
|
@ -964,6 +968,55 @@ void S3L_makeRotationMatrixZXY(
|
|||
#undef S
|
||||
}
|
||||
|
||||
S3L_Unit S3L_sqrt(S3L_Unit value)
|
||||
{
|
||||
int8_t sign = 1;
|
||||
|
||||
if (value < 0)
|
||||
{
|
||||
sign = -1;
|
||||
value *= -1;
|
||||
}
|
||||
|
||||
uint32_t result = 0;
|
||||
uint32_t a = value;
|
||||
uint32_t b = 1u << 30;
|
||||
|
||||
while (b > a)
|
||||
b >>= 2;
|
||||
|
||||
while (b != 0)
|
||||
{
|
||||
if (a >= result + b)
|
||||
{
|
||||
a -= result + b;
|
||||
result = result + 2 * b;
|
||||
}
|
||||
|
||||
b >>= 2;
|
||||
result >>= 1;
|
||||
}
|
||||
|
||||
return result * sign;
|
||||
}
|
||||
|
||||
S3L_Unit S3L_vec3Length(S3L_Vec4 v)
|
||||
{
|
||||
return S3L_sqrt(v.x * v.x + v.y * v.y + v.z * v.z);
|
||||
}
|
||||
|
||||
void S3L_normalizeVec3(S3L_Vec4 *v)
|
||||
{
|
||||
S3L_Unit l = S3L_vec3Length(*v);
|
||||
|
||||
if (l == 0)
|
||||
return;
|
||||
|
||||
v->x = (v->x * S3L_FRACTIONS_PER_UNIT) / l;
|
||||
v->y = (v->y * S3L_FRACTIONS_PER_UNIT) / l;
|
||||
v->z = (v->z * S3L_FRACTIONS_PER_UNIT) / l;
|
||||
}
|
||||
|
||||
void S3L_initTransoform3D(S3L_Transform3D *t)
|
||||
{
|
||||
S3L_initVec4(&(t->translation));
|
||||
|
|
24
testSDL.c
24
testSDL.c
|
@ -266,26 +266,7 @@ void recomputeLight()
|
|||
|
||||
for (int i = 0; i < 127; ++i)
|
||||
{
|
||||
S3L_Vec4 v;
|
||||
|
||||
int index = i * 3;
|
||||
|
||||
v.x = houseVertices[index];
|
||||
v.y = houseVertices[index + 1];
|
||||
v.z = houseVertices[index + 2];
|
||||
|
||||
S3L_vec3Xmat4(&v,m);
|
||||
|
||||
S3L_Unit d = S3L_distanceManhattan(v,scene.camera.transform.translation);
|
||||
|
||||
d = radius - d;
|
||||
|
||||
int l = 0;
|
||||
|
||||
if (d >= 0)
|
||||
l = 255 - S3L_interpolateFrom0(255,d,radius);
|
||||
|
||||
houseVertexLighting[i] = l;
|
||||
houseVertexLighting[i] = 255;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -302,8 +283,7 @@ void draw()
|
|||
if (f % 16 == 0)
|
||||
recomputeLight();
|
||||
|
||||
//scene.models[0].transform.rotation.z = f * 0.1;
|
||||
//scene.models[0].transform.rotation.x = f * 0.3;
|
||||
scene.models[0].transform.translation.x = sin(f / 16.0) * S3L_FRACTIONS_PER_UNIT;
|
||||
|
||||
S3L_drawScene(scene);
|
||||
|
||||
|
|
Loading…
Reference in a new issue