mirror of
https://git.coom.tech/drummyfish/small3dlib.git
synced 2024-11-21 20:39:57 +01:00
Continue offline program
This commit is contained in:
parent
13fb0204dd
commit
8d65df9163
1 changed files with 63 additions and 13 deletions
|
@ -16,6 +16,8 @@
|
||||||
|
|
||||||
uint8_t frameBuffer[S3L_RESOLUTION_X * S3L_RESOLUTION_Y * 3];
|
uint8_t frameBuffer[S3L_RESOLUTION_X * S3L_RESOLUTION_Y * 3];
|
||||||
|
|
||||||
|
int frame = 0;
|
||||||
|
|
||||||
#define GRID_W 16
|
#define GRID_W 16
|
||||||
#define GRID_H 16
|
#define GRID_H 16
|
||||||
|
|
||||||
|
@ -102,6 +104,12 @@ void drawPixel(S3L_PixelInfo *p)
|
||||||
v2.z = scene.models[p->modelIndex].vertices[index];
|
v2.z = scene.models[p->modelIndex].vertices[index];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
S3L_Vec4 position;
|
||||||
|
|
||||||
|
position.x = S3L_interpolateBarycentric(v0.x,v1.x,v2.x,p->barycentric[0],p->barycentric[1],p->barycentric[2]);
|
||||||
|
position.y = S3L_interpolateBarycentric(v0.y,v1.y,v2.y,p->barycentric[0],p->barycentric[1],p->barycentric[2]);
|
||||||
|
position.z = S3L_interpolateBarycentric(v0.z,v1.z,v2.z,p->barycentric[0],p->barycentric[1],p->barycentric[2]);
|
||||||
|
|
||||||
S3L_Vec4 normal;
|
S3L_Vec4 normal;
|
||||||
|
|
||||||
normal.x = S3L_interpolateBarycentric(n0.x, n1.x, n2.x,
|
normal.x = S3L_interpolateBarycentric(n0.x, n1.x, n2.x,
|
||||||
|
@ -113,15 +121,47 @@ void drawPixel(S3L_PixelInfo *p)
|
||||||
normal.z = S3L_interpolateBarycentric(n0.z, n1.z, n2.z,
|
normal.z = S3L_interpolateBarycentric(n0.z, n1.z, n2.z,
|
||||||
p->barycentric[0], p->barycentric[1], p->barycentric[2]);
|
p->barycentric[0], p->barycentric[1], p->barycentric[2]);
|
||||||
|
|
||||||
|
if (p->modelIndex == MODELS - 1)
|
||||||
|
{
|
||||||
|
|
||||||
|
float dist, dx, dy;
|
||||||
|
|
||||||
|
#define wave(x0,y0,f,i)\
|
||||||
|
dx = position.x - x0 + frame * 20;\
|
||||||
|
dy = position.z - y0 + frame * 20;\
|
||||||
|
dist = sqrt(dx * dx + dy * dy);\
|
||||||
|
normal.x += S3L_sin(dist * f) * i;\
|
||||||
|
normal.y += S3L_cos(dist * f) * i;
|
||||||
|
|
||||||
|
wave(S3L_FRACTIONS_PER_UNIT * 50,S3L_FRACTIONS_PER_UNIT * 60,1,0.1)
|
||||||
|
wave(S3L_FRACTIONS_PER_UNIT * 20,-S3L_FRACTIONS_PER_UNIT * 30,2,0.05)
|
||||||
|
wave(-S3L_FRACTIONS_PER_UNIT * 30,S3L_FRACTIONS_PER_UNIT * 45,4,0.05)
|
||||||
|
|
||||||
|
|
||||||
|
#undef wave
|
||||||
|
|
||||||
|
/*
|
||||||
|
float dist = sqrt(position.x * position.x + position.z * position.z);
|
||||||
|
|
||||||
|
normal.x += S3L_sin(dist) / 4;
|
||||||
|
normal.y += S3L_cos(dist) / 4;
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
normal.x += S3L_sin((position.x + position.z) / 16) / 4 + S3L_sin((position.x + position.z / 2) / 3) / 8;
|
||||||
|
normal.z += S3L_sin(position.z / 16) / 4 + S3L_sin(position.z / 3) / 8;
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
|
||||||
S3L_normalizeVec3(&normal);
|
S3L_normalizeVec3(&normal);
|
||||||
|
|
||||||
S3L_Vec4 reflected;
|
S3L_Vec4 reflected;
|
||||||
|
|
||||||
S3L_Vec4 toCameraDirection;
|
S3L_Vec4 toCameraDirection;
|
||||||
|
|
||||||
toCameraDirection.x = scene.camera.transform.translation.x - S3L_interpolateBarycentric(v0.x,v1.x,v2.x,p->barycentric[0],p->barycentric[1],p->barycentric[2]);
|
toCameraDirection.x = scene.camera.transform.translation.x - position.x;
|
||||||
toCameraDirection.y = scene.camera.transform.translation.y - S3L_interpolateBarycentric(v0.y,v1.y,v2.y,p->barycentric[0],p->barycentric[1],p->barycentric[2]);
|
toCameraDirection.y = scene.camera.transform.translation.y - position.y;
|
||||||
toCameraDirection.z = scene.camera.transform.translation.z - S3L_interpolateBarycentric(v0.z,v1.z,v2.z,p->barycentric[0],p->barycentric[1],p->barycentric[2]);
|
toCameraDirection.z = scene.camera.transform.translation.z - position.z;
|
||||||
|
|
||||||
S3L_normalizeVec3(&toCameraDirection);
|
S3L_normalizeVec3(&toCameraDirection);
|
||||||
|
|
||||||
|
@ -134,7 +174,7 @@ void drawPixel(S3L_PixelInfo *p)
|
||||||
if (fog > 1.0)
|
if (fog > 1.0)
|
||||||
fog = 1.0;
|
fog = 1.0;
|
||||||
|
|
||||||
float light = 0.3 * fog + 0.6 * diffuse + 0.5 * pow(specular,15.0);
|
float light = 0.3 * fog + 0.6 * diffuse + 0.5 * pow(specular,20.0);
|
||||||
|
|
||||||
uint8_t color[3];
|
uint8_t color[3];
|
||||||
|
|
||||||
|
@ -142,7 +182,7 @@ void drawPixel(S3L_PixelInfo *p)
|
||||||
|
|
||||||
if (p->modelIndex == MODELS - 1)
|
if (p->modelIndex == MODELS - 1)
|
||||||
{
|
{
|
||||||
S3L_Unit waterDepth = p->previousZ - p->depth;
|
S3L_Unit waterDepth = (p->previousZ - p->depth);
|
||||||
|
|
||||||
float transparency = waterDepth / ((float) (S3L_FRACTIONS_PER_UNIT / 3));
|
float transparency = waterDepth / ((float) (S3L_FRACTIONS_PER_UNIT / 3));
|
||||||
|
|
||||||
|
@ -156,9 +196,17 @@ 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];
|
||||||
|
|
||||||
color[0] = S3L_clamp(transparency2 * previousColor[0] + transparency * 100 * light,0,255);
|
color[0] = 100;
|
||||||
color[1] = S3L_clamp(transparency2 * previousColor[1] + transparency * 100 * light,0,255);
|
color[1] = 100;
|
||||||
color[2] = S3L_clamp(transparency2 * previousColor[2] + transparency * 255 * light,0,255);
|
color[2] = 200;
|
||||||
|
|
||||||
|
color[0] = S3L_clamp(transparency2 * previousColor[0] + transparency * color[0] * light,0,255);
|
||||||
|
color[1] = S3L_clamp(transparency2 * previousColor[1] + transparency * color[1] * light,0,255);
|
||||||
|
color[2] = S3L_clamp(transparency2 * previousColor[2] + transparency * color[2] * light,0,255);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -220,10 +268,10 @@ void createGeometry()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void animateWater(int t)
|
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(i) * S3L_FRACTIONS_PER_UNIT / 2;
|
waterVertices[i] = S3L_FRACTIONS_PER_UNIT / 4 + sin(frame * 0.2) * S3L_FRACTIONS_PER_UNIT / 4;
|
||||||
|
|
||||||
S3L_computeModelNormals(models[MODELS - 1],waterNormals,0);
|
S3L_computeModelNormals(models[MODELS - 1],waterNormals,0);
|
||||||
}
|
}
|
||||||
|
@ -276,13 +324,13 @@ int main()
|
||||||
|
|
||||||
S3L_initScene(models,MODELS,&scene);
|
S3L_initScene(models,MODELS,&scene);
|
||||||
|
|
||||||
animateWater(0);
|
|
||||||
|
|
||||||
char fileName[] = "test00.ppm";
|
char fileName[] = "test00.ppm";
|
||||||
|
|
||||||
for (int i = 0; i < 20; ++i)
|
for (int i = 0; i < 20; ++i)
|
||||||
{
|
{
|
||||||
scene.camera.transform.translation.x = i * S3L_FRACTIONS_PER_UNIT / 4;
|
animateWater();
|
||||||
|
|
||||||
|
scene.camera.transform.translation.x = -i * S3L_FRACTIONS_PER_UNIT / 4;
|
||||||
scene.camera.transform.translation.y = 8 * S3L_FRACTIONS_PER_UNIT;
|
scene.camera.transform.translation.y = 8 * S3L_FRACTIONS_PER_UNIT;
|
||||||
scene.camera.transform.translation.z = -10 * S3L_FRACTIONS_PER_UNIT + i * S3L_FRACTIONS_PER_UNIT / 4;
|
scene.camera.transform.translation.z = -10 * S3L_FRACTIONS_PER_UNIT + i * S3L_FRACTIONS_PER_UNIT / 4;
|
||||||
|
|
||||||
|
@ -304,6 +352,8 @@ int main()
|
||||||
fileName[5] = '0' + (i % 10);
|
fileName[5] = '0' + (i % 10);
|
||||||
|
|
||||||
saveImage(fileName);
|
saveImage(fileName);
|
||||||
|
|
||||||
|
frame++;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
Loading…
Reference in a new issue