mirror of
https://github.com/aap/librw.git
synced 2026-08-10 09:37:04 +01:00
added simple demoreel and ps2 skeleton coded by claude fable 5
This commit is contained in:
@@ -0,0 +1,137 @@
|
||||
#include <math.h>
|
||||
|
||||
#include "demoreel.h"
|
||||
|
||||
// Procedural textures so the demos need no asset files at all.
|
||||
|
||||
using namespace rw;
|
||||
|
||||
static Texture*
|
||||
imageToTexture(Image *img)
|
||||
{
|
||||
Raster *ras = Raster::createFromImage(img);
|
||||
img->destroy();
|
||||
if(ras == nil)
|
||||
return nil;
|
||||
Texture *tex = Texture::create(ras);
|
||||
tex->setFilter(Texture::LINEAR);
|
||||
tex->setAddressU(Texture::WRAP);
|
||||
tex->setAddressV(Texture::WRAP);
|
||||
return tex;
|
||||
}
|
||||
|
||||
// soft radial blob for additive particles
|
||||
Texture*
|
||||
MakeGlowTexture(void)
|
||||
{
|
||||
const int SZ = 64;
|
||||
Image *img = Image::create(SZ, SZ, 32);
|
||||
img->allocate();
|
||||
|
||||
int x, y;
|
||||
for(y = 0; y < SZ; y++){
|
||||
uint8 *line = img->pixels + y*img->stride;
|
||||
for(x = 0; x < SZ; x++){
|
||||
float dx = (x + 0.5f - SZ/2) / (SZ/2);
|
||||
float dy = (y + 0.5f - SZ/2) / (SZ/2);
|
||||
float r = sqrtf(dx*dx + dy*dy);
|
||||
float v = 1.0f - r;
|
||||
if(v < 0.0f) v = 0.0f;
|
||||
v = v*v*(3.0f - 2.0f*v); // smoothstep
|
||||
v = v*v; // sharpen the core
|
||||
uint8 c = (uint8)(v*255.0f);
|
||||
line[x*4+0] = c;
|
||||
line[x*4+1] = c;
|
||||
line[x*4+2] = c;
|
||||
line[x*4+3] = c;
|
||||
}
|
||||
}
|
||||
return imageToTexture(img);
|
||||
}
|
||||
|
||||
// glowing neon grid on dark ground
|
||||
Texture*
|
||||
MakeGridTexture(void)
|
||||
{
|
||||
const int SZ = 128;
|
||||
const int CELL = 32;
|
||||
Image *img = Image::create(SZ, SZ, 32);
|
||||
img->allocate();
|
||||
|
||||
int x, y;
|
||||
for(y = 0; y < SZ; y++){
|
||||
uint8 *line = img->pixels + y*img->stride;
|
||||
for(x = 0; x < SZ; x++){
|
||||
int mx = x % CELL; if(mx > CELL/2) mx = CELL-mx;
|
||||
int my = y % CELL; if(my > CELL/2) my = CELL-my;
|
||||
int d = mx < my ? mx : my;
|
||||
float v = 1.0f - d/6.0f;
|
||||
if(v < 0.0f) v = 0.0f;
|
||||
v = v*v;
|
||||
// dark blue ground, cyan-white lines
|
||||
float r = 0.02f + v*0.75f;
|
||||
float g = 0.03f + v*0.95f;
|
||||
float b = 0.10f + v*0.90f;
|
||||
line[x*4+0] = (uint8)(r*255.0f);
|
||||
line[x*4+1] = (uint8)(g*255.0f);
|
||||
line[x*4+2] = (uint8)(b*255.0f);
|
||||
line[x*4+3] = 255;
|
||||
}
|
||||
}
|
||||
return imageToTexture(img);
|
||||
}
|
||||
|
||||
// fake sky-ground gradient with highlight streaks, for env mapping
|
||||
Texture*
|
||||
MakeEnvTexture(void)
|
||||
{
|
||||
const int SZ = 128;
|
||||
Image *img = Image::create(SZ, SZ, 32);
|
||||
img->allocate();
|
||||
|
||||
int x, y;
|
||||
for(y = 0; y < SZ; y++){
|
||||
uint8 *line = img->pixels + y*img->stride;
|
||||
float fy = (float)y/SZ;
|
||||
for(x = 0; x < SZ; x++){
|
||||
float fx = (float)x/SZ;
|
||||
float r, g, b;
|
||||
if(fy < 0.5f){
|
||||
// sky: bright at horizon
|
||||
float t = fy*2.0f;
|
||||
r = 0.05f + t*0.55f;
|
||||
g = 0.15f + t*0.65f;
|
||||
b = 0.35f + t*0.65f;
|
||||
}else{
|
||||
// ground: dark, fading down
|
||||
float t = (fy-0.5f)*2.0f;
|
||||
r = 0.45f - t*0.40f;
|
||||
g = 0.35f - t*0.32f;
|
||||
b = 0.30f - t*0.28f;
|
||||
}
|
||||
// horizon band
|
||||
float h = fabsf(fy - 0.5f);
|
||||
float band = 1.0f - h*8.0f;
|
||||
if(band > 0.0f){
|
||||
band = band*band;
|
||||
r += band*0.5f;
|
||||
g += band*0.5f;
|
||||
b += band*0.4f;
|
||||
}
|
||||
// vertical highlight streaks in the sky
|
||||
float streak = sinf(fx*3.14159f*6.0f);
|
||||
streak = streak*streak*streak*streak;
|
||||
if(fy < 0.5f)
|
||||
r += streak*0.15f, g += streak*0.15f, b += streak*0.1f;
|
||||
|
||||
if(r > 1.0f) r = 1.0f;
|
||||
if(g > 1.0f) g = 1.0f;
|
||||
if(b > 1.0f) b = 1.0f;
|
||||
line[x*4+0] = (uint8)(r*255.0f);
|
||||
line[x*4+1] = (uint8)(g*255.0f);
|
||||
line[x*4+2] = (uint8)(b*255.0f);
|
||||
line[x*4+3] = 255;
|
||||
}
|
||||
}
|
||||
return imageToTexture(img);
|
||||
}
|
||||
Reference in New Issue
Block a user