mirror of
https://github.com/aap/librw.git
synced 2026-08-10 09:37:04 +01:00
138 lines
3.1 KiB
C++
138 lines
3.1 KiB
C++
#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);
|
|
}
|