📄 spharm.c
字号:
verts->ny = n.y;
verts->nz = n.z;
verts++;
#if 0 // slower
memcpy(verts,prevptr,sizeof(struct Vertex));
memcpy(prevptr,verts-1,sizeof(struct Vertex));
verts++;
#else
// Add previous point to our list
verts->u = prevptr->u;
verts->v = prevptr->v;
verts->color = prevptr->color;
verts->x = prevptr->x;
verts->y = prevptr->y;
verts->z = prevptr->z;
verts->nx = prevptr->nx;
verts->ny = prevptr->ny;
verts->nz = prevptr->nz;
verts++;
// Save this point as previous
prevptr->u = texy;
prevptr->v = texx;
if (color)
prevptr->color = 0xff000020 | (((int)coly)<< 16) | (((int)colx)<<8);
else
prevptr->color = 0xff555555;
prevptr->x = q.x;
prevptr->y = q.y;
prevptr->z = q.z;
prevptr->nx = n.x;
prevptr->ny = n.y;
prevptr->nz = n.z;
#endif
// Move previous pointer on
prevptr++;
colx += dcolx;
}
coly += dcoly;
}
}
extern unsigned char logo2_start[];
extern unsigned char logo3_start[];
unsigned char *logo2_temp;
unsigned char *logo3_temp;
static int rendertype;
ScePspFVector3 columns[4] = {
{ 0.707f, 0.707f, 0.0f }, // cos(a), sin(a), tx
{ -0.707f, 0.707f, 0.0f }, // -sin(a), cos(a), ty
{ 0.86f, 0.5f, 0.0f },
{ -0.5f, 0.86f, 0.0f }
};
static ScePspFVector3 lpos = {0.0f,0.0f,1.0f};
static ScePspFVector3 lpos1 = {0.0f,1.0f,0.0f};
static ScePspFVector3 lpos2 = {1.0f,0.0f,0.0f};
// converts the image and uploads it to vram in one go
#define VRAM_OFFSET ((512*280*4)*3)
// 0x198000
static unsigned int vramaddr = 0;
unsigned char *convertimage(unsigned char *inptr,int size)
{
// convert our raw image
// saved as raw. no header .. interleaved and order RGB
int x;
unsigned char *input = inptr;
unsigned char *output,*outptr;
int tsize = size*size;
if (vramaddr == 0)
vramaddr = (0x40000000 | (u32) sceGeEdramGetAddr()) + VRAM_OFFSET;
outptr = output = (unsigned char *)vramaddr;
for (x=0;x<tsize;x++) {
*(outptr++) = *(input++)/2;
*(outptr++) = *(input++)/2;
*(outptr++) = *(input++)/2;
*(outptr++) = 0xff;
}
vramaddr += tsize * 4;
if ((vramaddr & 0xff) != 0)
vramaddr = (vramaddr & 0xffffff00) + 0x100;
return output;
}
#define GU_UV_MAP 0
#define GU_PROJ_MAP 1
#define GU_ENV_MAP 2
void set_rendermode(int mode, int *color)
{
int textured = 0;
int lit = 0;
int color2 = 0;
int envmap = 0;
// Initial Setup
sceGuShadeModel(1);
sceGuEnable(GU_CLIP_PLANES);
sceGuDisable(GU_CULL_FACE);
sceGuDepthFunc(GU_GEQUAL);
sceGuEnable(GU_DEPTH_TEST);
sceGuDisable(GU_TEXTURE_2D);
sceGuDisable(GU_LIGHTING);
sceGuDisable(GU_LIGHT0);
sceGuDisable(GU_LIGHT1);
sceGuDisable(GU_LIGHT2);
sceGuDisable(GU_LIGHT3);
switch(mode) {
default:
case 0: // Linestrips, no texture, colored and lit
color2 = 1;
break;
case 1: // Plain colors, no texture
color2 = 1;
break;
case 2: // Plain, lit, no texture
lit = 1;
break;
case 3: // Textured
textured = 1;
sceGuTexMapMode(GU_UV_MAP,0,0);
break;
case 4: // Textured, colored, no lights
color2 = 1;
textured = 1;
sceGuTexMapMode(GU_UV_MAP,0,0);
break;
case 5: // Textured, lit
textured = 1;
lit = 1;
sceGuTexMapMode(GU_UV_MAP,0,0);
break;
case 6: // Textured, envmap
textured = 1;
envmap = 1;
break;
case 7: // Textured, envmap
textured = 2;
envmap = 1;
break;
case 8: // Textured, envmap, vertex colors
color2 = 1;
textured = 2;
envmap = 1;
break;
case 9: // Linestrips, no texture, colored and lit
textured = 2;
envmap = 1;
break;
}
if (envmap == 1) {
sceGuEnable(GU_LIGHTING);
sceGuEnable(GU_LIGHT0);
sceGuEnable(GU_LIGHT1);
sceGuEnable(GU_LIGHT2);
sceGuEnable(GU_LIGHT3);
sceGuLight( 0, GU_DIRECTIONAL, GU_DIFFUSE, &columns[0] );
sceGuLight( 1, GU_DIRECTIONAL, GU_DIFFUSE, &columns[1] );
sceGuLight( 2, GU_DIRECTIONAL, GU_DIFFUSE, &columns[2] );
sceGuLight( 3, GU_DIRECTIONAL, GU_DIFFUSE, &columns[3] );
sceGuTexProjMapMode( 0 );
sceGuTexMapMode( GU_ENV_MAP, 0, 1 ); // rotate envmap 45 degrees
}
if (lit == 1) {
// lighting
sceGuEnable(GU_LIGHTING);
sceGuEnable(GU_LIGHT0);
sceGuLight(0,GU_DIRECTIONAL,GU_DIFFUSE_AND_SPECULAR,&lpos);
sceGuLightColor(0,GU_DIFFUSE,0xff00a000);
sceGuLightColor(0,GU_SPECULAR,0xff00ff00);
sceGuLightAtt(0,0.0f,1.0f,0.0f);
sceGuEnable(GU_LIGHT1);
sceGuLight(1,GU_DIRECTIONAL,GU_DIFFUSE_AND_SPECULAR,&lpos1);
sceGuLightColor(1,GU_DIFFUSE,0xff0000a0);
sceGuLightColor(1,GU_SPECULAR,0xff0000ff);
sceGuLightAtt(1,0.0f,1.0f,0.0f);
sceGuEnable(GU_LIGHT2);
sceGuLight(2,GU_DIRECTIONAL,GU_DIFFUSE_AND_SPECULAR,&lpos2);
sceGuLightColor(2,GU_DIFFUSE,0xffa00000);
sceGuLightColor(2,GU_SPECULAR,0xffff0000);
sceGuLightAtt(2,0.0f,1.0f,0.0f);
sceGuSpecular(12.0f);
sceGuAmbient(0xff101010);
}
if (textured != 0) {
// textures
sceGuEnable(GU_TEXTURE_2D);
sceGuTexMode(GU_PSM_8888,0,0,0);
if (textured == 1) sceGuTexImage(0,128,128,128,logo2_temp);
else if (textured == 2) sceGuTexImage(0,256,256,256,logo3_temp);
sceGuTexFunc(GU_TFX_ADD,GU_TCC_RGB);
sceGuTexFilter(GU_LINEAR,GU_LINEAR);
sceGuTexScale(1.0f,1.0f);
sceGuTexOffset(0.0f,0.0f);
sceGuAmbientColor(0xff101010);
sceGuTexSync();
}
*color = color2;
}
#define TIME_LEN 100
#define TIME_PAUSE 100
void SpharmGenTest(int rendermode)
{
static int inited = 0;
static int resx = 20; // up/dpwn
static int resy = 24; // round
static int count = TIME_LEN+TIME_PAUSE;
static int objtype = -1;
static int odd = 0;
static int initial = 0;
int color;
if (initial == 0) {
objgen_spharm_setparam(1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f);
objgen_spharm_setparamg(0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,0.0f);
initial = 1;
sgenrand(12345);
logo2_temp = convertimage(logo2_start,128);
logo3_temp = convertimage(logo3_start,256);
}
// Start list
sceGuStart(0,(unsigned int *)spharmlist);
set_rendermode(rendermode,&color);
{
int y;
//1int index = ((resx*2)-1);
int index = (resx*2);
int primtype = 4;
if (rendermode == 0) primtype = 2;
else if (rendermode == 9) primtype = 2;
int index2 = index;
if (odd) {
for (y=1;y<resy;y++)
sceGumDrawArray(primtype,PSP_GEVERT_SET(3,7,3,3,0,0),index2,0,&vertices[y * index]);
} else {
for (y=1;y<resy;y++)
sceGumDrawArray(primtype,PSP_GEVERT_SET(3,7,3,3,0,0),index2,0,&vertices2[y * index]);
}
}
sceKernelDcacheWritebackAll();
sceGuFinish();
if (count > (TIME_LEN+TIME_PAUSE)) {
inited = 0;
}
if (count <= TIME_LEN ) objgen_spharm_tick();
count++;
if (inited == 0) {
inited = 1;
objtype++;
// default
switch(objtype)
{
case 0:
break;
case 1:
objgen_spharm_setparamt(TIME_LEN,40.0f,1.0f,40.0f,1.0f,1.0f,1.0f,1.0f,1.0f);
break;
case 2:
objgen_spharm_setparamt(TIME_LEN,20.0f,2.0f,20.0f,1.0f,1.0f,1.0f,1.0f,1.0f);
break;
case 3:
objgen_spharm_setparamt(TIME_LEN,10.0f,2.0f,1.0f,2.0f,3.0f,2.0f,3.0f,2.0f);
break;
case 4:
objgen_spharm_setparamt(TIME_LEN,4.0f,2.0f,2.0f,2.0f,3.0f,2.0f,3.0f,2.0f);
break;
case 5:
objgen_spharm_setparamt(TIME_LEN,2.0f,4.0f,1.0f,2.0f,1.0f,2.0f,1.0f,4.0f);
break;
case 6:
objgen_spharm_setparamt(TIME_LEN,1.0f,6.0f,1.0f,3.0f,1.0f,3.0f,1.0f,6.0f);
break;
case 7:
objgen_spharm_setparamt(TIME_LEN,6.0f,3.0f,6.0f,3.0f,2.0f,3.0f,2.0f,3.0f);
break;
#define RAND_MULT 30.0f
case 8: {
// random object
static float t1,t2,t3,t4,t5,t6,t7,t8;
t1 = genrand() * 6.0f; t1 = floorf(t1);
t2 = genrand() * 6.0f; if (t2 == 0.0f) t2 += 0.02f;
t3 = genrand() * 6.0f; t3 = floorf(t3);
t4 = genrand() * 6.0f; if (t4 == 0.0f) t4 += 0.02f;
t5 = genrand() * 6.0f; t5 = floorf(t5);
t6 = genrand() * 6.0f; if (t6 == 0.0f) t6 += 0.02f;
t7 = genrand() * 6.0f; t7 = floorf(t7);
t8 = genrand() * 6.0f; if (t8 == 0.0f) t8 += 0.02f;
objgen_spharm_setparamt(TIME_LEN,t1,t2,t3,t4,t5,t6,t7,t8);
objtype--;// make sure we end up back in same spot
//objtype = 6; // make sure we end up back in same spot
} break;
default: // none found, so move to next one, and trigger re-gen
objtype == 0;
inited = 0;
break;
}
count = 0;
}
if (odd) {
SparmGenList(vertices2,resx,resy,color);
odd = 0;
} else {
SparmGenList(vertices,resx,resy,color);
odd = 1;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -