home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Dream 52
/
Amiga_Dream_52.iso
/
Amiga
/
Jeux
/
demos
/
crystalPPC.lha
/
main.cpp
< prev
next >
Wrap
C/C++ Source or Header
|
1998-05-05
|
13KB
|
633 lines
#include <stdio.h>
#include <stdlib.h>
#ifdef OS_DOS
# include <conio.h>
#endif
#include <time.h>
#ifndef DEF_H
#include "def.h"
#endif
#ifndef SYSTEM_H
#include "system.h"
#endif
#ifndef TEXTURE_H
#include "texture.h"
#endif
#ifndef CAMERA_H
#include "camera.h"
#endif
#ifndef POLYGON_H
#include "polygon.h"
#endif
#ifndef SECTOR_H
#include "sector.h"
#endif
#ifndef VIEWPOLY_H
#include "viewpoly.h"
#endif
#ifndef WORLD_H
#include "world.h"
#endif
#ifndef LIGHT_H
#include "light.h"
#endif
#ifndef CONFIG_H
#include "config.h"
#endif
#ifndef LIGHTMAP_H
#include "lightmap.h"
#endif
#include "global.h"
CrystConfig config ("cryst.cfg");
int fps=0;
int num=0;
Camera c;
ViewPolygon view (40);
World world;
Textures* tex;
Sector* room;
System *Sys;
double tb_scale_hi;
double tb_scale_lo;
int show_fps=0;
int thetimer=0;
extern "C" int ppctimer(unsigned int clock[2]);
long I_GetTime (void)
{
unsigned int clock[2];
double currtics;
static double basetics=0.0;
if (!thetimer) return time(0);
else
{
ppctimer (clock);
if (basetics == 0.0)
basetics = ((double) clock[0])*tb_scale_hi + ((double) clock[1])/tb_scale_lo;
currtics = ((double) clock[0])*tb_scale_hi + ((double) clock[1])/tb_scale_lo;
return (int) ((currtics-basetics)/70);
}
}
//vonmir
//extern "C" CaptureScreen (char *, byte *);
extern CaptureScreen (char *, byte *);
//
void do_expose ()
{
if (!Sys->Graph->Memory) return;
//Sys->Graph.Clear (0); // @@@ ONLY TO SEE IF WE DRAW EVERY PIXEL!
world.draw (Sys->Graph, &c, &view);
Sys->Graph->Print();
}
void do_buttonpress (int x, int y, int shift, int alt, int ctrl)
{
(void)alt;
(void)ctrl;
if (c.edit_mode == MODE_POLYGON)
c.sel_polygon = world.select_polygon (&c, &view, x, y);
else if (c.edit_mode == MODE_VERTEX)
{
Vertex* v = world.select_vertex (&c, &view, x, y);
if (v)
{
if (shift) c.sel_vertex[c.num_sel_verts++] = v;
else
{
c.sel_vertex[0] = v;
c.num_sel_verts = 1;
}
}
}
}
void do_buttonrelease (int x, int y)
{
(void)x; (void)y;
}
void do_mousemotion (int x, int y)
{
(void)x; (void)y;
}
int cnt = 1;
long time0 = -1;
#include <clib/rtgmaster_protos.h>
#include <rtgmaster/rtgmaster.h>
#include <rtgmaster/rtgsublibs.h>
extern struct RtgScreen *MyScreen;
int mhz;
void video_do_fps()
{
int x;
static unsigned int start_time[2] = {0, 0};
unsigned int end_time[2];
char msg[4];
ppctimer (end_time);
if (end_time[1] >= start_time[1])
x = (((end_time[1] - start_time[1]) << 2) / mhz);
else
x = (((end_time[1] - start_time[1]) << 2) / mhz + 1000000);
if (x != 0) {
x = (1000000 + (x >> 1)) / x; /* round to nearest */
msg[0] = (x % 1000) / 100 + '0';
msg[1] = (x % 100) / 10 + '0';
msg[2] = (x % 10) + '0';
msg[3] = '\0';
PPCRtgText(MyScreen,PPCGetBufAdr(MyScreen,0),msg,3,FRAME_WIDTH-24,6);
}
start_time[1] = end_time[1];
}
void do_stuff ()
{
if (show_fps)
{
video_do_fps();
}
{
if (cnt <= 0)
{
long time1 = I_GetTime();
if (time0 != -1)
{
fps=fps+100./(float)(time1-time0);
num=num+1;
//dprintf ("Fps = %f\n", 100./(float)(time1-time0));
}
cnt = 100;
time0 = I_GetTime();
}
cnt--;
}
world.step_scripts ();
do_expose ();
}
void perf_test ()
{
long t1, t2;
dprintf ("Start performance test at current position!\n");
t1 = I_GetTime();
int i;
for (i = 0 ; i < 100 ; i++)
{
world.step_scripts ();
do_expose ();
}
t2 = I_GetTime();
dprintf ("It took %ld seconds to render 100 frames: %f fps\n",
t2-t1, 100./(float)(t2-t1));
cnt = 1;
time0 = -1;
}
//vonmir
//extern "C" void WritePCX (char *name, char *data, byte *pal, int width,int height);
extern void WritePCX (char *name, char *data, byte *pal, int width,int height);
//
void CaptureScreen (void)
{
int i = 0;
char name[255];
byte pall[768], *pal = pall;
//vonmir
// do {
// sprintf (name, "cryst%02d.pcx", i++);
// } while (i < 100
//#ifndef COMP_WCC
// && (access (name, 0) == 0)
//#endif
// );
//ersatzlos gestrichen
//
if ( i>= 100) return;
for (i=0; i<256; i++)
{
*pal++ = graphicsPalette[i].red;
*pal++ = graphicsPalette[i].green;
*pal++ = graphicsPalette[i].blue;
}
WritePCX (name, graphicsData, pall, FRAME_WIDTH, FRAME_HEIGHT);
dprintf ("Screenshot: %s", name);
}
char* edit_modes[] = { "NONE", "EDIT", "VERTEX", "POLYGON", "MOVE_VERTEX" };
void do_keypress (int key, int shift, int alt, int ctrl)
{
Vector3* v;
switch (key)
{
case 'b':
c.turn_around ();
break;
case KEY_UP:
if (alt)
{
if (ctrl) c.up (.01);
else if (shift) c.up (.4);
else c.up (.2);
}
else if (ctrl) c.forward (.01);
else if (shift) c.forward (.4);
else c.forward (.2);
break;
case KEY_DOWN:
if (alt)
{
if (ctrl) c.down (.01);
else if (shift) c.down (.4);
else c.down (.2);
}
else if (ctrl) c.backward (.01);
else if (shift) c.backward (.4);
else c.backward (.2);
break;
case KEY_LEFT:
if (alt)
{
if (ctrl) c.left (.01);
else if (shift) c.left (.4);
else c.left (.2);
}
else if (ctrl) c.rot_left (.005);
else if (shift) c.rot_left (.2);
else c.rot_left (.1);
break;
case KEY_RIGHT:
if (alt)
{
if (ctrl) c.right (.01);
else if (shift) c.right (.4);
else c.right (.2);
}
else if (ctrl) c.rot_right (.005);
else if (shift) c.rot_right (.2);
else c.rot_right (.1);
break;
case KEY_PGUP:
if (alt)
{
if (ctrl) c.rot_z_left (.005);
else c.rot_z_left (.1);
}
else if (ctrl) c.rot_up (.005);
else if (shift) c.rot_up (.2);
else c.rot_up (.1);
break;
case KEY_PGDN:
if (alt)
{
if (ctrl) c.rot_z_right (.005);
else c.rot_z_right (.1);
}
else if (ctrl) c.rot_down (.005);
else if (shift) c.rot_down (.2);
else c.rot_down (.1);
break;
case ' ':
world.trigger_activate (c);
break;
case 'l':
tex->do_lighting = !tex->do_lighting;
dprintf ("Lighting '%s'.\n", tex->do_lighting ? "on" : "off");
#if 0
{
Vector3 pos;
c.get_forward_position (6, pos);
c.sector->add_dyn_light (pos.x, pos.y, pos.z, 7, 1, 0, 0);
}
#endif
break;
case 'a':
CaptureScreen ();
break;
case 'e':
if (c.edit_mode == MODE_NONE) c.edit_mode = MODE_EDIT;
else c.edit_mode = MODE_NONE;
dprintf ("Current mode: %s\n", edit_modes[c.edit_mode]);
break;
case 'm':
if (c.edit_mode == MODE_NONE) break;
if (c.edit_mode == MODE_VERTEX) c.edit_mode = MODE_POLYGON;
else if (c.edit_mode == MODE_POLYGON) c.edit_mode = MODE_EDIT;
else c.edit_mode = MODE_VERTEX;
dprintf ("Current mode: %s\n", edit_modes[c.edit_mode]);
break;
case 'v':
if (c.edit_mode == MODE_NONE) break;
if (c.edit_mode == MODE_MOVE_VERTEX) c.edit_mode = MODE_EDIT;
else c.edit_mode = MODE_MOVE_VERTEX;
dprintf ("Current mode: %s\n", edit_modes[c.edit_mode]);
break;
case 'x':
if (c.edit_mode != MODE_MOVE_VERTEX && !c.sel_vertex[0]) break;
v = &c.sel_vertex[0]->get_ov ();
if (shift) v->x -= .05;
else v->x += .05;
c.sel_vertex[0]->set (*v);
break;
case 'y':
if (c.edit_mode != MODE_MOVE_VERTEX && !c.sel_vertex[0]) break;
v = &c.sel_vertex[0]->get_ov ();
if (shift) v->y -= .05;
else v->y += .05;
c.sel_vertex[0]->set (*v);
break;
case 'z':
if (c.edit_mode != MODE_MOVE_VERTEX && !c.sel_vertex[0]) break;
v = &c.sel_vertex[0]->get_ov ();
if (shift) v->z -= .05;
else v->z += .05;
c.sel_vertex[0]->set (*v);
break;
case 'c':
dprintf ("==============================================================\n");
if (shift)
{
printf ("SAVE COORDS\n");
c.save_file ("coord");
}
else
{
dprintf ("LOAD COORDS\n");
c.load_file (&world, "coord");
}
dprintf ("==============================================================\n");
break;
case 's':
if (alt)
{
dprintf ("SAVE LEVEL\n");
world.save ("world");
dprintf ("DONE!\n");
}
else if (shift)
{
dprintf ("LOAD LEVEL\n");
world.load ("world");
dprintf ("DONE!\n");
tex = world.get_textures ();
tex->alloc_palette (Sys->Graph);
room = world.get_sector ("room");
c.m_world2cam.identity ();
c.v_world2cam.x = 0;
c.v_world2cam.y = 0;
c.v_world2cam.z = 0;
c.sector = room;
}
else
{
if (c.edit_mode == MODE_NONE) break;
dprintf ("Split poly\n");
world.edit_split_poly (&c);
}
break;
case 'q':
Sys->Shutdown = 1;
break;
case 't':
if (shift)
{
switch (tex->mipmapped)
{
case 0:
tex->mipmapped = 1;
dprintf ("Mipmapping 'on'\n");
break;
case 1:
tex->mipmapped = 2;
dprintf ("Mipmapping 'always'\n");
break;
case 2:
tex->mipmapped = 0;
dprintf ("Mipmapping 'off'\n");
break;
}
}
else if (alt)
{
switch (LightMap::setting)
{
case MIPMAP_SHADOW_ACCURATE:
LightMap::setting = MIPMAP_SHADOW_REASONABLE;
dprintf ("Shadow-mipmapping 'reasonable'\n");
break;
case MIPMAP_SHADOW_REASONABLE:
LightMap::setting = MIPMAP_SHADOW_INACCURATE;
dprintf ("Shadow-mipmapping 'inaccurate'\n");
break;
case MIPMAP_SHADOW_INACCURATE:
LightMap::setting = MIPMAP_SHADOW_ACCURATE;
dprintf ("Shadow-mipmapping 'accurate'\n");
break;
}
world.mipmap_settings (LightMap::setting);
}
else
{
tex->textured = !tex->textured;
dprintf ("Texture mapping '%s'.\n", tex->textured ? "on" : "off");
}
break;
case 'i':
cache.dump ();
break;
case 'r':
dprintf ("Refresh (clear) the texture cache.\n");
cache.clear ();
break;
case 'p':
perf_test ();
break;
default:
break;
}
}
/*
* Our main event loop.
*/
void main_loop ()
{
//render_time = time (NULL);
Sys->Loop();
if (num>0) printf("fps = %i\n",fps/num);
}
int func1 (float x)
{
return QRound (x);
}
int func2 (float x)
{
return (int)(x+.5);
}
int test (float par)
{
time_t s1, s2;
int i;
int rc1 = 1, rc2 = 1;
printf ("START (1)\n");
s1 = I_GetTime();
for (i = 0 ; i < 10000000 ; i++)
{
rc1 = func1 (par);
}
s2 = I_GetTime();
printf ("STOP: %ld\n", s2-s1);
printf ("START (2)\n");
s1 = I_GetTime();
for (i = 0 ; i < 10000000 ; i++)
{
rc2 = func2 (par);
}
s2 = I_GetTime();
printf ("STOP: %ld\n", s2-s1);
printf ("rc1 = %d, rc2 = %d\n", rc1, rc2);
return 0;
}
/*
* Main function
*/
int mmu=0;
int main (int argc, char* argv[])
{
#if 0
// This construction enables short-precision mode in the pentium
// processor. I read somewhere that this should be faster. As
// this doesn't seem to give a speed increase in Linux I don't enable it
// yet. Maybe later when I test it in DOS?
int OldFPUCW, FPUCW;
asm volatile ("\
fstcw (%0) \n\
movl (%0),%%eax \n\
andl $0xfcff,%%eax \n\
movl %%eax,(%1) \n\
fldcw (%1) "
:
: "g" (&OldFPUCW), "g" (&FPUCW)
: "eax");
#endif
int f;
show_fps=0;
mhz=40;
if (argc>1)
{
for (f=1;f<=argc-1;f++)
{
if (strstr(argv[f],"-fps"))
{
printf("fps-Counter enabled.\n");
show_fps=1;
}
if (strstr(argv[f],"-bus"))
{
if (argc-1>f)
{
mhz=atoi(argv[f+1]);
printf("Bus Clock: %i\n",mhz);
}
}
else if (strstr(argv[f],"-mmu"))
{
printf("MMU used.\n");
mmu=1;
}
else if (strstr(argv[f],"-thetimer"))
{
printf("PPC Timer used.\n");
thetimer=1;
}
}
}
tb_scale_lo = ((double)(mhz*1000000 >> 2)) / 35.0;
tb_scale_hi = (4.294967296E9 / (double)(mhz*1000000 >> 2)) * 35.0;
extern int test (float);
//test (3.1415926);
Matrix3::init ();
Sys = new System (argc, argv);
world.load ("world");
tex = world.get_textures ();
room = world.get_sector ("room");
c.m_world2cam.identity ();
c.v_world2cam.x = 0;
c.v_world2cam.y = 0;
c.v_world2cam.z = 0;
c.sector = room;
view.add_vertex (3, FRAME_HEIGHT-3);
view.add_vertex (FRAME_WIDTH-3, FRAME_HEIGHT-3);
view.add_vertex (FRAME_WIDTH-3, 3);
view.add_vertex (3, 3);
printf ("------------------------------------------------------\n");
Sys->Open();
tex->alloc_palette (Sys->Graph);
main_loop ();
Sys->Close();
return (1);
}
#include <wbstartup.h>
void wbmain(struct WBStartup * argmsg)
{
char argv[1][]={"CrystalPPC"};
int argc=1;
main(argc,(char **)argv);
}