home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Format 79
/
af079sub.adf
/
Raystorm
/
ray.lzx
/
raystorm
/
examples
/
sphanim.cpp
< prev
next >
Wrap
C/C++ Source or Header
|
1989-10-21
|
8KB
|
347 lines
/***************
* NAME: sphanim.cpp
* VERSION: 1.0 10.08.1995
* DESCRIPTION: Little anim of jumping balls
* this program has been compiled with Maxon C++ 3.0
* AUTHORS: Andreas Heumann, Mike Hesser
* BUGS: none
* TO DO:
* HISTORY: DATE NAME COMMENT
* 10.08.95 ah first release
***************/
#include <exec/memory.h>
#include <rexx/storage.h>
#include <rexx/rxslib.h>
#include <exec/types.h>
#include <pragma/exec_lib.h>
#include <pragma/rexxsyslib_lib.h>
#include <fstream.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <time.h>
#define c_Radius 1
#define g 15
struct Library *RexxSysBase = NULL;
static struct MsgPort *HostPort;
static struct MsgPort *ReplyPort = NULL;
static int msgs = 0; // remaining messages
#define RED 0
#define GREEN 1
#define BLUE 2
typedef struct tSphere
{
float x,y,z;
float m;
float vx,vy,vz;
char color;
};
struct tSphere *SpList = NULL;
/*************
* FUNCTION: SendRexxMsg
* VERSION: 1.0 08.05.1995
* DESCRIPTION: Sends a single command to Rexx host
* INPUT: HostPort pointer to host message port
* SingleMsg message to send
* OUTPUT: none
* HISTORY: DATE NAME COMMENT
* 08.05.95 ah first release
*************/
void SendRexxMsg(struct MsgPort *HostPort, char *SingleMsg)
{
struct RexxMsg *RexxMessage;
// free previous messages
while(RexxMessage = (struct RexxMsg*)GetMsg(ReplyPort))
{
// Remove Rexx message
ClearRexxMsg(RexxMessage,1);
DeleteRexxMsg(RexxMessage);
msgs--;
}
// Valid pointers given?
if(HostPort && SingleMsg)
{
// Create a Rexx message
RexxMessage = (struct RexxMsg *)CreateRexxMsg(ReplyPort,"",NULL);
if(RexxMessage)
{
RexxMessage->rm_Args[0] = CreateArgstring(SingleMsg, strlen(SingleMsg));
RexxMessage->rm_Action = RXFF_RESULT;
// Send packet
PutMsg(HostPort,(struct Message *)RexxMessage);
msgs++;
}
}
}
/*************
* FUNCTION: InitObjects
* VERSION: 1.0 08.05.1995
* DESCRIPTION: Initalize sphere positions and attributes
* INPUT: pics amount of pics
* spheres amount of spheres
* OUTPUT: none
* HISTORY: DATE NAME COMMENT
* 08.05.95 ah first release
*************/
void InitObjects(int pics,int spheres)
{
int i;
for(i=0; i<spheres; i++)
{
SpList[i].x = float(rand())/RAND_MAX*50+35;
SpList[i].y = float(rand())/RAND_MAX*50+10;
SpList[i].z = -(float(rand())/RAND_MAX*50+150);
SpList[i].m = 1;
SpList[i].vx = 0;
SpList[i].vy = float(rand())/RAND_MAX*4-2;
SpList[i].vz = 40/pics;
if(rand()<RAND_MAX/3)
{
SpList[i].color = RED;
}
else
{
if(rand()<RAND_MAX/2)
{
SpList[i].color = GREEN;
}
else
{
SpList[i].color = BLUE;
}
}
}
}
/*************
* FUNCTION: MoveObjects
* VERSION: 1.0 08.05.1995
* DESCRIPTION: Move spheres to new position
* INPUT: pics amount of pics
* spheres amount of spheres
* OUTPUT: none
* HISTORY: DATE NAME COMMENT
* 08.05.95 ah first release
*************/
void MoveObjects(int pics,int spheres)
{
int i;
for(i=0; i<spheres; i++)
{
SpList[i].x += SpList[i].vx*(40/pics);
SpList[i].y += SpList[i].vy*(40/pics);
SpList[i].z += SpList[i].vz*(40/pics);
SpList[i].vy -= g*.1;
if(SpList[i].y <= c_Radius)
{
SpList[i].vy = -SpList[i].vy;
}
}
}
/*************
* FUNCTION: SaveObjects
* VERSION: 1.0 08.05.1995
* DESCRIPTION: Send scene via ARexx to RayStorm
* INPUT: pic number of picture
* spheres amount of spheres
* OUTPUT: none
* HISTORY: DATE NAME COMMENT
* 08.05.95 ah first release
*************/
void SaveObjects(int pic,int spheres)
{
int i;
char buffer[256];
sprintf(buffer, "SETCAMERA 90 35 0 %2.2f 35 %2.2f 0 1 0 56.25 45", SpList[0].x, SpList[0].z);
SendRexxMsg(HostPort, buffer);
SendRexxMsg(HostPort, "POINTLIGHT 150 400 50 255 255 255 SHADOW");
SendRexxMsg(HostPort, "NEWSURFACE CHECKER");
SendRexxMsg(HostPort, "REFLECT 50 50 50");
SendRexxMsg(HostPort, "DIFFUSE 50 50 200");
SendRexxMsg(HostPort, "AMBIENT 50 50 200");
// SendRexxMsg(HostPort, "IMTEXTURE '/textures/checker.itx 0 1 0 0 0 0 10 10 10 23 23 90");
SendRexxMsg(HostPort, "PLANE CHECKER");
SendRexxMsg(HostPort, "NEWSURFACE RED");
SendRexxMsg(HostPort, "DIFFUSE 255 0 0");
SendRexxMsg(HostPort, "AMBIENT 255 0 0");
SendRexxMsg(HostPort, "NEWSURFACE GREEN");
SendRexxMsg(HostPort, "DIFFUSE 0 255 0");
SendRexxMsg(HostPort, "AMBIENT 0 255 0");
SendRexxMsg(HostPort, "NEWSURFACE BLUE");
SendRexxMsg(HostPort, "DIFFUSE 0 0 255");
SendRexxMsg(HostPort, "AMBIENT 0 0 255");
for(i=0; i<spheres; i++)
{
switch(SpList[i].color)
{
case RED:
sprintf(buffer, "SPHERE RED %2.2f %2.2f %2.2f 1", SpList[i].x, SpList[i].y, SpList[i].z);
SendRexxMsg(HostPort, buffer);
break;
case GREEN:
sprintf(buffer, "SPHERE GREEN %2.2f %2.2f %2.2f 1", SpList[i].x, SpList[i].y, SpList[i].z);
SendRexxMsg(HostPort, buffer);
break;
case BLUE:
sprintf(buffer, "SPHERE BLUE %2.2f %2.2f %2.2f 1", SpList[i].x, SpList[i].y, SpList[i].z);
SendRexxMsg(HostPort, buffer);
break;
}
}
SendRexxMsg(HostPort, "STARTRENDER");
sprintf(buffer, "SAVEPIC pics/pic.%04d", pic);
SendRexxMsg(HostPort, buffer);
SendRexxMsg(HostPort, "CLEANUP");
}
/*************
* FUNCTION: cleanup
* VERSION: 1.0 08.05.1995
* DESCRIPTION: close libs ...
* INPUT: none
* OUTPUT: none
* HISTORY: DATE NAME COMMENT
* 08.05.95 ah first release
*************/
void cleanup()
{
struct RexxMsg *RexxMessage;
if(ReplyPort)
{
// free messages
while(msgs)
{
// Wait for message
WaitPort(ReplyPort);
// get messages
while(RexxMessage = (struct RexxMsg*)GetMsg(ReplyPort))
{
// Remove Rexx message
ClearRexxMsg(RexxMessage,1);
DeleteRexxMsg(RexxMessage);
msgs--;
}
}
// Free reply port signal bit
FreeSignal(ReplyPort->mp_SigBit);
// Free the replyport itself
FreeMem(ReplyPort,sizeof(struct MsgPort));
}
if (RexxSysBase)
CloseLibrary(RexxSysBase);
if(SpList)
delete [ ] SpList;
exit(0);
}
/*************
* FUNCTION: Init
* VERSION: 1.0 08.05.1995
* DESCRIPTION: Open libs, init ports
* INPUT: spheres amount of spheres
* OUTPUT: none
* HISTORY: DATE NAME COMMENT
* 08.05.95 ah first release
*************/
void Init(int spheres)
{
// is raystrom already active ?
HostPort = (struct MsgPort *)FindPort("RAYSTORM");
if(!HostPort)
{
cout << "Raystorm is not running please start it\n";
cleanup();
}
// Allocate a reply port
ReplyPort = (struct MsgPort *)AllocMem(sizeof(struct MsgPort),MEMF_PUBLIC | MEMF_CLEAR);
if(ReplyPort)
{
ReplyPort->mp_SigBit = AllocSignal(-1);
if(ReplyPort->mp_SigBit != -1)
{
ReplyPort->mp_Node.ln_Type = NT_MSGPORT;
ReplyPort->mp_Flags = PA_SIGNAL;
ReplyPort->mp_SigTask = FindTask(NULL);
ReplyPort->mp_MsgList.lh_Head = (struct Node *)&ReplyPort->mp_MsgList.lh_Tail;
ReplyPort->mp_MsgList.lh_Tail = 0;
ReplyPort->mp_MsgList.lh_TailPred = (struct Node *)&ReplyPort->mp_MsgList.lh_Head;
}
}
// Open rexxsyslib library.
RexxSysBase = OpenLibrary("rexxsyslib.library",0L);
if (!RexxSysBase)
{
cout << "Can't open rexxsyslib.library\n";
cleanup();
}
SpList = new tSphere[spheres];
if(!SpList)
{
cout << "Not enough memory\n";
cleanup();
}
srand(time(0));
}
void main(int argc, char *argv[])
{
int i,pics;
int spheres = 10;
// Parse arguments
if(argc != 2 && argc != 3)
{
cout << "Sphereanim V1.0 1995 by Andreas Heumann" << endl;
cout << "Usage: sphanim picnum [spheres]" << endl;
cout << " picnum - amount of pictures to create" << endl;
cout << " spheres - amount of spheres" << endl;
cleanup();
}
sscanf(argv[1],"%d",&pics);
if(pics<2)
{
cout << "I need at least two pictures to create." << endl;
cleanup();
}
if(argc == 3)
{
sscanf(argv[2],"%d",&spheres);
if(pics<1)
{
cout << "I need at least one sphere." << endl;
cleanup();
}
}
Init(spheres);
InitObjects(pics,spheres);
for(i=0; i<pics; i++)
{
SendRexxMsg(HostPort, "SETSCREEN 160 128");
SendRexxMsg(HostPort, "SETWORLD 0 0 0 0 0 0");
MoveObjects(pics,spheres);
SaveObjects(i+1,spheres);
}
cleanup();
}