aboutsummaryrefslogtreecommitdiff
path: root/examples/demos/n00bdemo/logo.c
diff options
context:
space:
mode:
Diffstat (limited to 'examples/demos/n00bdemo/logo.c')
-rw-r--r--examples/demos/n00bdemo/logo.c428
1 files changed, 428 insertions, 0 deletions
diff --git a/examples/demos/n00bdemo/logo.c b/examples/demos/n00bdemo/logo.c
new file mode 100644
index 0000000..3fdef5e
--- /dev/null
+++ b/examples/demos/n00bdemo/logo.c
@@ -0,0 +1,428 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <psxetc.h>
+#include <psxgte.h>
+#include <psxgpu.h>
+#include <inline_c.h>
+#include "malloc.h"
+#include "smd.h"
+#include "lzp.h"
+
+#include "disp.h"
+#include "data.h"
+
+#define MAX_STARS 64
+
+
+typedef struct {
+ int x,y;
+ int xvel,yvel;
+ int scale;
+ int rot,rotv;
+} PARTICLE;
+
+typedef struct {
+ unsigned int tag;
+ unsigned int tpage;
+ unsigned int mask1;
+ unsigned char r0,g0,b0,code;
+ short x0,y0;
+ short x1,y1;
+ short x2,y2;
+ short x3,y3;
+ unsigned int mask2;
+} MASKP_F4;
+
+typedef struct {
+ unsigned int tag;
+ unsigned int tpage;
+ unsigned char r0,g0,b0,code;
+ short x0,y0;
+ short w,h;
+} FADERECT;
+
+
+SMD *o_psn00b, *o_n00blogo;
+
+
+typedef struct {
+ unsigned int *prev;
+ unsigned int *next;
+ int size;
+} NODE;
+
+void DumpHeap() {
+
+ NODE *n = (NODE*)GetBSSend();
+
+ printf( "--\n" );
+
+ while( 1 ) {
+
+ printf( "B:%08p P:%08p N:%08p SZ:%d BS:%d\n",
+ n, n->prev, n->next, n->size,
+ ((unsigned int)n->next - (unsigned int)n) );
+
+ if ( !n->next )
+ break;
+
+ n = (NODE*)n->next;
+
+ }
+
+}
+
+
+void intro() {
+
+ SVECTOR quad_coords[] = {
+ { -100, -100, 0, 0 },
+ { 100, -100, 0, 0 },
+ { -100, 100, 0, 0 },
+ { 100, 100, 0, 0 }
+ };
+
+ PARTICLE stars[MAX_STARS];
+
+ VECTOR mpos;
+ SVECTOR mrot,trot;
+ SC_OT s_ot;
+
+ SMD *o_disk, *o_star, *o_text, *o_psn00b, *o_n00blogo;
+
+ int i,count = 0;
+
+ int logo_scale;
+ int logo_rot;
+
+ int logo_yvel;
+ int logo_ypos;
+ int logo_step;
+ int logo_spin;
+ int logo_svel;
+ int logo_count = 0;
+ int logo_tscale;
+
+ int logo_n00b_spin;
+ int logo_fade = 0;
+
+ struct {
+ int step;
+ int yvel;
+ int ypos;
+ int rot;
+ int scale;
+ int spin;
+ int spinvel;
+ int tscale;
+ int trot;
+ } mtek = {
+ 0,
+ 0,
+ ONE*750,
+ -ONE*512,
+ ONE*7,
+ 0,
+ 0,
+ 3072,
+ 0
+ };
+
+ struct {
+ VECTOR pos;
+ int scale;
+ int scarlet_spin;
+ } psn00b = {
+ { 0, 0, 0 },
+ ONE,
+ 1024
+ };
+
+
+ i = lzpSearchFile( "mtekdisk", lz_resources );
+ o_disk = (SMD*)malloc( lzpFileSize( lz_resources, i ) );
+ lzpUnpackFile( o_disk, lz_resources, i );
+ smdInitData( o_disk );
+
+ i = lzpSearchFile( "mtektext", lz_resources );
+ o_text = (SMD*)malloc( lzpFileSize( lz_resources, i ) );
+ lzpUnpackFile( o_text, lz_resources, i );
+ smdInitData( o_text );
+
+ i = lzpSearchFile( "starsprite", lz_resources );
+ o_star = (SMD*)malloc( lzpFileSize( lz_resources, i ) );
+ lzpUnpackFile( o_star, lz_resources, i );
+ smdInitData( o_star );
+
+ i = lzpSearchFile( "psn00blogo", lz_resources );
+ o_psn00b = (SMD*)malloc( lzpFileSize( lz_resources, i ) );
+ lzpUnpackFile( o_psn00b, lz_resources, i );
+ smdInitData( o_psn00b );
+
+ i = lzpSearchFile( "n00blogo", lz_resources );
+ o_n00blogo = (SMD*)malloc( lzpFileSize( lz_resources, i ) );
+ lzpUnpackFile( o_n00blogo, lz_resources, i );
+ smdInitData( o_n00blogo );
+
+ //DumpHeap();
+
+
+ // Set some Scarlet global parameters
+ smdSetBaseTPage( 0x200 );
+
+ // Change clear color
+ setRGB0( &draw, 255, 255, 255 );
+
+ setVector( &trot, 0, 0, 0 );
+
+
+ // Initialize stars
+ for( i=0; i<MAX_STARS; i++ ) {
+
+ stars[i].x = ONE*(-200+(rand()%400));
+ stars[i].y = ONE*(80+(rand()%100));
+
+ stars[i].yvel = -(rand()%32768);
+ stars[i].xvel = -(ONE*(10-(rand()%20)));
+
+ stars[i].scale = 2048+(rand()%2048);
+ stars[i].rot = ONE*(rand()%4096);
+ stars[i].rotv = ONE*(-40+(rand()%80));
+
+ }
+
+ logo_n00b_spin = ONE+1024;
+
+ while( logo_count < 1320 ) {
+
+ if( logo_count < 700 ) {
+
+ if( logo_count > 360 ) {
+ mtek.spin -= mtek.spinvel;
+ mtek.spinvel += 1280;
+ }
+
+ setVector( &mpos, 0, -(mtek.ypos>>12)-20, 400 );
+ setVector( &mrot, 0, mtek.spin>>12, mtek.rot>>12 );
+
+ RotMatrix( &mrot, &mtx );
+ TransMatrix( &mtx, &mpos );
+ setVector( &mpos, mtek.scale, mtek.scale, 4096 );
+ ScaleMatrix( &mtx, &mpos );
+
+ gte_SetRotMatrix( &mtx );
+ gte_SetTransMatrix( &mtx );
+
+ nextpri = smdSortModelFlat( ot[db]+10, nextpri, o_disk );
+
+
+ if( mtek.step > 0 ) {
+
+ setVector( &mpos, 0, 180, 400 );
+ TransMatrix( &mtx, &mpos );
+ gte_SetTransMatrix( &mtx );
+
+ nextpri = smdSortModelFlat( ot[db]+8, nextpri, o_text );
+
+ if( logo_count < 480 ) {
+
+ SVECTOR srot;
+
+ for( i=0; i<MAX_STARS; i++ ) {
+
+ setVector( &mpos, stars[i].x>>12, stars[i].y>>12, 320 );
+ setVector( &srot, 0, 0, stars[i].rot>>12 );
+
+ stars[i].x += stars[i].xvel;
+ stars[i].y += stars[i].yvel;
+
+ stars[i].yvel += 512;
+ stars[i].rot += stars[i].rotv;
+
+ RotMatrix( &srot, &mtx );
+ TransMatrix( &mtx, &mpos );
+
+ setVector( &mpos, stars[i].scale, stars[i].scale, 4096 );
+ ScaleMatrix( &mtx, &mpos );
+
+ gte_SetRotMatrix( &mtx );
+ gte_SetTransMatrix( &mtx );
+
+ nextpri = smdSortModelFlat( ot[db]+6, nextpri, o_star );
+
+ }
+
+ }
+
+ }
+
+ if( !mtek.step ) {
+ mtek.rot -= ONE*20;
+ } else if( mtek.step == 1 ) {
+ mtek.rot += ( -mtek.rot )>>4;
+ }
+
+
+ if( mtek.step < 2 ) {
+ mtek.scale += (ONE-mtek.scale )>>5;
+ mtek.yvel += 512;
+ mtek.ypos -= mtek.yvel;
+ }
+
+
+ if( ( mtek.ypos <= 0 ) && ( mtek.yvel > 0 ) ) {
+ mtek.yvel = -ONE*6;
+ mtek.step++;
+ }
+
+ // Does the transition effect
+ if( logo_count > 480 ) {
+
+ TILE *rect = (TILE*)nextpri;
+
+ mtek.trot += 16;
+
+ setTile( rect );
+ setXY0( rect, 0, 0 );
+ setWH( rect, 640, 511 );
+ setRGB0( rect, 0, 0, 0 );
+ addPrim( ot[db]+4, rect );
+ nextpri += sizeof(TILE);
+
+ setVector( &mrot, 0, 0, mtek.trot );
+ setVector( &mpos, mtek.tscale, mtek.tscale, 4096 );
+
+ RotMatrix( &mrot, &mtx );
+ ScaleMatrix( &mtx, &mpos );
+
+ gte_SetRotMatrix( &mtx );
+
+ for( i=0; i<6; i++ ) {
+
+ MASKP_F4 *pol4 = (MASKP_F4*)nextpri;
+
+ setVector( &mpos, -100+(100*(i%3)), -60+(120*(i/3)), 160 );
+ TransMatrix( &mtx, &mpos );
+ gte_SetTransMatrix( &mtx );
+
+ pol4->tag = 0x08000000;
+ pol4->tpage = 0xe1000020;
+ pol4->mask1 = 0xe6000001;
+ pol4->mask2 = 0xe6000002;
+ pol4->code = 0x2A;
+
+ gte_ldv3( &quad_coords[0], &quad_coords[1], &quad_coords[2] );
+ gte_rtpt();
+ gte_stsxy0( &pol4->x0 );
+ gte_ldv0( &quad_coords[3] );
+ gte_rtps();
+ gte_stsxy3( &pol4->x1, &pol4->x2, &pol4->x3 );
+ setRGB0( pol4, 0, 0, 0 );
+
+ addPrim( ot[db]+4, pol4 );
+ nextpri += sizeof(MASKP_F4);
+
+ }
+
+ mtek.tscale += ( -mtek.tscale )>>6;
+
+ }
+
+ } else {
+
+ setRGB0( &draw, 0, 0, 0 );
+
+ }
+
+ if( logo_count >= 480 ) {
+
+ if( logo_count > 840 ) {
+
+ psn00b.pos.vx += ((ONE*-450)-psn00b.pos.vx)>>4;
+ psn00b.pos.vy += ((ONE*350)-psn00b.pos.vy)>>4;
+
+ setVector( &mpos, 0, 0, 600 );
+ mpos.vx = psn00b.pos.vx>>12;
+ mpos.vy = psn00b.pos.vy>>12;
+
+ psn00b.scale += ( 1536-psn00b.scale )>>4;
+
+ setVector( &mrot, 0, 0, 0 );
+
+ RotMatrix( &mrot, &mtx );
+ TransMatrix( &mtx, &mpos );
+
+ setVector( &mpos, psn00b.scale, psn00b.scale, ONE );
+
+ ScaleMatrix( &mtx, &mpos );
+
+ } else {
+
+ setVector( &mpos, 0, 0, 600 );
+ setVector( &mrot, 0, logo_n00b_spin, 0 );
+
+ RotMatrix( &mrot, &mtx );
+ TransMatrix( &mtx, &mpos );
+
+ logo_n00b_spin += ( -logo_n00b_spin )>>6;
+
+ }
+
+ gte_SetRotMatrix( &mtx );
+ gte_SetTransMatrix( &mtx );
+
+ nextpri = smdSortModelFlat( ot[db]+3, nextpri, o_psn00b );
+
+ if( logo_count > 900 ) {
+
+ setVector( &mpos, 0, 0, 250 );
+ setVector( &mrot, psn00b.scarlet_spin, 0, 0 );
+
+ RotMatrix( &mrot, &mtx );
+ TransMatrix( &mtx, &mpos );
+
+ gte_SetRotMatrix( &mtx );
+ gte_SetTransMatrix( &mtx );
+
+ nextpri = smdSortModelFlat( ot[db]+3, nextpri, o_n00blogo );
+
+ psn00b.scarlet_spin += ( -psn00b.scarlet_spin )>>6;
+
+ }
+
+ }
+
+ if( logo_count > 1200 ) {
+
+ FADERECT *fade = (FADERECT*)nextpri;
+
+ fade->tag = 0x04000000;
+ fade->tpage = 0xe1000040;
+ fade->code = 0x62;
+
+ setRGB0( fade, logo_fade, logo_fade, logo_fade );
+ setXY0( fade, 0, 0 );
+ setWH( fade, 640, 480 );
+ addPrim( ot[db]+2, fade );
+
+ if( logo_fade < 250 ) {
+ logo_fade += 4;
+ }
+
+ nextpri += sizeof(FADERECT);
+
+ }
+
+ display();
+
+ logo_count++;
+
+ }
+
+ free( o_disk );
+ free( o_text );
+ free( o_star );
+ free( o_psn00b );
+ free( o_n00blogo );
+
+}