1
0
Fork 0

Removed versioning information from sources

This commit is contained in:
Michaël Lemaire 2014-02-16 14:34:15 +01:00
parent 837451bc29
commit b9c3a15057
53 changed files with 5111 additions and 7641 deletions

View file

@ -1,80 +1,3 @@
/*
* $Id: 3dutils.h,v 1.22 2002/07/22 11:50:26 jkaarlas Exp $
*
*
* $Log: 3dutils.h,v $
* Revision 1.22 2002/07/22 11:50:26 jkaarlas
* naama
*
* Revision 1.21 2002/07/22 11:44:16 jkaarlas
* naama
*
* Revision 1.20 2002/07/19 20:33:28 msell
* #pragma once -> #ifndef
*
* Revision 1.19 2002/07/19 18:59:46 msell
* Alkuhommaa ja säätöä
*
* Revision 1.18 2002/07/19 14:05:51 msell
* Damagetextuurit näkyy
*
* Revision 1.17 2002/07/19 12:28:29 msell
* 2D-mode
*
* Revision 1.16 2002/07/17 20:32:47 msell
* Detail-optio toimii
*
* Revision 1.15 2002/07/17 19:06:39 jkaarlas
* skyboxin keskitys
*
* Revision 1.14 2002/07/17 16:40:33 msell
* Resoluution vaihto
*
* Revision 1.13 2002/07/16 17:16:34 msell
* Fontit ja valikot
*
* Revision 1.12 2002/07/16 00:42:43 msell
* Uusia skyboxeja ja areenan säätöä
*
* Revision 1.11 2002/07/15 22:03:22 msell
* MultiAppearance
*
* Revision 1.10 2002/07/15 21:42:58 msell
* Skybox-testi
*
* Revision 1.9 2002/07/15 15:22:07 msell
* Parantelua
*
* Revision 1.8 2002/07/14 21:27:48 jkaarlas
* uudet tekstuurit
*
* Revision 1.7 2002/07/14 21:22:40 jkaarlas
* skybox ja ukkojen säätö
*
* Revision 1.6 2002/06/20 22:50:12 msell
* Meshit
*
* Revision 1.5 2002/06/17 19:58:08 msell
* #includeiden parantelua
*
* Revision 1.4 2002/06/16 01:04:58 jkaarlas
* tulipa säädettyä includejen kanssa. oon tod.näk. eri mieltä aamulla
*
* Revision 1.3 2002/06/05 23:55:46 msell
* Pallo
*
* Revision 1.2 2002/06/04 16:28:32 msell
* #pragma once
*
* Revision 1.1 2002/06/03 23:06:38 msell
* no message
*
*
*
* $Date: 2002/07/22 11:50:26 $
*
*/
#ifndef __3DUTILS_H_INCLUDED__ #ifndef __3DUTILS_H_INCLUDED__
#define __3DUTILS_H_INCLUDED__ #define __3DUTILS_H_INCLUDED__
@ -100,11 +23,11 @@
extern int SKYBOX; extern int SKYBOX;
typedef struct{ typedef struct{
float x,y; float x,y;
} point2d; } point2d;
typedef struct{ typedef struct{
float x,y,z; float x,y,z;
} point3d; } point3d;
extern Texture *flaretexture; extern Texture *flaretexture;

View file

@ -1,41 +1,3 @@
/*
* $Id: appearance.cpp,v 1.9 2002/07/15 22:03:23 msell Exp $
*
*
* $Log: appearance.cpp,v $
* Revision 1.9 2002/07/15 22:03:23 msell
* MultiAppearance
*
* Revision 1.8 2002/06/24 14:12:15 msell
* Nyt toimii sphere -> mesh -törmäykset, ihan tosi
*
* Revision 1.7 2002/06/20 00:21:01 jkaarlas
* materiaali- ja tekstuurihommia edistetty
*
* Revision 1.6 2002/06/17 20:49:04 msell
* free -> SDL_FreeSurface
*
* Revision 1.5 2002/06/16 01:04:58 jkaarlas
* tulipa säädettyä includejen kanssa. oon tod.näk. eri mieltä aamulla
*
* Revision 1.4 2002/06/05 23:55:46 msell
* Pallo
*
* Revision 1.3 2002/06/03 23:20:43 msell
* no message
*
* Revision 1.2 2002/06/03 23:06:38 msell
* no message
*
* Revision 1.1 2002/06/02 16:57:37 msell
* Objektirakenteen pohja
*
*
*
* $Date: 2002/07/15 22:03:23 $
*
*/
#include "main.h" #include "main.h"
@ -53,19 +15,19 @@ void Appearance::prepare(void){
/*BoxAppearance::BoxAppearance(void){ /*BoxAppearance::BoxAppearance(void){
setDimension(-1, 1, -1, 1, -1, 1); setDimension(-1, 1, -1, 1, -1, 1);
} }
BoxAppearance::setDimension(float x1, float x2, float y1, float y2, float z1, float z2){ BoxAppearance::setDimension(float x1, float x2, float y1, float y2, float z1, float z2){
if (x1 > x2) swapFloat(&x1, &x2); if (x1 > x2) swapFloat(&x1, &x2);
if (y1 > y2) swapFloat(&y1, &y2); if (y1 > y2) swapFloat(&y1, &y2);
if (z1 > z2) swapFloat(&z1, &z2); if (z1 > z2) swapFloat(&z1, &z2);
this->x1 = x1; this->x1 = x1;
this->x2 = x2; this->x2 = x2;
this->y1 = y1; this->y1 = y1;
this->y2 = y2; this->y2 = y2;
this->z1 = z1; this->z1 = z1;
this->z2 = z2; this->z2 = z2;
} }
void BoxAppearance::draw(void){ void BoxAppearance::draw(void){
@ -74,43 +36,43 @@ void BoxAppearance::draw(void){
glBegin(GL_QUADS); glBegin(GL_QUADS);
//Front Face //Front Face
glNormal3f(0, 0, 1); glNormal3f(0, 0, 1);
glVertex3f(x1, y1, z2); glVertex3f(x1, y1, z2);
glVertex3f(x2, y1, z2); glVertex3f(x2, y1, z2);
glVertex3f(x2, y2, z2); glVertex3f(x2, y2, z2);
glVertex3f(x1, y2, z2); glVertex3f(x1, y2, z2);
// Back Face // Back Face
glNormal3f(0, 0, -1); glNormal3f(0, 0, -1);
glVertex3f(x1, y1, z1); glVertex3f(x1, y1, z1);
glVertex3f(x1, y2, z1); glVertex3f(x1, y2, z1);
glVertex3f(x2, y2, z1); glVertex3f(x2, y2, z1);
glVertex3f(x2, y1, z1); glVertex3f(x2, y1, z1);
// Top Face // Top Face
glNormal3f(0, 1, 0); glNormal3f(0, 1, 0);
glVertex3f(x1, y2, z1); glVertex3f(x1, y2, z1);
glVertex3f(x1, y2, z2); glVertex3f(x1, y2, z2);
glVertex3f(x2, y2, z2); glVertex3f(x2, y2, z2);
glVertex3f(x2, y2, z1); glVertex3f(x2, y2, z1);
// Bottom Face // Bottom Face
glNormal3f(0, -1, 0); glNormal3f(0, -1, 0);
glVertex3f(x1, y1, z1); glVertex3f(x1, y1, z1);
glVertex3f(x2, y1, z1); glVertex3f(x2, y1, z1);
glVertex3f(x2, y1, z2); glVertex3f(x2, y1, z2);
glVertex3f(x1, y1, z2); glVertex3f(x1, y1, z2);
// Right face // Right face
glNormal3f(x2, 0, 0); glNormal3f(x2, 0, 0);
glVertex3f(x2, y1, z1); glVertex3f(x2, y1, z1);
glVertex3f(x2, y2, z1); glVertex3f(x2, y2, z1);
glVertex3f(x2, y2, z2); glVertex3f(x2, y2, z2);
glVertex3f(x2, y1, z2); glVertex3f(x2, y1, z2);
// Left Face // Left Face
glNormal3f(x1, 0, 0); glNormal3f(x1, 0, 0);
glVertex3f(x1, y1, z1); glVertex3f(x1, y1, z1);
glVertex3f(x1, y1, z2); glVertex3f(x1, y1, z2);
glVertex3f(x1, y2, z2); glVertex3f(x1, y2, z2);
glVertex3f(x1, y2, z1); glVertex3f(x1, y2, z1);
glEnd(); glEnd();
this->material.disable(); this->material.disable();
}*/ }*/
@ -128,28 +90,28 @@ void Appearance::setMaterial(Material matsku){
MultiAppearance::MultiAppearance(void){ MultiAppearance::MultiAppearance(void){
appearances = NULL; appearances = NULL;
} }
void MultiAppearance::addAppearance(Appearance *appearance){ void MultiAppearance::addAppearance(Appearance *appearance){
appearancelist *node = new appearancelist; appearancelist *node = new appearancelist;
node->data = appearance; node->data = appearance;
node->next = appearances; node->next = appearances;
appearances = node; appearances = node;
} }
void MultiAppearance::prepare(void){ void MultiAppearance::prepare(void){
appearancelist *node = appearances; appearancelist *node = appearances;
while (node != NULL){ while (node != NULL){
node->data->prepare(); node->data->prepare();
node = node->next; node = node->next;
} }
} }
void MultiAppearance::draw(void){ void MultiAppearance::draw(void){
appearancelist *node = appearances; appearancelist *node = appearances;
while (node != NULL){ while (node != NULL){
node->data->draw(); node->data->draw();
node = node->next; node = node->next;
} }
} }

View file

@ -1,47 +1,3 @@
/*
* $Id: appearance.h,v 1.11 2002/07/19 20:33:28 msell Exp $
*
*
* $Log: appearance.h,v $
* Revision 1.11 2002/07/19 20:33:28 msell
* #pragma once -> #ifndef
*
* Revision 1.10 2002/07/15 22:03:23 msell
* MultiAppearance
*
* Revision 1.9 2002/07/07 17:53:21 msell
* Legoukon alku
*
* Revision 1.8 2002/06/24 14:12:15 msell
* Nyt toimii sphere -> mesh -törmäykset, ihan tosi
*
* Revision 1.7 2002/06/20 00:21:01 jkaarlas
* materiaali- ja tekstuurihommia edistetty
*
* Revision 1.6 2002/06/17 20:49:04 msell
* free -> SDL_FreeSurface
*
* Revision 1.5 2002/06/17 19:58:08 msell
* #includeiden parantelua
*
* Revision 1.4 2002/06/04 16:28:32 msell
* #pragma once
*
* Revision 1.3 2002/06/03 23:20:43 msell
* no message
*
* Revision 1.2 2002/06/03 23:06:38 msell
* no message
*
* Revision 1.1 2002/06/02 16:57:37 msell
* Objektirakenteen pohja
*
*
*
* $Date: 2002/07/19 20:33:28 $
*
*/
#ifndef __APPEARANCE_H_INCLUDED__ #ifndef __APPEARANCE_H_INCLUDED__
#define __APPEARANCE_H_INCLUDED__ #define __APPEARANCE_H_INCLUDED__
@ -62,26 +18,26 @@ public:
Material* getMaterial(void); Material* getMaterial(void);
void setMaterial(Material mat); void setMaterial(Material mat);
virtual void prepare(void); virtual void prepare(void);
virtual void draw(void) = 0; virtual void draw(void) = 0;
}; };
struct appearancelist{ struct appearancelist{
Appearance *data; Appearance *data;
appearancelist *next; appearancelist *next;
}; };
class MultiAppearance : public Appearance{ class MultiAppearance : public Appearance{
private: private:
appearancelist *appearances; appearancelist *appearances;
public: public:
MultiAppearance(void); MultiAppearance(void);
void addAppearance(Appearance *appearance); void addAppearance(Appearance *appearance);
void prepare(void); void prepare(void);
void draw(void); void draw(void);
}; };
#endif #endif

View file

@ -1,42 +1,3 @@
/*
* $Id: audio.cpp,v 1.9 2002/07/21 15:03:11 msell Exp $
*
*
* $Log: audio.cpp,v $
* Revision 1.9 2002/07/21 15:03:11 msell
* Äänet disabloitu
*
* Revision 1.8 2002/07/19 18:59:46 msell
* Alkuhommaa ja säätöä
*
* Revision 1.7 2002/07/18 23:05:31 msell
* Partikkelit ja kakkospelaajan liike
*
* Revision 1.6 2002/06/02 16:57:37 msell
* Objektirakenteen pohja
*
* Revision 1.5 2002/05/19 13:40:19 msell
* Säätöä
*
* Revision 1.4 2002/05/18 12:29:35 msell
* Valot ja äänijärjestelmän parantelua
*
* Revision 1.3 2002/05/15 21:07:23 msell
* Äänisäätöä
*
* Revision 1.2 2002/05/15 15:21:00 msell
* Äänisäätöä
*
* Revision 1.1 2002/05/15 14:36:38 msell
* Yksinkertainen SDL-runko (Kääntyy toistaiseksi vain windowsissa).
* Mukana myös musiikinsoitto fmodilla.
*
*
*
* $Date: 2002/07/21 15:03:11 $
*
*/
#include "main.h" #include "main.h"
#include <string.h> #include <string.h>
@ -51,259 +12,259 @@
struct soundlist{ struct soundlist{
Sound *sound; Sound *sound;
soundlist *next; soundlist *next;
}; };
soundlist *allsounds = NULL; soundlist *allsounds = NULL;
Sound::Sound(Sound *source){ Sound::Sound(Sound *source){
memcpy(this, source, sizeof(Sound)); memcpy(this, source, sizeof(Sound));
soundlist *node = new soundlist; soundlist *node = new soundlist;
node->sound = this; node->sound = this;
node->next = allsounds; node->next = allsounds;
allsounds = node; allsounds = node;
} }
Sound::Sound(char *filename){ Sound::Sound(char *filename){
load(filename, SOUNDTYPE_AUTODETECT, false); load(filename, SOUNDTYPE_AUTODETECT, false);
//printf("%s: %p, %p, %p, %p\n", filename, this, stream, sample, module); //printf("%s: %p, %p, %p, %p\n", filename, this, stream, sample, module);
} }
Sound::Sound(char *filename, int type){ Sound::Sound(char *filename, int type){
load(filename, type, false); load(filename, type, false);
} }
Sound::Sound(char *filename, bool loops){ Sound::Sound(char *filename, bool loops){
load(filename, SOUNDTYPE_AUTODETECT, loops); load(filename, SOUNDTYPE_AUTODETECT, loops);
//printf("%s: %p, %p, %p, %p\n", filename, this, stream, sample, module); //printf("%s: %p, %p, %p, %p\n", filename, this, stream, sample, module);
} }
Sound::Sound(char *filename, int type, bool loops){ Sound::Sound(char *filename, int type, bool loops){
load(filename, type, loops); load(filename, type, loops);
} }
bool endsWith(char *str1, char *str2){ bool endsWith(char *str1, char *str2){
char *str3 = str1 + strlen(str1) - strlen(str2); char *str3 = str1 + strlen(str1) - strlen(str2);
#ifdef WIN32 #ifdef WIN32
if (stricmp(str3, str2)) return false; if (stricmp(str3, str2)) return false;
#else #else
if (strcasecmp(str3, str2)) return false; if (strcasecmp(str3, str2)) return false;
#endif #endif
else return true; else return true;
} }
void Sound::load(char *filename, int type, bool loops){ void Sound::load(char *filename, int type, bool loops){
this->filename = filename; this->filename = filename;
if (type == SOUNDTYPE_AUTODETECT){ if (type == SOUNDTYPE_AUTODETECT){
if (endsWith(filename, "mp3") || if (endsWith(filename, "mp3") ||
endsWith(filename, "mp2") || endsWith(filename, "mp2") ||
endsWith(filename, "ogg")) type = SOUNDTYPE_STREAM; endsWith(filename, "ogg")) type = SOUNDTYPE_STREAM;
if (endsWith(filename, "wav") || if (endsWith(filename, "wav") ||
endsWith(filename, "raw")) type = SOUNDTYPE_SAMPLE; endsWith(filename, "raw")) type = SOUNDTYPE_SAMPLE;
if (endsWith(filename, "s3m") || if (endsWith(filename, "s3m") ||
endsWith(filename, "xm") || endsWith(filename, "xm") ||
endsWith(filename, "it") || endsWith(filename, "it") ||
endsWith(filename, "mid") || endsWith(filename, "mid") ||
endsWith(filename, "rmi") || endsWith(filename, "rmi") ||
endsWith(filename, "sgr") || endsWith(filename, "sgr") ||
endsWith(filename, "mod")) type = SOUNDTYPE_MODULE; endsWith(filename, "mod")) type = SOUNDTYPE_MODULE;
} }
#ifdef AUDIO_FMOD #ifdef AUDIO_FMOD
sample = NULL; sample = NULL;
module = NULL; module = NULL;
stream = NULL; stream = NULL;
this->type = type; this->type = type;
if (type == SOUNDTYPE_MODULE){ if (type == SOUNDTYPE_MODULE){
module = FMUSIC_LoadSong(filename); module = FMUSIC_LoadSong(filename);
this->loops = false; this->loops = false;
} else if (type == SOUNDTYPE_SAMPLE){ } else if (type == SOUNDTYPE_SAMPLE){
if (loops){ if (loops){
sample = FSOUND_Sample_Load(FSOUND_FREE, filename, FSOUND_LOOP_NORMAL, 0); sample = FSOUND_Sample_Load(FSOUND_FREE, filename, FSOUND_LOOP_NORMAL, 0);
FSOUND_Sample_SetLoopMode(sample, FSOUND_LOOP_NORMAL); FSOUND_Sample_SetLoopMode(sample, FSOUND_LOOP_NORMAL);
} else{ } else{
sample = FSOUND_Sample_Load(FSOUND_FREE, filename, FSOUND_LOOP_OFF, 0); sample = FSOUND_Sample_Load(FSOUND_FREE, filename, FSOUND_LOOP_OFF, 0);
FSOUND_Sample_SetLoopMode(sample, FSOUND_LOOP_OFF); FSOUND_Sample_SetLoopMode(sample, FSOUND_LOOP_OFF);
} }
this->loops = loops; this->loops = loops;
} else if (type == SOUNDTYPE_STREAM){ } else if (type == SOUNDTYPE_STREAM){
if (loops){ if (loops){
stream = FSOUND_Stream_OpenFile(filename, FSOUND_LOOP_NORMAL, 0); stream = FSOUND_Stream_OpenFile(filename, FSOUND_LOOP_NORMAL, 0);
} else{ } else{
stream = FSOUND_Stream_OpenFile(filename, FSOUND_LOOP_OFF, 0); stream = FSOUND_Stream_OpenFile(filename, FSOUND_LOOP_OFF, 0);
} }
this->loops = loops; this->loops = loops;
} }
#endif #endif
stopcallback = NULL; stopcallback = NULL;
soundlist *node = new soundlist; soundlist *node = new soundlist;
node->sound = this; node->sound = this;
node->next = allsounds; node->next = allsounds;
allsounds = node; allsounds = node;
minduration = 0; minduration = 0;
setVolume(1.0); setVolume(1.0);
} }
bool Sound::play(){ bool Sound::play(){
//printf("Playing %s: %p, %p, %p, %p\n", filename, this, stream, sample, module); //printf("Playing %s: %p, %p, %p, %p\n", filename, this, stream, sample, module);
if (minduration > 0) return false; if (minduration > 0) return false;
running = true; running = true;
finished = false; finished = false;
fademode = SOUND_FADENONE; fademode = SOUND_FADENONE;
minduration = 0; minduration = 0;
#ifdef AUDIO_FMOD #ifdef AUDIO_FMOD
if (type == SOUNDTYPE_MODULE){ if (type == SOUNDTYPE_MODULE){
FMUSIC_PlaySong(module); FMUSIC_PlaySong(module);
FMUSIC_SetMasterVolume(module, volume*256); FMUSIC_SetMasterVolume(module, volume*256);
} else if (type == SOUNDTYPE_SAMPLE){ } else if (type == SOUNDTYPE_SAMPLE){
channel = FSOUND_PlaySound(FSOUND_FREE, sample); channel = FSOUND_PlaySound(FSOUND_FREE, sample);
FSOUND_SetVolume(channel, volume*256); FSOUND_SetVolume(channel, volume*256);
if (!loops){ if (!loops){
running = false; running = false;
finished = false; finished = false;
} }
} else if (type == SOUNDTYPE_STREAM){ } else if (type == SOUNDTYPE_STREAM){
channel = FSOUND_Stream_Play(FSOUND_FREE, stream); channel = FSOUND_Stream_Play(FSOUND_FREE, stream);
FSOUND_SetVolume(channel, volume*256); FSOUND_SetVolume(channel, volume*256);
} }
#endif #endif
//printf("Done: %f\n", volume); //printf("Done: %f\n", volume);
return true; return true;
} }
void Sound::play(int minduration){ void Sound::play(int minduration){
if (play()) this->minduration = minduration; if (play()) this->minduration = minduration;
} }
void Sound::stop(){ void Sound::stop(){
#ifdef AUDIO_FMOD #ifdef AUDIO_FMOD
if (type == SOUNDTYPE_MODULE){ if (type == SOUNDTYPE_MODULE){
FMUSIC_StopSong(module); FMUSIC_StopSong(module);
} else if (type == SOUNDTYPE_SAMPLE){ } else if (type == SOUNDTYPE_SAMPLE){
FSOUND_StopSound(channel); FSOUND_StopSound(channel);
} else if (type == SOUNDTYPE_STREAM){ } else if (type == SOUNDTYPE_STREAM){
FSOUND_Stream_Stop(stream); FSOUND_Stream_Stop(stream);
} }
#endif #endif
} }
void Sound::setVolume(float volume){ void Sound::setVolume(float volume){
//printf("Volume %s: %f\n", filename, volume); //printf("Volume %s: %f\n", filename, volume);
#ifdef AUDIO_FMOD #ifdef AUDIO_FMOD
if (type == SOUNDTYPE_MODULE){ if (type == SOUNDTYPE_MODULE){
FMUSIC_SetMasterVolume(module, volume*256); FMUSIC_SetMasterVolume(module, volume*256);
} else if (type == SOUNDTYPE_SAMPLE){ } else if (type == SOUNDTYPE_SAMPLE){
FSOUND_SetVolume(channel, volume*256); FSOUND_SetVolume(channel, volume*256);
} else if (type == SOUNDTYPE_STREAM){ } else if (type == SOUNDTYPE_STREAM){
FSOUND_SetVolume(channel, volume*256); FSOUND_SetVolume(channel, volume*256);
} }
#endif #endif
this->volume = volume; this->volume = volume;
} }
#ifdef AUDIO_FMOD #ifdef AUDIO_FMOD
signed char streamendcallback(FSOUND_STREAM *stream, void *buff, int len, int param){ signed char streamendcallback(FSOUND_STREAM *stream, void *buff, int len, int param){
Sound *sound = (Sound *)param; Sound *sound = (Sound *)param;
sound->setFinished(); sound->setFinished();
return true; return true;
} }
#endif #endif
void Sound::setStopCallback(STOPCALLBACK callback){ void Sound::setStopCallback(STOPCALLBACK callback){
stopcallback = callback; stopcallback = callback;
#ifdef AUDIO_FMOD #ifdef AUDIO_FMOD
if (type == SOUNDTYPE_MODULE){ if (type == SOUNDTYPE_MODULE){
} else if (type == SOUNDTYPE_SAMPLE){ } else if (type == SOUNDTYPE_SAMPLE){
//NOT SUPPORTED //NOT SUPPORTED
} else if (type == SOUNDTYPE_STREAM){ } else if (type == SOUNDTYPE_STREAM){
FSOUND_Stream_SetEndCallback(stream, streamendcallback, (int)this); FSOUND_Stream_SetEndCallback(stream, streamendcallback, (int)this);
} }
#endif #endif
} }
void Sound::setFinished(void){ void Sound::setFinished(void){
finished = true; finished = true;
} }
bool Sound::isFinished(void){ bool Sound::isFinished(void){
#ifdef AUDIO_FMOD #ifdef AUDIO_FMOD
if (type == SOUNDTYPE_MODULE){ if (type == SOUNDTYPE_MODULE){
if (FMUSIC_IsFinished(module)) return true; if (FMUSIC_IsFinished(module)) return true;
} else if (type == SOUNDTYPE_SAMPLE){ } else if (type == SOUNDTYPE_SAMPLE){
//NOT SUPPORTED //NOT SUPPORTED
} else if (type == SOUNDTYPE_STREAM){ } else if (type == SOUNDTYPE_STREAM){
if (finished) return true; if (finished) return true;
} }
#endif #endif
return false; return false;
} }
void Sound::update(void){ void Sound::update(void){
if (running){ if (running){
if (isFinished()){ if (isFinished()){
running = false; running = false;
if (stopcallback != NULL) stopcallback(this); if (stopcallback != NULL) stopcallback(this);
} else{ } else{
if (fademode == SOUND_FADEIN){ if (fademode == SOUND_FADEIN){
if (fadepos < fadetarget){ if (fadepos < fadetarget){
fadepos++; fadepos++;
setVolume((float)fadepos/fadetarget); setVolume((float)fadepos/fadetarget);
} else fademode = SOUND_FADENONE; } else fademode = SOUND_FADENONE;
} }
if (fademode == SOUND_FADEOUT){ if (fademode == SOUND_FADEOUT){
if (fadepos < fadetarget){ if (fadepos < fadetarget){
fadepos++; fadepos++;
setVolume(1.0 - (float)fadepos/fadetarget); setVolume(1.0 - (float)fadepos/fadetarget);
} else{ } else{
fademode = SOUND_FADENONE; fademode = SOUND_FADENONE;
stop(); stop();
} }
} }
} }
} }
if (minduration > 0) minduration--; if (minduration > 0) minduration--;
} }
void Sound::fadeIn(int length){ void Sound::fadeIn(int length){
fademode = SOUND_FADEIN; fademode = SOUND_FADEIN;
fadepos = 0; fadepos = 0;
fadetarget = length; fadetarget = length;
} }
void Sound::fadeOut(int length){ void Sound::fadeOut(int length){
if (fademode == SOUND_FADEIN){ if (fademode == SOUND_FADEIN){
float percent = 1.0 - (float)fadepos/fadetarget; float percent = 1.0 - (float)fadepos/fadetarget;
fadepos = fadetarget * percent; fadepos = fadetarget * percent;
} }
fadepos = 0; fadepos = 0;
fadetarget = length; fadetarget = length;
fademode = SOUND_FADEOUT; fademode = SOUND_FADEOUT;
} }
void initAudio(void){ void initAudio(void){
#ifdef AUDIO_FMOD #ifdef AUDIO_FMOD
FSOUND_Init(44100, 32, 0); FSOUND_Init(44100, 32, 0);
#endif #endif
} }
void uninitAudio(void){ void uninitAudio(void){
#ifdef AUDIO_FMOD #ifdef AUDIO_FMOD
FSOUND_Close(); FSOUND_Close();
#endif #endif
} }
void updateAudio(void){ void updateAudio(void){
soundlist *node = allsounds; soundlist *node = allsounds;
while (node != NULL){ while (node != NULL){
Sound *sound = node->sound; Sound *sound = node->sound;
sound->update(); sound->update();
node = node->next; node = node->next;
} }
} }

View file

@ -1,54 +1,3 @@
/*
* $Id: audio.h,v 1.13 2002/07/21 15:12:16 msell Exp $
*
*
* $Log: audio.h,v $
* Revision 1.13 2002/07/21 15:12:16 msell
* Äänet enabloitu :)
*
* Revision 1.12 2002/07/21 15:03:12 msell
* Äänet disabloitu
*
* Revision 1.11 2002/07/19 20:33:28 msell
* #pragma once -> #ifndef
*
* Revision 1.10 2002/07/19 18:59:46 msell
* Alkuhommaa ja säätöä
*
* Revision 1.9 2002/07/18 23:05:31 msell
* Partikkelit ja kakkospelaajan liike
*
* Revision 1.8 2002/07/14 21:22:40 jkaarlas
* skybox ja ukkojen säätö
*
* Revision 1.7 2002/06/04 16:28:32 msell
* #pragma once
*
* Revision 1.6 2002/05/19 13:40:19 msell
* Säätöä
*
* Revision 1.5 2002/05/18 12:29:35 msell
* Valot ja äänijärjestelmän parantelua
*
* Revision 1.4 2002/05/16 18:41:16 msell
* Vektorifunctioita ja kamera
*
* Revision 1.3 2002/05/15 21:07:23 msell
* Äänisäätöä
*
* Revision 1.2 2002/05/15 15:21:00 msell
* Äänisäätöä
*
* Revision 1.1 2002/05/15 14:36:39 msell
* Yksinkertainen SDL-runko (Kääntyy toistaiseksi vain windowsissa).
* Mukana myös musiikinsoitto fmodilla.
*
*
*
* $Date: 2002/07/21 15:12:16 $
*
*/
#ifndef __AUDIO_H_INCLUDED__ #ifndef __AUDIO_H_INCLUDED__
#define __AUDIO_H_INCLUDED__ #define __AUDIO_H_INCLUDED__
@ -79,47 +28,47 @@ typedef void(* STOPCALLBACK)(Sound *sound);
class Sound{ class Sound{
private: private:
#ifdef AUDIO_FMOD #ifdef AUDIO_FMOD
int type; int type;
FMUSIC_MODULE *module; FMUSIC_MODULE *module;
FSOUND_STREAM *stream; FSOUND_STREAM *stream;
FSOUND_SAMPLE *sample; FSOUND_SAMPLE *sample;
int channel; int channel;
#endif #endif
bool loops; bool loops;
bool finished; bool finished;
bool running; bool running;
float volume; float volume;
STOPCALLBACK stopcallback; STOPCALLBACK stopcallback;
bool isFinished(void); bool isFinished(void);
int fadepos, fadetarget; int fadepos, fadetarget;
int fademode; int fademode;
int minduration; int minduration;
char *filename; char *filename;
public: public:
Sound(Sound *source); Sound(Sound *source);
Sound(char *filename); Sound(char *filename);
Sound(char *filename, int type); Sound(char *filename, int type);
Sound(char *filename, bool loops); Sound(char *filename, bool loops);
Sound(char *filename, int type, bool loops); Sound(char *filename, int type, bool loops);
void load(char *filename, int type, bool loops); void load(char *filename, int type, bool loops);
bool play(void); bool play(void);
//Plays sound for at least minduration frames until sound //Plays sound for at least minduration frames until sound
//can be played again. Doesn't prevent stopping of the sound //can be played again. Doesn't prevent stopping of the sound
void play(int minduration); void play(int minduration);
void stop(); void stop();
void setStopCallback(STOPCALLBACK callback); void setStopCallback(STOPCALLBACK callback);
void setVolume(float volume); void setVolume(float volume);
void fadeIn(int length); void fadeIn(int length);
void fadeOut(int length); void fadeOut(int length);
//Do not use methods below //Do not use methods below
void setFinished(void); void setFinished(void);
void update(void); void update(void);
}; };
void initAudio(void); void initAudio(void);

View file

@ -1,29 +1,3 @@
/*
* $Id: camera.cpp,v 1.5 2002/07/22 01:14:14 msell Exp $
*
*
* $Log: camera.cpp,v $
* Revision 1.5 2002/07/22 01:14:14 msell
* Lopetussysteemi
*
* Revision 1.4 2002/06/17 20:49:04 msell
* free -> SDL_FreeSurface
*
* Revision 1.3 2002/06/16 01:04:58 jkaarlas
* tulipa säädettyä includejen kanssa. oon tod.näk. eri mieltä aamulla
*
* Revision 1.2 2002/06/03 23:06:38 msell
* no message
*
* Revision 1.1 2002/05/16 18:42:07 msell
* Vektorifunctioita ja kamera
*
*
*
* $Date: 2002/07/22 01:14:14 $
*
*/
#include "main.h" #include "main.h"
#include "camera.h" #include "camera.h"
@ -31,83 +5,83 @@
#include "glapi.h" #include "glapi.h"
Camera::Camera(void){ Camera::Camera(void){
right = &matrix[0]; right = &matrix[0];
up = &matrix[3]; up = &matrix[3];
forward = &matrix[6]; forward = &matrix[6];
vectorSet(position, 0, 2, 2); vectorSet(position, 0, 2, 2);
vectorSet(target, 0, 0, 0); vectorSet(target, 0, 0, 0);
vectorSet(up, 0, 1, 0); vectorSet(up, 0, 1, 0);
calculateMatrix(); calculateMatrix();
} }
void Camera::setPosition(float position[3]){ void Camera::setPosition(float position[3]){
vectorCopy(this->position, position); vectorCopy(this->position, position);
} }
void Camera::setPosition(float x, float y, float z){ void Camera::setPosition(float x, float y, float z){
this->position[0] = x; this->position[0] = x;
this->position[1] = y; this->position[1] = y;
this->position[2] = z; this->position[2] = z;
} }
void Camera::getPosition(float *position){ void Camera::getPosition(float *position){
vectorCopy(position, this->position); vectorCopy(position, this->position);
} }
void Camera::setTarget(float target[3]){ void Camera::setTarget(float target[3]){
vectorCopy(this->target, target); vectorCopy(this->target, target);
} }
void Camera::getTarget(float *target){ void Camera::getTarget(float *target){
vectorCopy(target, this->target); vectorCopy(target, this->target);
} }
void Camera::setUp(float up[3]){ void Camera::setUp(float up[3]){
vectorCopy(this->up, up); vectorCopy(this->up, up);
} }
void Camera::getMatrix(float *matrix){ void Camera::getMatrix(float *matrix){
vectorCopy(&matrix[0], &this->matrix[0]); vectorCopy(&matrix[0], &this->matrix[0]);
vectorCopy(&matrix[3], &this->matrix[3]); vectorCopy(&matrix[3], &this->matrix[3]);
vectorCopy(&matrix[6], &this->matrix[6]); vectorCopy(&matrix[6], &this->matrix[6]);
} }
void Camera::moveRight(float amount){ void Camera::moveRight(float amount){
float movevector[3]; float movevector[3];
vectorScale(movevector, right, amount); vectorScale(movevector, right, amount);
vectorAdd(position, movevector); vectorAdd(position, movevector);
//vectorAdd(target, movevector); //vectorAdd(target, movevector);
calculateMatrix(); calculateMatrix();
} }
void Camera::moveUp(float amount){ void Camera::moveUp(float amount){
float movevector[3]; float movevector[3];
vectorScale(movevector, up, amount); vectorScale(movevector, up, amount);
vectorAdd(position, movevector); vectorAdd(position, movevector);
//vectorAdd(target, movevector); //vectorAdd(target, movevector);
calculateMatrix(); calculateMatrix();
} }
void Camera::moveForward(float amount){ void Camera::moveForward(float amount){
float movevector[3]; float movevector[3];
vectorScale(movevector, forward, amount); vectorScale(movevector, forward, amount);
vectorAdd(position, movevector); vectorAdd(position, movevector);
//vectorAdd(target, movevector); //vectorAdd(target, movevector);
calculateMatrix(); calculateMatrix();
} }
void Camera::glUpdate(void){ void Camera::glUpdate(void){
//glLoadIdentity(); //glLoadIdentity();
gluLookAt(position[0], position[1], position[2], gluLookAt(position[0], position[1], position[2],
target[0], target[1], target[2], target[0], target[1], target[2],
up[0], up[1], up[2]); up[0], up[1], up[2]);
} }
void Camera::calculateMatrix(void){ void Camera::calculateMatrix(void){
vectorSub(forward, target, position); vectorSub(forward, target, position);
vectorNormalize(forward); vectorNormalize(forward);
vectorCross(right, forward, up); vectorCross(right, forward, up);
} }

View file

@ -1,54 +1,31 @@
/*
* $Id: camera.h,v 1.4 2002/07/19 20:33:28 msell Exp $
*
*
* $Log: camera.h,v $
* Revision 1.4 2002/07/19 20:33:28 msell
* #pragma once -> #ifndef
*
* Revision 1.3 2002/06/04 16:28:32 msell
* #pragma once
*
* Revision 1.2 2002/06/03 23:06:38 msell
* no message
*
* Revision 1.1 2002/05/16 18:42:07 msell
* Vektorifunctioita ja kamera
*
*
*
* $Date: 2002/07/19 20:33:28 $
*
*/
#ifndef __CAMERA_H_INCLUDED__ #ifndef __CAMERA_H_INCLUDED__
#define __CAMERA_H_INCLUDED__ #define __CAMERA_H_INCLUDED__
class Camera{ class Camera{
private: private:
float position[3]; float position[3];
float target[3]; float target[3];
float matrix[9]; float matrix[9];
float *right, *up, *forward; float *right, *up, *forward;
void calculateMatrix(void); void calculateMatrix(void);
public: public:
Camera(void); Camera(void);
void setPosition(float position[3]); void setPosition(float position[3]);
void setPosition(float x, float y, float z); void setPosition(float x, float y, float z);
void getPosition(float *position); void getPosition(float *position);
void setTarget(float target[3]); void setTarget(float target[3]);
void getTarget(float *target); void getTarget(float *target);
void setUp(float up[3]); void setUp(float up[3]);
void getMatrix(float *matrix); void getMatrix(float *matrix);
void moveRight(float amount); void moveRight(float amount);
void moveUp(float amount); void moveUp(float amount);
void moveForward(float amount); void moveForward(float amount);
void glUpdate(void); void glUpdate(void);
}; };
#endif #endif

File diff suppressed because it is too large Load diff

View file

@ -1,61 +1,3 @@
/*
* $Id: collision.h,v 1.15 2002/07/19 20:33:28 msell Exp $
*
*
* $Log: collision.h,v $
* Revision 1.15 2002/07/19 20:33:28 msell
* #pragma once -> #ifndef
*
* Revision 1.14 2002/07/15 20:32:35 msell
* Uudet valot ja ulkoasun parantelua
*
* Revision 1.13 2002/07/14 21:40:43 msell
* Conflictit pois, liikkumiset (hyppy, kävely, lyönti), uusi areena
*
* Revision 1.12 2002/07/10 17:13:44 msell
* Törmäystarkastelun parantelua
*
* Revision 1.11 2002/07/08 22:53:38 msell
* Säätöä
*
* Revision 1.10 2002/07/08 18:28:47 msell
* Törmäystä ja ukkoja
*
* Revision 1.9 2002/07/07 23:05:22 msell
* Osien liimaaminen toisiinsa (kesken)
*
* Revision 1.8 2002/07/07 15:29:07 msell
* Törmäyksien parantelua
*
* Revision 1.7 2002/07/04 21:05:41 msell
* Se toimii!! =)
* Törmäystarkistukset siis
*
* Revision 1.6 2002/06/30 16:05:04 msell
* Törmäyksien parantelua, transformaatioita mukana
*
* Revision 1.5 2002/06/27 14:39:48 msell
* Toimiva maila :)
* Pyörivät kappaleet siis antaa liike-energiaa liikkuville kappaleille (ei toisin päin vielä)
*
* Revision 1.4 2002/06/27 00:08:04 msell
* Kimmotukset palloille myös pyöritettyihin mesheihin
*
* Revision 1.3 2002/06/23 20:12:19 msell
* Parempi törmäystarkistus palloista mesheihin
*
* Revision 1.2 2002/06/14 00:05:05 msell
* Törmäyssimulaatio kunnossa toivon mukaan
*
* Revision 1.1 2002/06/11 23:11:45 msell
* Törmäystarkistusta
*
*
*
* $Date: 2002/07/19 20:33:28 $
*
*/
#ifndef __COLLISION_H_INCLUDED__ #ifndef __COLLISION_H_INCLUDED__
#define __COLLISION_H_INCLUDED__ #define __COLLISION_H_INCLUDED__
@ -79,9 +21,9 @@ bool isCollisionLink(int source, int target);
class Contact{ class Contact{
public: public:
Object *object1, *object2; Object *object1, *object2;
float normal[3]; float normal[3];
float position[3]; float position[3];
}; };
extern Contact *contacts; extern Contact *contacts;
@ -91,7 +33,7 @@ extern int contactcount;
//Contact point is world-relative and must be transformed //Contact point is world-relative and must be transformed
//into coordinate system of both objects //into coordinate system of both objects
void addCollision(Object *source, Object *target, void addCollision(Object *source, Object *target,
float *normal, float *contactpoint); float *normal, float *contactpoint);
bool handleCollision(Contact *contact); bool handleCollision(Contact *contact);
bool handleLink(ObjectLink *link); bool handleLink(ObjectLink *link);

View file

@ -1,20 +1,3 @@
/*
* $Id: end.cpp,v 1.2 2002/07/22 11:40:26 msell Exp $
*
*
* $Log: end.cpp,v $
* Revision 1.2 2002/07/22 11:40:26 msell
* Loppukuvaan lattia
*
* Revision 1.1 2002/07/22 01:14:14 msell
* Lopetussysteemi
*
*
*
* $Date: 2002/07/22 11:40:26 $
*
*/
#include "main.h" #include "main.h"
#include <math.h> #include <math.h>
@ -26,7 +9,7 @@
#include "object.h" #include "object.h"
#include "appearance.h" #include "appearance.h"
#include "sphere.h" #include "sphere.h"
#include "vector.h" #include "vector.h"
#include "collision.h" #include "collision.h"
#include "utils.h" #include "utils.h"
#include "graphics.h" #include "graphics.h"
@ -48,114 +31,114 @@ Light endlight, endlight2;
BasicBlock *endfloor;// = new BasicBlock(20, 1, 15); BasicBlock *endfloor;// = new BasicBlock(20, 1, 15);
void initEnd(void){ void initEnd(void){
endlight.setColor(1, 1, 1); endlight.setColor(1, 1, 1);
endlight.setSpecular(1, 1, 1); endlight.setSpecular(1, 1, 1);
endlight.setPosition(-0.5, BLOCKHEIGHT*16, 0.5); endlight.setPosition(-0.5, BLOCKHEIGHT*16, 0.5);
endlight.setAttenuation(0, 0.0, 0.005); endlight.setAttenuation(0, 0.0, 0.005);
endlight2.setColor(1, 1, 1); endlight2.setColor(1, 1, 1);
endlight2.setSpecular(1, 1, 1); endlight2.setSpecular(1, 1, 1);
endlight2.setAttenuation(1.0, 0.0, 0.0); endlight2.setAttenuation(1.0, 0.0, 0.0);
endfloor = new BasicBlock(30, 1, 20); endfloor = new BasicBlock(30, 1, 20);
//endfloor->material.setColor(0, 1, 0, 1); //endfloor->material.setColor(0, 1, 0, 1);
endfloor->setColor(0, 1, 0); endfloor->setColor(0, 1, 0);
endfloor->setPosition(-10, -BLOCKHEIGHT*0.5, 0); endfloor->setPosition(-10, -BLOCKHEIGHT*0.5, 0);
endfloor->prepare(); endfloor->prepare();
} }
int endingcounter; int endingcounter;
void endRestart(void){ void endRestart(void){
endingcounter = 0; endingcounter = 0;
//initEnd(); //initEnd();
//endfloor->prepare(); //endfloor->prepare();
} }
void stopEnding(void){ void stopEnding(void){
endlight.setEnabled(false); endlight.setEnabled(false);
changeGameMode(MENUMODE); changeGameMode(MENUMODE);
fightmusic->fadeOut(300); fightmusic->fadeOut(300);
menuRestart(); menuRestart();
} }
float endfade; float endfade;
void calculateEnd(int framecount){ void calculateEnd(int framecount){
endfade = -1; endfade = -1;
if (endingcounter < 200){ if (endingcounter < 200){
endfade = 1-(float)endingcounter/200; endfade = 1-(float)endingcounter/200;
} }
endingcounter++; endingcounter++;
endlight.setEnabled(true); endlight.setEnabled(true);
//endlight2.setEnabled(true); //endlight2.setEnabled(true);
float target[3] = {0, 13, 0}; float target[3] = {0, 13, 0};
endcamera.setTarget(target); endcamera.setTarget(target);
endcamera.setPosition(10+sin(framecount*0.002)*2, 20+sin(framecount*0.0017)*2, 25+cos(framecount*0.002)*2); endcamera.setPosition(10+sin(framecount*0.002)*2, 20+sin(framecount*0.0017)*2, 25+cos(framecount*0.002)*2);
//endcamera.setPosition(sin(framecount*0.01)*25, sin(framecount*0.007)*6+20, cos(framecount*0.01)*25); //endcamera.setPosition(sin(framecount*0.01)*25, sin(framecount*0.007)*6+20, cos(framecount*0.01)*25);
//endlight.setPosition(40, 20, 0); //endlight.setPosition(40, 20, 0);
endlight.setPosition(-sin(framecount*0.007)*10, 15, cos(framecount*0.007)*2+22); endlight.setPosition(-sin(framecount*0.007)*10, 15, cos(framecount*0.007)*2+22);
if (keys[SDLK_ESCAPE]){ if (keys[SDLK_ESCAPE]){
stopEnding(); stopEnding();
} }
} }
void drawEnd(int framecount){ void drawEnd(int framecount){
glLoadIdentity(); glLoadIdentity();
glTranslatef(10, 0, 0); glTranslatef(10, 0, 0);
endcamera.glUpdate(); endcamera.glUpdate();
updateLights(); updateLights();
glEnable(GL_LIGHTING); glEnable(GL_LIGHTING);
glDisable(GL_BLEND); glDisable(GL_BLEND);
glEnable(GL_CULL_FACE); glEnable(GL_CULL_FACE);
glDisable(GL_TEXTURE_2D); glDisable(GL_TEXTURE_2D);
endfloor->draw(); endfloor->draw();
glColor3f(1, 1, 0); glColor3f(1, 1, 0);
drawTrophy(); drawTrophy();
glRotatef(270, 0, 1, 0); glRotatef(270, 0, 1, 0);
glTranslatef(2-BLOCKHEIGHT*0.5, 0, 15-BLOCKHEIGHT*0.5); glTranslatef(2-BLOCKHEIGHT*0.5, 0, 15-BLOCKHEIGHT*0.5);
glScalef(3, 3, 3); glScalef(3, 3, 3);
winner->head->draw(); winner->head->draw();
winner->torso->draw(); winner->torso->draw();
winner->lefthand->draw(); winner->lefthand->draw();
winner->righthand->draw(); winner->righthand->draw();
winner->waist->draw(); winner->waist->draw();
winner->leftleg->draw(); winner->leftleg->draw();
winner->rightleg->draw(); winner->rightleg->draw();
enable2D(); enable2D();
glColor3f(1, 1, 1); glColor3f(1, 1, 1);
if (winner->side == PLAYER1) print(0.05, 0.05, "Player 1 is\nthe winner", 0.09); if (winner->side == PLAYER1) print(0.05, 0.05, "Player 1 is\nthe winner", 0.09);
if (winner->side == PLAYER2) print(0.05, 0.05, "Player 2 is\nthe winner", 0.09); if (winner->side == PLAYER2) print(0.05, 0.05, "Player 2 is\nthe winner", 0.09);
if (endfade != -1){ if (endfade != -1){
glEnable(GL_BLEND); glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glColor4f(0, 0, 0, endfade); glColor4f(0, 0, 0, endfade);
glBegin(GL_QUADS); glBegin(GL_QUADS);
glVertex2f(0, 0); glVertex2f(0, 0);
glVertex2f(1, 0); glVertex2f(1, 0);
glVertex2f(1, 1); glVertex2f(1, 1);
glVertex2f(0, 1); glVertex2f(0, 1);
glEnd(); glEnd();
} }
disable2D(); disable2D();
} }

View file

@ -1,17 +1,3 @@
/*
* $Id: end.h,v 1.1 2002/07/22 01:14:14 msell Exp $
*
*
* $Log: end.h,v $
* Revision 1.1 2002/07/22 01:14:14 msell
* Lopetussysteemi
*
*
*
* $Date: 2002/07/22 01:14:14 $
*
*/
#ifndef __END_H_INCLUDED__ #ifndef __END_H_INCLUDED__
#define __END_H_INCLUDED__ #define __END_H_INCLUDED__

File diff suppressed because it is too large Load diff

View file

@ -1,66 +1,3 @@
/*
* $Id: fight.h,v 1.17 2002/07/22 01:14:14 msell Exp $
*
*
* $Log: fight.h,v $
* Revision 1.17 2002/07/22 01:14:14 msell
* Lopetussysteemi
*
* Revision 1.16 2002/07/21 15:03:12 msell
* Äänet disabloitu
*
* Revision 1.15 2002/07/19 20:33:28 msell
* #pragma once -> #ifndef
*
* Revision 1.14 2002/07/19 20:06:32 msell
* Linux-porttausta
*
* Revision 1.13 2002/07/19 18:59:46 msell
* Alkuhommaa ja säätöä
*
* Revision 1.12 2002/07/19 14:05:52 msell
* Damagetextuurit näkyy
*
* Revision 1.11 2002/07/18 23:05:31 msell
* Partikkelit ja kakkospelaajan liike
*
* Revision 1.10 2002/07/17 22:45:54 msell
* Ääniä vähän
*
* Revision 1.9 2002/07/16 17:16:34 msell
* Fontit ja valikot
*
* Revision 1.8 2002/07/15 15:22:08 msell
* Parantelua
*
* Revision 1.7 2002/07/14 21:22:40 jkaarlas
* skybox ja ukkojen säätö
*
* Revision 1.6 2002/07/08 22:53:38 msell
* Säätöä
*
* Revision 1.5 2002/07/07 15:29:07 msell
* Törmäyksien parantelua
*
* Revision 1.4 2002/07/04 21:05:41 msell
* Se toimii!! =)
* Törmäystarkistukset siis
*
* Revision 1.3 2002/06/04 16:28:32 msell
* #pragma once
*
* Revision 1.2 2002/06/02 16:57:37 msell
* Objektirakenteen pohja
*
* Revision 1.1 2002/05/16 18:42:07 msell
* Vektorifunctioita ja kamera
*
*
*
* $Date: 2002/07/22 01:14:14 $
*
*/
#ifndef __FIGHT_H_INCLUDED__ #ifndef __FIGHT_H_INCLUDED__
#define __FIGHT_H_INCLUDED__ #define __FIGHT_H_INCLUDED__

View file

@ -1,32 +1,3 @@
/*
* $Id: font.cpp,v 1.6 2002/07/21 20:14:28 msell Exp $
*
*
* $Log: font.cpp,v $
* Revision 1.6 2002/07/21 20:14:28 msell
* no message
*
* Revision 1.5 2002/07/19 18:59:46 msell
* Alkuhommaa ja säätöä
*
* Revision 1.4 2002/07/19 14:05:52 msell
* Damagetextuurit näkyy
*
* Revision 1.3 2002/07/19 12:10:53 msell
* Hups
*
* Revision 1.2 2002/07/17 16:40:33 msell
* Resoluution vaihto
*
* Revision 1.1 2002/07/16 17:16:34 msell
* Fontit ja valikot
*
*
*
* $Date: 2002/07/21 20:14:28 $
*
*/
#include "main.h" #include "main.h"
#include "font.h" #include "font.h"
@ -35,68 +6,68 @@
Texture *fonttexture; Texture *fonttexture;
void drawChar(float x, float y, char ch, float size){ void drawChar(float x, float y, char ch, float size){
fonttexture->enable(); fonttexture->enable();
int tx = (ch&15)*64; int tx = (ch&15)*64;
int ty = (ch>>4)*64; int ty = (ch>>4)*64;
float w = size, h = size*4/3; float w = size, h = size*4/3;
glEnable(GL_BLEND); glEnable(GL_BLEND);
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_COLOR); glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_COLOR);
glBegin(GL_QUADS); glBegin(GL_QUADS);
glTexCoord2f((tx)/1024.0, (ty)/1024.0); glTexCoord2f((tx)/1024.0, (ty)/1024.0);
glVertex2f(x, y); glVertex2f(x, y);
glTexCoord2f((tx)/1024.0, (ty+64)/1024.0); glTexCoord2f((tx)/1024.0, (ty+64)/1024.0);
glVertex2f(x, y+h); glVertex2f(x, y+h);
glTexCoord2f((tx+64)/1024.0, (ty+64)/1024.0);
glVertex2f(x+w, y+h);
glTexCoord2f((tx+64)/1024.0, (ty)/1024.0);
glVertex2f(x+w, y);
glEnd(); glTexCoord2f((tx+64)/1024.0, (ty+64)/1024.0);
glVertex2f(x+w, y+h);
fonttexture->disable(); glTexCoord2f((tx+64)/1024.0, (ty)/1024.0);
glVertex2f(x+w, y);
glEnd();
fonttexture->disable();
} }
float letterwidth[256] = { float letterwidth[256] = {
1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,
1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,
0.5, 0.2, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.45, 0.2, 0.5, 0.5, 0.2, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.45, 0.2, 0.5,
0.6, 0.5, 0.6, 0.6, 0.65, 0.65, 0.6, 0.65, 0.6, 0.6, 0.2, 1.0, 1.0, 1.0, 1.0, 0.5, 0.6, 0.5, 0.6, 0.6, 0.65, 0.65, 0.6, 0.65, 0.6, 0.6, 0.2, 1.0, 1.0, 1.0, 1.0, 0.5,
1.0, 0.7, 0.6, 0.7, 0.7, 0.65, 0.6, 0.7, 0.8, 0.6, 0.7, 0.7, 0.6, 0.9, 0.85, 0.8, 1.0, 0.7, 0.6, 0.7, 0.7, 0.65, 0.6, 0.7, 0.8, 0.6, 0.7, 0.7, 0.6, 0.9, 0.85, 0.8,
0.6, 0.9, 0.7, 0.7, 0.7, 0.7, 0.7, 1.0, 0.8, 0.7, 0.8, 1.0, 1.0, 1.0, 1.0, 1.0, 0.6, 0.9, 0.7, 0.7, 0.7, 0.7, 0.7, 1.0, 0.8, 0.7, 0.8, 1.0, 1.0, 1.0, 1.0, 1.0,
1.0, 0.6, 0.6, 0.6, 0.6, 0.6, 0.5, 0.6, 0.6, 0.2, 0.4, 0.6, 0.2, 0.8, 0.5, 0.55, 1.0, 0.6, 0.6, 0.6, 0.6, 0.6, 0.5, 0.6, 0.6, 0.2, 0.4, 0.6, 0.2, 0.8, 0.5, 0.55,
0.55, 0.55, 0.5, 0.55, 0.55, 0.55, 0.6, 0.8, 0.6, 0.6, 0.6, 1.0, 1.0, 1.0, 1.0, 1.0, 0.55, 0.55, 0.5, 0.55, 0.55, 0.55, 0.6, 0.8, 0.6, 0.6, 0.6, 1.0, 1.0, 1.0, 1.0, 1.0,
1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,
1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,
1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,
1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,
1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,
1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,
1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,
1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0
}; };
void print(float x, float y, char *text, float size){ void print(float x, float y, char *text, float size){
int i; int i;
int textlength = strlen(text); int textlength = strlen(text);
float px = x; float px = x;
float py = y; float py = y;
for (i = 0; i < textlength; i++){ for (i = 0; i < textlength; i++){
char ch = text[i]; char ch = text[i];
if (ch == '\n'){ if (ch == '\n'){
px = x; px = x;
py += size*1.2; py += size*1.2;
} else{ } else{
drawChar(px, py, ch, size); drawChar(px, py, ch, size);
px += size*letterwidth[ch]; px += size*letterwidth[ch];
} }
} }
} }

View file

@ -1,23 +1,3 @@
/*
* $Id: font.h,v 1.3 2002/07/19 20:33:28 msell Exp $
*
*
* $Log: font.h,v $
* Revision 1.3 2002/07/19 20:33:28 msell
* #pragma once -> #ifndef
*
* Revision 1.2 2002/07/19 14:05:52 msell
* Damagetextuurit näkyy
*
* Revision 1.1 2002/07/16 17:16:34 msell
* Fontit ja valikot
*
*
*
* $Date: 2002/07/19 20:33:28 $
*
*/
#ifndef __FONT_H_INCLUDED__ #ifndef __FONT_H_INCLUDED__
#define __FONT_H_INCLUDED__ #define __FONT_H_INCLUDED__

View file

@ -1,67 +1,28 @@
/*
* $Id: glapi.cpp,v 1.9 2002/07/21 15:03:12 msell Exp $
*
*
* $Log: glapi.cpp,v $
* Revision 1.9 2002/07/21 15:03:12 msell
* Äänet disabloitu
*
* Revision 1.8 2002/07/15 20:32:35 msell
* Uudet valot ja ulkoasun parantelua
*
* Revision 1.7 2002/06/17 19:58:08 msell
* #includeiden parantelua
*
* Revision 1.6 2002/06/05 18:39:04 msell
* Jotain pientä
*
* Revision 1.5 2002/06/05 15:00:41 msell
* Palikoihin lisää detailia, facet jaetaan halutun kokosiin osiin
*
* Revision 1.4 2002/06/03 23:06:38 msell
* no message
*
* Revision 1.3 2002/05/17 23:13:30 msell
* Valot
*
* Revision 1.2 2002/05/16 18:41:16 msell
* Vektorifunctioita ja kamera
*
* Revision 1.1 2002/05/15 14:36:39 msell
* Yksinkertainen SDL-runko (Kääntyy toistaiseksi vain windowsissa).
* Mukana myös musiikinsoitto fmodilla.
*
*
*
* $Date: 2002/07/21 15:03:12 $
*
*/
#include "main.h" #include "main.h"
#include "glapi.h" #include "glapi.h"
void setupOpengl(int width, int height){ void setupOpengl(int width, int height){
//float ratio = (float)width/height; //float ratio = (float)width/height;
float ratio = 4.0/3.0; float ratio = 4.0/3.0;
glShadeModel(GL_SMOOTH); glShadeModel(GL_SMOOTH);
glCullFace(GL_BACK); glCullFace(GL_BACK);
glFrontFace(GL_CCW); glFrontFace(GL_CCW);
glEnable(GL_CULL_FACE); glEnable(GL_CULL_FACE);
glEnable(GL_DEPTH_TEST); glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL); glDepthFunc(GL_LEQUAL);
glClearDepth(1.0); glClearDepth(1.0);
glClearColor(0, 0, 0, 0); glClearColor(0, 0, 0, 0);
glEnable(GL_COLOR_MATERIAL); glEnable(GL_COLOR_MATERIAL);
//Enables lighting with zero initial lights. Lights are created with Light-class //Enables lighting with zero initial lights. Lights are created with Light-class
glEnable(GL_LIGHTING); glEnable(GL_LIGHTING);
glDisable(GL_LIGHT0); glDisable(GL_LIGHT0);
float ambient[4]= {0.1, 0.1, 0.1, 1}; float ambient[4]= {0.1, 0.1, 0.1, 1};
glLightModelfv(GL_LIGHT_MODEL_AMBIENT, ambient); glLightModelfv(GL_LIGHT_MODEL_AMBIENT, ambient);
@ -70,34 +31,34 @@ void setupOpengl(int width, int height){
glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_FALSE); glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_FALSE);
GLfloat zero[4] = {0, 0, 0, 1}; GLfloat zero[4] = {0, 0, 0, 1};
GLfloat one[4] = {1, 1, 1, 1}; GLfloat one[4] = {1, 1, 1, 1};
//Default frontface lighting //Default frontface lighting
glMaterialfv(GL_FRONT, GL_AMBIENT, one); glMaterialfv(GL_FRONT, GL_AMBIENT, one);
glMaterialfv(GL_FRONT, GL_DIFFUSE, one); glMaterialfv(GL_FRONT, GL_DIFFUSE, one);
GLfloat specular[4] = {2, 2, 2, 1}; GLfloat specular[4] = {2, 2, 2, 1};
glMaterialfv(GL_FRONT, GL_SPECULAR, specular); glMaterialfv(GL_FRONT, GL_SPECULAR, specular);
glMaterialf(GL_FRONT, GL_SHININESS, 120); glMaterialf(GL_FRONT, GL_SHININESS, 120);
//Never any backface lighting, except ambient //Never any backface lighting, except ambient
glMaterialfv(GL_BACK, GL_AMBIENT, one); glMaterialfv(GL_BACK, GL_AMBIENT, one);
glMaterialfv(GL_BACK, GL_DIFFUSE, zero); glMaterialfv(GL_BACK, GL_DIFFUSE, zero);
glMaterialfv(GL_BACK, GL_SPECULAR, zero); glMaterialfv(GL_BACK, GL_SPECULAR, zero);
glViewport(0, 0, width, height); glViewport(0, 0, width, height);
glDepthFunc(GL_LEQUAL); glDepthFunc(GL_LEQUAL);
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
glEnable(GL_NORMALIZE); glEnable(GL_NORMALIZE);
glMatrixMode(GL_PROJECTION); glMatrixMode(GL_PROJECTION);
glLoadIdentity(); glLoadIdentity();
gluPerspective(60.0, ratio, 1.0, 1024.0); gluPerspective(60.0, ratio, 1.0, 1024.0);
//glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); //glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
} }

View file

@ -1,33 +1,3 @@
/*
* $Id: glapi.h,v 1.6 2002/07/19 20:33:28 msell Exp $
*
*
* $Log: glapi.h,v $
* Revision 1.6 2002/07/19 20:33:28 msell
* #pragma once -> #ifndef
*
* Revision 1.5 2002/06/17 19:58:08 msell
* #includeiden parantelua
*
* Revision 1.4 2002/06/16 01:04:58 jkaarlas
* tulipa säädettyä includejen kanssa. oon tod.näk. eri mieltä aamulla
*
* Revision 1.3 2002/06/04 16:28:32 msell
* #pragma once
*
* Revision 1.2 2002/05/16 18:41:16 msell
* Vektorifunctioita ja kamera
*
* Revision 1.1 2002/05/15 14:36:39 msell
* Yksinkertainen SDL-runko (Kääntyy toistaiseksi vain windowsissa).
* Mukana myös musiikinsoitto fmodilla.
*
*
*
* $Date: 2002/07/19 20:33:28 $
*
*/
#ifndef __GLAPI_H_INCLUDED__ #ifndef __GLAPI_H_INCLUDED__
#define __GLAPI_H_INCLUDED__ #define __GLAPI_H_INCLUDED__

View file

@ -1,62 +1,3 @@
/*
* $Id: graphics.cpp,v 1.17 2002/07/21 15:03:12 msell Exp $
*
*
* $Log: graphics.cpp,v $
* Revision 1.17 2002/07/21 15:03:12 msell
* Äänet disabloitu
*
* Revision 1.16 2002/07/19 22:01:35 msell
* Säätöä
*
* Revision 1.15 2002/07/19 21:32:54 msell
* Mipmap pois
*
* Revision 1.14 2002/07/19 21:17:06 msell
* bugifixi
*
* Revision 1.13 2002/07/17 16:40:33 msell
* Resoluution vaihto
*
* Revision 1.12 2002/07/14 21:22:39 jkaarlas
* skybox ja ukkojen säätö
*
* Revision 1.11 2002/06/28 14:51:40 jkaarlas
* transparenttilatausta korjailtu
*
* Revision 1.10 2002/06/27 21:42:32 jkaarlas
* lisätty transparentin tekstuurin lataus
*
* Revision 1.9 2002/06/26 18:54:43 jkaarlas
* Nyt se lataus vihdoin toimii
*
* Revision 1.8 2002/06/20 15:30:22 jkaarlas
* tekstuurisäätöä
*
* Revision 1.7 2002/06/19 22:44:56 jkaarlas
* lisätty glTexEnvf lataukseen
*
* Revision 1.6 2002/06/17 20:49:04 msell
* free -> SDL_FreeSurface
*
* Revision 1.5 2002/06/17 20:24:20 jkaarlas
* pahimmat bugit korjattu
*
* Revision 1.4 2002/06/17 19:58:08 msell
* #includeiden parantelua
*
* Revision 1.3 2002/06/17 16:51:38 jkaarlas
* realloc korjattu
*
* Revision 1.2 2002/06/16 01:05:18 jkaarlas
* vähän lihaa luiden ympärille näihinkin
*
*
*
* $Date: 2002/07/21 15:03:12 $
*
*/
#include "graphics.h" #include "graphics.h"
#include <stdlib.h> #include <stdlib.h>
@ -90,7 +31,7 @@ void GraphicsDruid::destroy(void){
} }
GraphicsDruid &GraphicsDruid::getInstance(void){ GraphicsDruid &GraphicsDruid::getInstance(void){
if (!instance){ if (!instance){
instance = new GraphicsDruid; instance = new GraphicsDruid;
init(); init();
@ -101,9 +42,9 @@ GraphicsDruid &GraphicsDruid::getInstance(void){
int GraphicsDruid::loadTexture(SDL_Surface *texture, int id, int format){ int GraphicsDruid::loadTexture(SDL_Surface *texture, int id, int format){
int textureID = id == -1 ? getNewTextureID(id) : id; int textureID = id == -1 ? getNewTextureID(id) : id;
// register texture in OpenGL // register texture in OpenGL
glBindTexture (GL_TEXTURE_2D, textureID); glBindTexture (GL_TEXTURE_2D, textureID);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1); glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
//glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); //glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
@ -112,48 +53,48 @@ int GraphicsDruid::loadTexture(SDL_Surface *texture, int id, int format){
//glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); //glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);//_MIPMAP_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);//_MIPMAP_NEAREST);
//glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); //glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
//glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); //glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
//glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); //glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
//printf("w: %i, h: %i, format: %i, RGBA: %i, pixels: %p\n", //printf("w: %i, h: %i, format: %i, RGBA: %i, pixels: %p\n",
// texture->w, texture->h, format, GL_RGBA, texture->pixels); // texture->w, texture->h, format, GL_RGBA, texture->pixels);
//printf("Pitch: %i, Bpp: %i\n", texture->pitch, texture->format->BytesPerPixel); //printf("Pitch: %i, Bpp: %i\n", texture->pitch, texture->format->BytesPerPixel);
/*gluBuild2DMipmaps(GL_TEXTURE_2D, /*gluBuild2DMipmaps(GL_TEXTURE_2D,
4, 4,
texture->w, texture->w,
texture->h, texture->h,
format, format,
GL_UNSIGNED_BYTE, GL_UNSIGNED_BYTE,
texture->pixels);*/ texture->pixels);*/
int w = texture->w; int w = texture->w;
int h = texture->h; int h = texture->h;
/*int i; /*int i;
while (w > 0){ while (w > 0){
w >>= 1; w >>= 1;
i++; i++;
} }
w = 1; w = 1;
for (;i > 1; i--) w <<= 1; for (;i > 1; i--) w <<= 1;
while (h > 0){ while (h > 0){
h >>= 1; h >>= 1;
i++; i++;
} }
h = 1; h = 1;
for (;i > 1; i--) h <<= 1;*/ for (;i > 1; i--) h <<= 1;*/
//glTexImage2D(GL_TEXTURE_2D, 0, texture->format->BytesPerPixel, w, h, 0, format, GL_UNSIGNED_BYTE, texture->pixels); //glTexImage2D(GL_TEXTURE_2D, 0, texture->format->BytesPerPixel, w, h, 0, format, GL_UNSIGNED_BYTE, texture->pixels);
if (texture->format->BytesPerPixel == 3){ if (texture->format->BytesPerPixel == 3){
glTexImage2D(GL_TEXTURE_2D, 0, 3, w, h, 0, GL_RGB, GL_UNSIGNED_BYTE, texture->pixels); glTexImage2D(GL_TEXTURE_2D, 0, 3, w, h, 0, GL_RGB, GL_UNSIGNED_BYTE, texture->pixels);
} else if (texture->format->BytesPerPixel == 4){ } else if (texture->format->BytesPerPixel == 4){
glTexImage2D(GL_TEXTURE_2D, 0, 4, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, texture->pixels); glTexImage2D(GL_TEXTURE_2D, 0, 4, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, texture->pixels);
} }
//SDL_FreeSurface(texture); //SDL_FreeSurface(texture);
//SDL_FreeSurface(alphaSurface); //SDL_FreeSurface(alphaSurface);
return textureID; return textureID;
} }
int GraphicsDruid::loadTexture(char* path, int id){ int GraphicsDruid::loadTexture(char* path, int id){
SDL_Surface* texture; SDL_Surface* texture;
texture = IMG_Load(path); texture = IMG_Load(path);
@ -164,61 +105,61 @@ int GraphicsDruid::loadTexture(char* path, int id){
return -1; return -1;
} }
int textureID = getNewTextureID(id); int textureID = getNewTextureID(id);
// register texture in OpenGL
glBindTexture (GL_TEXTURE_2D, textureID); // register texture in OpenGL
glBindTexture (GL_TEXTURE_2D, textureID);
//glPixelStorei (GL_UNPACK_ALIGNMENT, 1); //glPixelStorei (GL_UNPACK_ALIGNMENT, 1);
// NOTE : Making some assumptions about texture parameters // NOTE : Making some assumptions about texture parameters
//glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); //glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
//glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST); //glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
//printf("w: %i, h: %i, RGBA: %i, pixels: %p\n", //printf("w: %i, h: %i, RGBA: %i, pixels: %p\n",
// texture->w, texture->h, GL_RGBA, texture->pixels); // texture->w, texture->h, GL_RGBA, texture->pixels);
//printf("Pitch: %i, Bpp: %i\n", texture->pitch, texture->format->BytesPerPixel); //printf("Pitch: %i, Bpp: %i\n", texture->pitch, texture->format->BytesPerPixel);
if (texture->format->BytesPerPixel == 3){ if (texture->format->BytesPerPixel == 3){
/*gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGB, /*gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGB,
texture->w, texture->w,
texture->h, texture->h,
GL_RGB, GL_UNSIGNED_BYTE, GL_RGB, GL_UNSIGNED_BYTE,
texture->pixels);*/ texture->pixels);*/
glTexImage2D(GL_TEXTURE_2D, 0, 3, texture->w, texture->h, 0, GL_RGB, GL_UNSIGNED_BYTE, texture->pixels); glTexImage2D(GL_TEXTURE_2D, 0, 3, texture->w, texture->h, 0, GL_RGB, GL_UNSIGNED_BYTE, texture->pixels);
} }
else if (texture->format->BytesPerPixel == 4){ else if (texture->format->BytesPerPixel == 4){
/*gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGBA, /*gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGBA,
texture->w, texture->w,
texture->h, texture->h,
GL_RGBA, GL_UNSIGNED_BYTE, GL_RGBA, GL_UNSIGNED_BYTE,
texture->pixels);*/ texture->pixels);*/
glTexImage2D(GL_TEXTURE_2D, 0, 4, texture->w, texture->h, 0, GL_RGBA, GL_UNSIGNED_BYTE, texture->pixels); glTexImage2D(GL_TEXTURE_2D, 0, 4, texture->w, texture->h, 0, GL_RGBA, GL_UNSIGNED_BYTE, texture->pixels);
} }
/* /*
gluBuild2DMipmaps(GL_TEXTURE_2D, gluBuild2DMipmaps(GL_TEXTURE_2D,
0, 0,
texture->w, texture->w,
texture->h, texture->h,
GL_RGBA, GL_RGBA,
GL_UNSIGNED_BYTE, GL_UNSIGNED_BYTE,
texture->pixels); texture->pixels);
*/ */
SDL_FreeSurface(texture); SDL_FreeSurface(texture);
return textureID; return textureID;
} }
int GraphicsDruid::loadTranspTexture(char* path, float* transpColor, int id){ int GraphicsDruid::loadTranspTexture(char* path, float* transpColor, int id){
SDL_Surface* texture; SDL_Surface* texture;
texture = IMG_Load(path); texture = IMG_Load(path);
if (!texture){ if (!texture){
@ -227,62 +168,62 @@ int GraphicsDruid::loadTranspTexture(char* path, float* transpColor, int id){
#endif #endif
return -1; return -1;
} }
Uint32 colorKey = SDL_MapRGB(texture->format, Uint32 colorKey = SDL_MapRGB(texture->format,
(Uint8)(transpColor[0] * 255), (Uint8)(transpColor[0] * 255),
(Uint8)(transpColor[1] * 255), (Uint8)(transpColor[1] * 255),
(Uint8)(transpColor[2] * 255)); (Uint8)(transpColor[2] * 255));
//SDL_SetAlpha(texture, 0, SDL_ALPHA_OPAQUE); //SDL_SetAlpha(texture, 0, SDL_ALPHA_OPAQUE);
SDL_SetColorKey(texture, SDL_SRCCOLORKEY, colorKey); SDL_SetColorKey(texture, SDL_SRCCOLORKEY, colorKey);
//SDL_Surface* alphaSurface = SDL_DisplayFormatAlpha(texture); //SDL_Surface* alphaSurface = SDL_DisplayFormatAlpha(texture);
texture = SDL_DisplayFormatAlpha(texture); texture = SDL_DisplayFormatAlpha(texture);
return loadTexture(texture); return loadTexture(texture);
} }
int GraphicsDruid::getNewTextureID(int id){ int GraphicsDruid::getNewTextureID(int id){
if (id != -1){ if (id != -1){
for (int i = 0; i < instance->reserved; i++){ for (int i = 0; i < instance->reserved; i++){
if (instance->idArray[i] == id){ if (instance->idArray[i] == id){
freeTexture(id); freeTexture(id);
instance->textureCount--; instance->textureCount--;
break; break;
} }
} }
} }
GLuint newId; GLuint newId;
if (id == -1){ if (id == -1){
glGenTextures (1, &newId); glGenTextures (1, &newId);
} }
else else
newId = id; newId = id;
int index = 0; int index = 0;
while (instance->idArray[index] != -1 && index < instance->reserved){ while (instance->idArray[index] != -1 && index < instance->reserved){
index++; index++;
} }
// out of space, make more // out of space, make more
if (index >= instance->reserved){ if (index >= instance->reserved){
instance->idArray = (int*) realloc(instance->idArray, (instance->reserved + ID_ARRAY_GROW)*sizeof(int)); instance->idArray = (int*) realloc(instance->idArray, (instance->reserved + ID_ARRAY_GROW)*sizeof(int));
for (int i = instance->reserved + 1; i < instance->reserved + ID_ARRAY_GROW; i++)
instance->idArray[i] = -1;
instance->reserved += ID_ARRAY_GROW; for (int i = instance->reserved + 1; i < instance->reserved + ID_ARRAY_GROW; i++)
} instance->idArray[i] = -1;
else
instance->idArray[index] = newId;
instance->reserved += ID_ARRAY_GROW;
instance->textureCount++; }
return newId; else
instance->idArray[index] = newId;
instance->textureCount++;
return newId;
} }
void GraphicsDruid::freeTexture(int id){ void GraphicsDruid::freeTexture(int id){

View file

@ -1,38 +1,3 @@
/*
* $Id: graphics.h,v 1.9 2002/07/19 20:33:28 msell Exp $
*
*
* $Log: graphics.h,v $
* Revision 1.9 2002/07/19 20:33:28 msell
* #pragma once -> #ifndef
*
* Revision 1.8 2002/07/17 16:40:33 msell
* Resoluution vaihto
*
* Revision 1.7 2002/06/28 14:51:40 jkaarlas
* transparenttilatausta korjailtu
*
* Revision 1.6 2002/06/27 21:42:32 jkaarlas
* lisätty transparentin tekstuurin lataus
*
* Revision 1.5 2002/06/17 20:49:04 msell
* free -> SDL_FreeSurface
*
* Revision 1.4 2002/06/17 20:24:20 jkaarlas
* pahimmat bugit korjattu
*
* Revision 1.3 2002/06/17 16:51:38 jkaarlas
* realloc korjattu
*
* Revision 1.2 2002/06/16 01:05:18 jkaarlas
* vähän lihaa luiden ympärille näihinkin
*
*
*
* $Date: 2002/07/19 20:33:28 $
*
*/
#ifndef __GRAPHICS_H_INCLUDED__ #ifndef __GRAPHICS_H_INCLUDED__
#define __GRAPHICS_H_INCLUDED__ #define __GRAPHICS_H_INCLUDED__
@ -66,17 +31,17 @@ private:
int* idArray; int* idArray;
int textureCount; int textureCount;
int reserved; int reserved;
GraphicsDruid(void); GraphicsDruid(void);
~GraphicsDruid(void); ~GraphicsDruid(void);
static void init(void); static void init(void);
static void destroy(void); static void destroy(void);
public: public:
static GraphicsDruid &getInstance(void); static GraphicsDruid &getInstance(void);
int loadTexture(SDL_Surface *texture, int id = -1, int format = GL_RGB); int loadTexture(SDL_Surface *texture, int id = -1, int format = GL_RGB);
int loadTexture(char* path, int id = -1); int loadTexture(char* path, int id = -1);
int loadTranspTexture(char* path, float* transpColor, int id = -1); int loadTranspTexture(char* path, float* transpColor, int id = -1);
void freeTexture(int id); void freeTexture(int id);

View file

@ -1,75 +1,3 @@
/*
* $Id: legoblocks.cpp,v 1.20 2002/07/22 11:44:37 jkaarlas Exp $
*
*
* $Log: legoblocks.cpp,v $
* Revision 1.20 2002/07/22 11:44:37 jkaarlas
* naama
*
* Revision 1.19 2002/07/18 23:05:31 msell
* Partikkelit ja kakkospelaajan liike
*
* Revision 1.18 2002/07/17 20:32:47 msell
* Detail-optio toimii
*
* Revision 1.17 2002/07/16 17:16:34 msell
* Fontit ja valikot
*
* Revision 1.16 2002/07/16 00:42:43 msell
* Uusia skyboxeja ja areenan säätöä
*
* Revision 1.15 2002/07/15 20:32:35 msell
* Uudet valot ja ulkoasun parantelua
*
* Revision 1.14 2002/07/15 15:22:08 msell
* Parantelua
*
* Revision 1.13 2002/07/14 21:40:43 msell
* Conflictit pois, liikkumiset (hyppy, kävely, lyönti), uusi areena
*
* Revision 1.12 2002/06/30 16:05:04 msell
* Törmäyksien parantelua, transformaatioita mukana
*
* Revision 1.11 2002/06/27 00:08:04 msell
* Kimmotukset palloille myös pyöritettyihin mesheihin
*
* Revision 1.10 2002/06/24 14:12:15 msell
* Nyt toimii sphere -> mesh -törmäykset, ihan tosi
*
* Revision 1.9 2002/06/24 04:41:43 jkaarlas
* tekstuurikoordinaatteja korjattu
*
* Revision 1.8 2002/06/20 22:50:12 msell
* Meshit
*
* Revision 1.7 2002/06/20 00:21:01 jkaarlas
* materiaali- ja tekstuurihommia edistetty
*
* Revision 1.6 2002/06/17 19:58:08 msell
* #includeiden parantelua
*
* Revision 1.5 2002/06/15 17:18:37 msell
* Toimiva törmäystarkastus kiinteille laatikoille
*
* Revision 1.4 2002/06/05 18:39:04 msell
* Jotain pientä
*
* Revision 1.3 2002/06/05 15:00:41 msell
* Palikoihin lisää detailia, facet jaetaan halutun kokosiin osiin
*
* Revision 1.2 2002/06/04 16:28:32 msell
* #pragma once
*
* Revision 1.1 2002/06/03 23:06:38 msell
* no message
*
*
*
*
* $Date: 2002/07/22 11:44:37 $
*
*/
#include "main.h" #include "main.h"
#include <math.h> #include <math.h>
@ -82,131 +10,131 @@
#include "glapi.h" #include "glapi.h"
BasicBlock::BasicBlock(int width, int height, int depth) : MeshObject(createBox(-width/2.0, width/2.0, -height/2.0*BLOCKHEIGHT, BLOCKHEIGHT*height/2.0, -depth/2.0, depth/2.0)){ BasicBlock::BasicBlock(int width, int height, int depth) : MeshObject(createBox(-width/2.0, width/2.0, -height/2.0*BLOCKHEIGHT, BLOCKHEIGHT*height/2.0, -depth/2.0, depth/2.0)){
appearance = new BasicBlockAppearance(width, height, depth); appearance = new BasicBlockAppearance(width, height, depth);
//geometry = new MeshShape(this); //geometry = new MeshShape(this);
} }
void BasicBlock::setColor(float red, float green, float blue){ void BasicBlock::setColor(float red, float green, float blue){
appearance->getMaterial()->setColor(red, green, blue, 1); appearance->getMaterial()->setColor(red, green, blue, 1);
} }
BasicBlockAppearance::BasicBlockAppearance(int width, int height, int depth){ BasicBlockAppearance::BasicBlockAppearance(int width, int height, int depth){
this->width = width; this->width = width;
this->height = height; this->height = height;
this->depth = depth; this->depth = depth;
vectorSet(displacement, 0, 0, 0); vectorSet(displacement, 0, 0, 0);
gllist = glGenLists(1); gllist = glGenLists(1);
usematerial = true; usematerial = true;
} }
void BasicBlockAppearance::prepare(){ void BasicBlockAppearance::prepare(){
glNewList(gllist, GL_COMPILE); glNewList(gllist, GL_COMPILE);
float width = this->width; float width = this->width;
float height = this->height * BLOCKHEIGHT; float height = this->height * BLOCKHEIGHT;
if (usematerial) material.enable(); if (usematerial) material.enable();
{//Block {//Block
//Front Face //Front Face
glPushMatrix(); glPushMatrix();
glTranslatef(-width/2.0, -height/2.0, depth/2.0); glTranslatef(-width/2.0, -height/2.0, depth/2.0);
drawDetailRectangle(width, height); drawDetailRectangle(width, height);
glPopMatrix(); glPopMatrix();
// Back Face // Back Face
glPushMatrix(); glPushMatrix();
glTranslatef(width/2.0, -height/2.0, -depth/2.0); glTranslatef(width/2.0, -height/2.0, -depth/2.0);
glRotatef(180, 0, 1, 0); glRotatef(180, 0, 1, 0);
drawDetailRectangle(width, height); drawDetailRectangle(width, height);
glPopMatrix(); glPopMatrix();
// Top Face // Top Face
glPushMatrix(); glPushMatrix();
glTranslatef(-width/2.0, height/2.0, depth/2.0); glTranslatef(-width/2.0, height/2.0, depth/2.0);
glRotatef(-90, 1, 0, 0); glRotatef(-90, 1, 0, 0);
drawDetailRectangle(width, depth); drawDetailRectangle(width, depth);
glPopMatrix(); glPopMatrix();
// Bottom Face // Bottom Face
glPushMatrix(); glPushMatrix();
glTranslatef(-width/2.0, -height/2.0, -depth/2.0); glTranslatef(-width/2.0, -height/2.0, -depth/2.0);
glRotatef(90, 1, 0, 0); glRotatef(90, 1, 0, 0);
drawDetailRectangle(width, depth); drawDetailRectangle(width, depth);
glPopMatrix(); glPopMatrix();
// Right face // Right face
glPushMatrix(); glPushMatrix();
glTranslatef(width/2.0, -height/2.0, depth/2.0); glTranslatef(width/2.0, -height/2.0, depth/2.0);
glRotatef(90, 0, 1, 0); glRotatef(90, 0, 1, 0);
drawDetailRectangle(depth, height); drawDetailRectangle(depth, height);
glPopMatrix(); glPopMatrix();
// Left Face // Left Face
glPushMatrix(); glPushMatrix();
glTranslatef(-width/2.0, -height/2.0, -depth/2.0); glTranslatef(-width/2.0, -height/2.0, -depth/2.0);
glRotatef(-90, 0, 1, 0); glRotatef(-90, 0, 1, 0);
drawDetailRectangle(depth, height); drawDetailRectangle(depth, height);
glPopMatrix(); glPopMatrix();
} }
glPushMatrix(); glPushMatrix();
glTranslatef(0.5 - width/2.0, height - height/2.0, 0.5 - depth/2.0); glTranslatef(0.5 - width/2.0, height - height/2.0, 0.5 - depth/2.0);
int x, z; int x, z;
for (x = 0; x < width; x++){ for (x = 0; x < width; x++){
//glPushMatrix(); //glPushMatrix();
for (z = 0; z < depth; z++){ for (z = 0; z < depth; z++){
createKnob(); createKnob();
glTranslatef(0, 0, 1); glTranslatef(0, 0, 1);
} }
glTranslatef(1, 0, -depth); glTranslatef(1, 0, -depth);
//glPopMatrix(); //glPopMatrix();
} }
glPopMatrix(); glPopMatrix();
if (usematerial) material.disable(); if (usematerial) material.disable();
glEndList(); glEndList();
} }
void BasicBlockAppearance::draw(){ void BasicBlockAppearance::draw(){
glPushMatrix(); glPushMatrix();
glTranslatef(displacement[0], displacement[1], displacement[2]); glTranslatef(displacement[0], displacement[1], displacement[2]);
glCallList(gllist); glCallList(gllist);
glPopMatrix(); glPopMatrix();
//prepare(); //prepare();
} }
#define BLOCKDETAILGRID 1 #define BLOCKDETAILGRID 1
void drawDetailRectangle(float width, float height){ void drawDetailRectangle(float width, float height){
glBegin(GL_QUADS); glBegin(GL_QUADS);
float x, y, x2, y2; float x, y, x2, y2;
glNormal3f(0, 0, 1); glNormal3f(0, 0, 1);
for (y = 0; y < height; y += BLOCKDETAILGRID){
y2 = y + BLOCKDETAILGRID;
if (y2 > height) y2 = height;
for (x = 0; x < width; x += BLOCKDETAILGRID){
x2 = x + BLOCKDETAILGRID;
if (x2 > width) x2 = width;
glTexCoord2f(x / width, y / height);
glVertex3f(x, y, 0);
glTexCoord2f(x2 / width, y / height); for (y = 0; y < height; y += BLOCKDETAILGRID){
glVertex3f(x2, y, 0); y2 = y + BLOCKDETAILGRID;
if (y2 > height) y2 = height;
for (x = 0; x < width; x += BLOCKDETAILGRID){
x2 = x + BLOCKDETAILGRID;
if (x2 > width) x2 = width;
glTexCoord2f(x2 / width, y2 / height); glTexCoord2f(x / width, y / height);
glVertex3f(x2, y2, 0); glVertex3f(x, y, 0);
glTexCoord2f(x / width, y2 / height); glTexCoord2f(x2 / width, y / height);
glVertex3f(x, y2, 0); glVertex3f(x2, y, 0);
}
} glTexCoord2f(x2 / width, y2 / height);
glEnd(); glVertex3f(x2, y2, 0);
glTexCoord2f(x / width, y2 / height);
glVertex3f(x, y2, 0);
}
}
glEnd();
} }
#define KNOBROUNDNESS 0.03 #define KNOBROUNDNESS 0.03
@ -215,43 +143,43 @@ int knobgllist;
int knobdetail; int knobdetail;
void renderKnob(int knobsegments){ void renderKnob(int knobsegments){
point2d knobpoints[4]; point2d knobpoints[4];
knobpoints[0].x = 0.3; knobpoints[0].x = 0.3;
knobpoints[0].y = 0; knobpoints[0].y = 0;
knobpoints[1].x = 0.3; knobpoints[1].x = 0.3;
knobpoints[1].y = BLOCKHEIGHT*0.5 - KNOBROUNDNESS; knobpoints[1].y = BLOCKHEIGHT*0.5 - KNOBROUNDNESS;
knobpoints[2].x = 0.3 - KNOBROUNDNESS; knobpoints[2].x = 0.3 - KNOBROUNDNESS;
knobpoints[2].y = BLOCKHEIGHT*0.5; knobpoints[2].y = BLOCKHEIGHT*0.5;
knobpoints[3].x = 0; knobpoints[3].x = 0;
knobpoints[3].y = BLOCKHEIGHT*0.5; knobpoints[3].y = BLOCKHEIGHT*0.5;
point2d knobderivates[4]; point2d knobderivates[4];
knobderivates[0].x = 0; knobderivates[0].x = 0;
knobderivates[0].y = knobpoints[1].y - knobpoints[0].y; knobderivates[0].y = knobpoints[1].y - knobpoints[0].y;
knobderivates[1].x = 0; knobderivates[1].x = 0;
knobderivates[1].y = knobpoints[2].y - knobpoints[1].y; knobderivates[1].y = knobpoints[2].y - knobpoints[1].y;
knobderivates[2].x = knobpoints[2].x - knobpoints[1].x; knobderivates[2].x = knobpoints[2].x - knobpoints[1].x;
knobderivates[2].y = 0; knobderivates[2].y = 0;
knobderivates[3].x = knobpoints[3].x - knobpoints[2].x; knobderivates[3].x = knobpoints[3].x - knobpoints[2].x;
knobderivates[3].y = 0; knobderivates[3].y = 0;
createLathedSurface(knobpoints, knobderivates, 4, knobsegments, 4); createLathedSurface(knobpoints, knobderivates, 4, knobsegments, 4);
} }
void initKnob(void){ void initKnob(void){
glNewList(knobgllist, GL_COMPILE); glNewList(knobgllist, GL_COMPILE);
renderKnob(knobdetail); renderKnob(knobdetail);
glEndList(); glEndList();
} }
void createKnob(int knobsegments){ void createKnob(int knobsegments){
if (knobsegments != -1){ if (knobsegments != -1){
renderKnob(knobsegments); renderKnob(knobsegments);
return; return;
} }
glCallList(knobgllist); glCallList(knobgllist);
} }
@ -262,53 +190,53 @@ float knobroundness=0.05;
float pillarroundness=0.03; float pillarroundness=0.03;
HeadAppearance::HeadAppearance(void){ HeadAppearance::HeadAppearance(void){
gllist = glGenLists(1); gllist = glGenLists(1);
} }
void HeadAppearance::prepare(void){ void HeadAppearance::prepare(void){
glNewList(gllist, GL_COMPILE); glNewList(gllist, GL_COMPILE);
glPushMatrix();
glTranslatef(0, -0.5, 0); glPushMatrix();
point2d headpoints[14]; glTranslatef(0, -0.5, 0);
headpoints[0].x=0.0; headpoints[0].y=BLOCKHEIGHT*(0); point2d headpoints[14];
headpoints[1].x=0.4; headpoints[1].y=BLOCKHEIGHT*(0);
headpoints[2].x=0.45; headpoints[2].y=BLOCKHEIGHT*(0.35);
headpoints[3].x=0.55; headpoints[3].y=BLOCKHEIGHT*(0.5);
headpoints[4].x=0.62*1.0; headpoints[4].y=BLOCKHEIGHT*(0.65);
headpoints[5].x=0.65*1.0; headpoints[5].y=BLOCKHEIGHT*(1);
headpoints[6].x=0.65*1.0; headpoints[6].y=BLOCKHEIGHT*(1.75);
headpoints[7].x=0.65*1.0; headpoints[7].y=BLOCKHEIGHT*(2.35);
headpoints[8].x=0.62*1.0; headpoints[8].y=BLOCKHEIGHT*(2.60);
headpoints[9].x=0.55*1.0; headpoints[9].y=BLOCKHEIGHT*(2.80);
headpoints[10].x=0.4; headpoints[10].y=BLOCKHEIGHT*(2.95);
headpoints[11].x=0.3; headpoints[11].y=BLOCKHEIGHT*3.5-pillarroundness;
headpoints[12].x=0.3-pillarroundness; headpoints[12].y=BLOCKHEIGHT*3.5;
headpoints[13].x=0; headpoints[13].y=BLOCKHEIGHT*3.5;
headpoints[11].x=0; headpoints[11].y=BLOCKHEIGHT*3.0;
glColor4f(0.8,0.8,0.0,1.0); headpoints[0].x=0.0; headpoints[0].y=BLOCKHEIGHT*(0);
headpoints[1].x=0.4; headpoints[1].y=BLOCKHEIGHT*(0);
headpoints[2].x=0.45; headpoints[2].y=BLOCKHEIGHT*(0.35);
headpoints[3].x=0.55; headpoints[3].y=BLOCKHEIGHT*(0.5);
headpoints[4].x=0.62*1.0; headpoints[4].y=BLOCKHEIGHT*(0.65);
headpoints[5].x=0.65*1.0; headpoints[5].y=BLOCKHEIGHT*(1);
headpoints[6].x=0.65*1.0; headpoints[6].y=BLOCKHEIGHT*(1.75);
headpoints[7].x=0.65*1.0; headpoints[7].y=BLOCKHEIGHT*(2.35);
headpoints[8].x=0.62*1.0; headpoints[8].y=BLOCKHEIGHT*(2.60);
headpoints[9].x=0.55*1.0; headpoints[9].y=BLOCKHEIGHT*(2.80);
headpoints[10].x=0.4; headpoints[10].y=BLOCKHEIGHT*(2.95);
headpoints[11].x=0.3; headpoints[11].y=BLOCKHEIGHT*3.5-pillarroundness;
headpoints[12].x=0.3-pillarroundness; headpoints[12].y=BLOCKHEIGHT*3.5;
headpoints[13].x=0; headpoints[13].y=BLOCKHEIGHT*3.5;
headpoints[11].x=0; headpoints[11].y=BLOCKHEIGHT*3.0;
glColor4f(0.8,0.8,0.0,1.0);
faceTexture->enable();
glBlendFunc(GL_ONE, GL_SRC_ALPHA);
createLathedSurface(headpoints,NULL,12,16,24);
faceTexture->disable();
glTranslatef(0, BLOCKHEIGHT*3-0.05, 0);
createKnob(16); faceTexture->enable();
glBlendFunc(GL_ONE, GL_SRC_ALPHA);
createLathedSurface(headpoints,NULL,12,16,24);
faceTexture->disable();
glPopMatrix(); glTranslatef(0, BLOCKHEIGHT*3-0.05, 0);
glEndList(); createKnob(16);
glPopMatrix();
glEndList();
} }
void HeadAppearance::draw(void){ void HeadAppearance::draw(void){
glCallList(gllist); glCallList(gllist);
} }
@ -316,106 +244,106 @@ void HeadAppearance::draw(void){
FlowerAppearance::FlowerAppearance(int color1, int color2, int color3){ FlowerAppearance::FlowerAppearance(int color1, int color2, int color3){
gllist = glGenLists(1); gllist = glGenLists(1);
this->color1 = color1; this->color1 = color1;
this->color2 = color2; this->color2 = color2;
this->color3 = color3; this->color3 = color3;
} }
void FlowerAppearance::prepare(void){ void FlowerAppearance::prepare(void){
glNewList(gllist, GL_COMPILE); glNewList(gllist, GL_COMPILE);
glPushMatrix(); glPushMatrix();
int colors[]={color1,color2,color3}; int colors[]={color1,color2,color3};
glColor3f(0.0,0.6,0.0); glColor3f(0.0,0.6,0.0);
point2d basepoints[8]; point2d basepoints[8];
basepoints[0].x=0.4; basepoints[0].y=0; basepoints[0].x=0.4; basepoints[0].y=0;
basepoints[1].x=0.4; basepoints[1].y=BLOCKHEIGHT*1.5-pillarroundness; basepoints[1].x=0.4; basepoints[1].y=BLOCKHEIGHT*1.5-pillarroundness;
basepoints[2].x=0.4-pillarroundness; basepoints[2].y=BLOCKHEIGHT*1.5; basepoints[2].x=0.4-pillarroundness; basepoints[2].y=BLOCKHEIGHT*1.5;
basepoints[3].x=0.3+pillarroundness; basepoints[3].y=BLOCKHEIGHT*1.5; basepoints[3].x=0.3+pillarroundness; basepoints[3].y=BLOCKHEIGHT*1.5;
basepoints[4].x=0.3; basepoints[4].y=BLOCKHEIGHT*1.5+pillarroundness; basepoints[4].x=0.3; basepoints[4].y=BLOCKHEIGHT*1.5+pillarroundness;
basepoints[5].x=0.3; basepoints[5].y=BLOCKHEIGHT*2.0-pillarroundness; basepoints[5].x=0.3; basepoints[5].y=BLOCKHEIGHT*2.0-pillarroundness;
basepoints[6].x=0.3-pillarroundness; basepoints[6].y=BLOCKHEIGHT*2.0; basepoints[6].x=0.3-pillarroundness; basepoints[6].y=BLOCKHEIGHT*2.0;
basepoints[7].x=0; basepoints[7].y=BLOCKHEIGHT*2.0; basepoints[7].x=0; basepoints[7].y=BLOCKHEIGHT*2.0;
point2d basederivates[8]; point2d basederivates[8];
basederivates[0].x=0; basederivates[0].y=basepoints[1].y-basepoints[0].y; basederivates[0].x=0; basederivates[0].y=basepoints[1].y-basepoints[0].y;
basederivates[1].x=0; basederivates[1].y=basepoints[2].y-basepoints[1].y; basederivates[1].x=0; basederivates[1].y=basepoints[2].y-basepoints[1].y;
basederivates[2].x=basepoints[2].x-basepoints[1].x; basederivates[2].y=0; basederivates[2].x=basepoints[2].x-basepoints[1].x; basederivates[2].y=0;
basederivates[3].x=basepoints[4].x-basepoints[3].x; basederivates[3].y=0; basederivates[3].x=basepoints[4].x-basepoints[3].x; basederivates[3].y=0;
basederivates[4].x=0; basederivates[4].y=basepoints[4].y-basepoints[3].y; basederivates[4].x=0; basederivates[4].y=basepoints[4].y-basepoints[3].y;
basederivates[5].x=0; basederivates[5].y=basepoints[6].y-basepoints[5].y; basederivates[5].x=0; basederivates[5].y=basepoints[6].y-basepoints[5].y;
basederivates[6].x=basepoints[6].x-basepoints[5].x; basederivates[6].y=0; basederivates[6].x=basepoints[6].x-basepoints[5].x; basederivates[6].y=0;
basederivates[7].x=basepoints[7].x-basepoints[6].x; basederivates[7].y=0; basederivates[7].x=basepoints[7].x-basepoints[6].x; basederivates[7].y=0;
createLathedSurface(basepoints,basederivates,8,8,8); createLathedSurface(basepoints,basederivates,8,8,8);
int i,j; int i,j;
for (i=0;i<3;i++){ for (i=0;i<3;i++){
glColor3f(0.0,0.6,0.0); glColor3f(0.0,0.6,0.0);
glPushMatrix(); glPushMatrix();
glTranslatef(0,BLOCKHEIGHT,0.4); glTranslatef(0,BLOCKHEIGHT,0.4);
glRotatef(20-90,1,0,0); glRotatef(20-90,1,0,0);
gluCylinder(gluNewQuadric(),0.1,0.1,BLOCKHEIGHT*(3+i*0.7),4,1); gluCylinder(gluNewQuadric(),0.1,0.1,BLOCKHEIGHT*(3+i*0.7),4,1);
glRotatef(90,1,0,0); glRotatef(90,1,0,0);
glTranslatef(0,BLOCKHEIGHT*(3+i*0.7),0); glTranslatef(0,BLOCKHEIGHT*(3+i*0.7),0);
float r,g,b; float r,g,b;
switch(colors[i]){ switch(colors[i]){
case FLOWER_RED: case FLOWER_RED:
r=1.0; g=0.0; b=0.0; r=1.0; g=0.0; b=0.0;
break; break;
case FLOWER_YELLOW: case FLOWER_YELLOW:
r=1.0; g=1.0; b=0.0; r=1.0; g=1.0; b=0.0;
break; break;
case FLOWER_WHITE: case FLOWER_WHITE:
r=1.0; g=1.0; b=1.0; r=1.0; g=1.0; b=1.0;
break; break;
} }
glDisable(GL_CULL_FACE); glDisable(GL_CULL_FACE);
glColor3f(r,g,b); glColor3f(r,g,b);
createKnob(); createKnob();
/* Terälehdet tehdään triangle-fanilla */ /* Terälehdet tehdään triangle-fanilla */
glBegin(GL_TRIANGLE_FAN); glBegin(GL_TRIANGLE_FAN);
glNormal3f(0.0,1.0,0.0); glNormal3f(0.0,1.0,0.0);
glVertex3f(0.0,0.0,0.0); glVertex3f(0.0,0.0,0.0);
float x,z; float x,z;
for (j=0;j<24;j+=4){ for (j=0;j<24;j+=4){
x=sin((j+0)*2*PI/24)*0.4; x=sin((j+0)*2*PI/24)*0.4;
z=cos((j+0)*2*PI/24)*0.4; z=cos((j+0)*2*PI/24)*0.4;
glVertex3f(x,0.0,z); glVertex3f(x,0.0,z);
x=sin((j+1)*2*PI/24)*0.55; x=sin((j+1)*2*PI/24)*0.55;
z=cos((j+1)*2*PI/24)*0.55; z=cos((j+1)*2*PI/24)*0.55;
glVertex3f(x,0.0,z); glVertex3f(x,0.0,z);
x=sin((j+2)*2*PI/24)*0.6; x=sin((j+2)*2*PI/24)*0.6;
z=cos((j+2)*2*PI/24)*0.6; z=cos((j+2)*2*PI/24)*0.6;
glVertex3f(x,0.0,z); glVertex3f(x,0.0,z);
x=sin((j+3)*2*PI/24)*0.55; x=sin((j+3)*2*PI/24)*0.55;
z=cos((j+3)*2*PI/24)*0.55; z=cos((j+3)*2*PI/24)*0.55;
glVertex3f(x,0.0,z); glVertex3f(x,0.0,z);
} }
glVertex3f(0,0.0,0.4); glVertex3f(0,0.0,0.4);
glEnd(); glEnd();
glEnable(GL_CULL_FACE); glEnable(GL_CULL_FACE);
glPopMatrix(); glPopMatrix();
glRotatef(120,0,1,0); glRotatef(120,0,1,0);
} }
glPopMatrix(); glPopMatrix();
glEndList(); glEndList();
} }
void FlowerAppearance::draw(void){ void FlowerAppearance::draw(void){
glCallList(gllist); glCallList(gllist);
} }
@ -423,100 +351,100 @@ void FlowerAppearance::draw(void){
LampAppearance::LampAppearance(void){ LampAppearance::LampAppearance(void){
gllist = glGenLists(1); gllist = glGenLists(1);
} }
void LampAppearance::prepare(void){ void LampAppearance::prepare(void){
glNewList(gllist, GL_COMPILE); glNewList(gllist, GL_COMPILE);
glPushMatrix();
//glTranslatef(0, -1, 0); glPushMatrix();
//glRotatef(180, 1, 0, 0); //glTranslatef(0, -1, 0);
//glRotatef(180, 1, 0, 0);
glDisable(GL_LIGHTING); glDisable(GL_LIGHTING);
point2d lightpoints[11]; point2d lightpoints[11];
lightpoints[0].x=0.4; lightpoints[0].y=BLOCKHEIGHT*(0); lightpoints[0].x=0.4; lightpoints[0].y=BLOCKHEIGHT*(0);
lightpoints[1].x=0.55; lightpoints[1].y=BLOCKHEIGHT*(0); lightpoints[1].x=0.55; lightpoints[1].y=BLOCKHEIGHT*(0);
lightpoints[2].x=0.62; lightpoints[2].y=BLOCKHEIGHT*(0+0.15); lightpoints[2].x=0.62; lightpoints[2].y=BLOCKHEIGHT*(0+0.15);
lightpoints[3].x=0.65; lightpoints[3].y=BLOCKHEIGHT*(0+0.5); lightpoints[3].x=0.65; lightpoints[3].y=BLOCKHEIGHT*(0+0.5);
lightpoints[4].x=0.68; lightpoints[4].y=BLOCKHEIGHT*(0+1.25); lightpoints[4].x=0.68; lightpoints[4].y=BLOCKHEIGHT*(0+1.25);
lightpoints[5].x=0.65; lightpoints[5].y=BLOCKHEIGHT*(0+2); lightpoints[5].x=0.65; lightpoints[5].y=BLOCKHEIGHT*(0+2);
lightpoints[6].x=0.62; lightpoints[6].y=BLOCKHEIGHT*(0+2.35); lightpoints[6].x=0.62; lightpoints[6].y=BLOCKHEIGHT*(0+2.35);
lightpoints[7].x=0.55; lightpoints[7].y=BLOCKHEIGHT*(0+2.5); lightpoints[7].x=0.55; lightpoints[7].y=BLOCKHEIGHT*(0+2.5);
lightpoints[8].x=0.4; lightpoints[8].y=BLOCKHEIGHT*(0+2.5); lightpoints[8].x=0.4; lightpoints[8].y=BLOCKHEIGHT*(0+2.5);
lightpoints[9].x=0.4; lightpoints[9].y=BLOCKHEIGHT*(0+3); lightpoints[9].x=0.4; lightpoints[9].y=BLOCKHEIGHT*(0+3);
lightpoints[10].x=0.0; lightpoints[10].y=BLOCKHEIGHT*(0+3); lightpoints[10].x=0.0; lightpoints[10].y=BLOCKHEIGHT*(0+3);
glColor4f(0.8,0.8,0.8,0.5); glColor4f(0.8,0.8,0.8,0.5);
glEnable(GL_BLEND); glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
createLathedSurface(lightpoints,NULL,11,8,11); createLathedSurface(lightpoints,NULL,11,8,11);
glEnable(GL_LIGHTING); glEnable(GL_LIGHTING);
/*glColor3f(0.5, 0.5, 0.5); /*glColor3f(0.5, 0.5, 0.5);
glBegin(GL_LINES); glBegin(GL_LINES);
glVertex3f(0, 1, 0); glVertex3f(0, 1, 0);
glVertex3f(0, -100, 0); glVertex3f(0, -100, 0);
glEnd();*/ glEnd();*/
/*float screencoords[3] /*float screencoords[3]
getPointCoordinates(0,lighty,0); getPointCoordinates(0,lighty,0);
glLoadIdentity(); glLoadIdentity();
glTranslatef(screencoords.x,screencoords.y,0); glTranslatef(screencoords.x,screencoords.y,0);
glDisable(GL_DEPTH_TEST); glDisable(GL_DEPTH_TEST);
glEnable(GL_CULL_FACE); glEnable(GL_CULL_FACE);
glEnable(GL_BLEND); glEnable(GL_BLEND);
glBlendFunc(GL_ONE,GL_ONE); glBlendFunc(GL_ONE,GL_ONE);
glEnable(GL_TEXTURE_2D); glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D,*flaretexture); glBindTexture(GL_TEXTURE_2D,*flaretexture);
glMatrixMode(GL_PROJECTION); glMatrixMode(GL_PROJECTION);
glPushMatrix(); glPushMatrix();
glLoadIdentity(); glLoadIdentity();
float sizey=8.0/distance*staticlightflarebrightnesses[lightnumber]; float sizey=8.0/distance*staticlightflarebrightnesses[lightnumber];
float sizex=sizey*height/width; float sizex=sizey*height/width;
if (distance>0.5){ if (distance>0.5){
glBegin(GL_QUADS); glBegin(GL_QUADS);
glColor3f(staticlightflarebrightnesses[lightnumber],staticlightflarebrightnesses[lightnumber],staticlightflarebrightnesses[lightnumber]); glColor3f(staticlightflarebrightnesses[lightnumber],staticlightflarebrightnesses[lightnumber],staticlightflarebrightnesses[lightnumber]);
glTexCoord2f(0.0, 0.0); glTexCoord2f(0.0, 0.0);
glVertex2f(-sizex,sizey); glVertex2f(-sizex,sizey);
glTexCoord2f(0.0, 1.0); glTexCoord2f(0.0, 1.0);
glVertex2f(-sizex,-sizey); glVertex2f(-sizex,-sizey);
glTexCoord2f(1.0, 1.0);
glVertex2f( sizex,-sizey);
glTexCoord2f(1.0, 0.0);
glVertex2f( sizex,sizey);
glEnd();
}
glDisable(GL_TEXTURE_2D); glTexCoord2f(1.0, 1.0);
glVertex2f( sizex,-sizey);
glDisable(GL_BLEND); glTexCoord2f(1.0, 0.0);
glVertex2f( sizex,sizey);
glEnd();
}
glPopMatrix(); glDisable(GL_TEXTURE_2D);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();*/ glDisable(GL_BLEND);
glPopMatrix();
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();*/
glPopMatrix(); glPopMatrix();
glEndList(); glEndList();
} }
void LampAppearance::draw(void){ void LampAppearance::draw(void){
glCallList(gllist); glCallList(gllist);
} }

View file

@ -1,57 +1,3 @@
/*
* $Id: legoblocks.h,v 1.14 2002/07/19 20:33:28 msell Exp $
*
*
* $Log: legoblocks.h,v $
* Revision 1.14 2002/07/19 20:33:28 msell
* #pragma once -> #ifndef
*
* Revision 1.13 2002/07/18 23:05:31 msell
* Partikkelit ja kakkospelaajan liike
*
* Revision 1.12 2002/07/17 20:32:47 msell
* Detail-optio toimii
*
* Revision 1.11 2002/07/16 17:16:34 msell
* Fontit ja valikot
*
* Revision 1.10 2002/07/16 00:42:43 msell
* Uusia skyboxeja ja areenan säätöä
*
* Revision 1.9 2002/07/15 20:32:35 msell
* Uudet valot ja ulkoasun parantelua
*
* Revision 1.8 2002/07/15 15:22:08 msell
* Parantelua
*
* Revision 1.7 2002/06/24 14:12:15 msell
* Nyt toimii sphere -> mesh -törmäykset, ihan tosi
*
* Revision 1.6 2002/06/20 00:21:01 jkaarlas
* materiaali- ja tekstuurihommia edistetty
*
* Revision 1.5 2002/06/17 20:49:04 msell
* free -> SDL_FreeSurface
*
* Revision 1.4 2002/06/05 18:39:05 msell
* Jotain pientä
*
* Revision 1.3 2002/06/05 15:00:41 msell
* Palikoihin lisää detailia, facet jaetaan halutun kokosiin osiin
*
* Revision 1.2 2002/06/04 16:28:32 msell
* #pragma once
*
* Revision 1.1 2002/06/03 23:06:38 msell
* no message
*
*
*
*
* $Date: 2002/07/19 20:33:28 $
*
*/
#ifndef __LEGOBLOCKS_H_INCLUDED__ #ifndef __LEGOBLOCKS_H_INCLUDED__
#define __LEGOBLOCKS_H_INCLUDED__ #define __LEGOBLOCKS_H_INCLUDED__
@ -64,30 +10,30 @@
class BasicBlock : public MeshObject{ class BasicBlock : public MeshObject{
private: private:
int width, height, depth; int width, height, depth;
public: public:
BasicBlock(int width, int height, int depth); BasicBlock(int width, int height, int depth);
void setColor(float red, float green, float blue); void setColor(float red, float green, float blue);
}; };
class BasicBlockAppearance : public Appearance{ class BasicBlockAppearance : public Appearance{
private: private:
int width, height, depth; int width, height, depth;
int gllist; int gllist;
protected: protected:
bool usematerial; bool usematerial;
public: public:
float displacement[3]; float displacement[3];
BasicBlockAppearance(int width, int height, int depth); BasicBlockAppearance(int width, int height, int depth);
virtual void prepare(void); virtual void prepare(void);
virtual void draw(void); virtual void draw(void);
}; };
void drawDetailRectangle(float width, float height); void drawDetailRectangle(float width, float height);
@ -101,13 +47,13 @@ void createKnob(int knobsegments = -1);
class HeadAppearance : public Appearance{ class HeadAppearance : public Appearance{
private: private:
int gllist; int gllist;
public: public:
HeadAppearance(void); HeadAppearance(void);
void prepare(void); void prepare(void);
void draw(void); void draw(void);
}; };
@ -118,27 +64,27 @@ public:
class FlowerAppearance : public Appearance{ class FlowerAppearance : public Appearance{
private: private:
int gllist; int gllist;
int color1, color2, color3; int color1, color2, color3;
public: public:
FlowerAppearance(int color1, int color2, int color3); FlowerAppearance(int color1, int color2, int color3);
void prepare(void); void prepare(void);
void draw(void); void draw(void);
}; };
class LampAppearance : public Appearance{ class LampAppearance : public Appearance{
private: private:
int gllist; int gllist;
public: public:
LampAppearance(void); LampAppearance(void);
void prepare(void); void prepare(void);
void draw(void); void draw(void);
}; };

File diff suppressed because it is too large Load diff

View file

@ -1,77 +1,3 @@
/*
* $Id: legoman.h,v 1.21 2002/07/22 12:07:36 msell Exp $
*
*
* $Log: legoman.h,v $
* Revision 1.21 2002/07/22 12:07:36 msell
* Pää kiinni
*
* Revision 1.20 2002/07/22 06:08:18 msell
* Filenimet pienellä
*
* Revision 1.19 2002/07/22 01:14:14 msell
* Lopetussysteemi
*
* Revision 1.18 2002/07/21 22:50:39 msell
* no message
*
* Revision 1.17 2002/07/21 20:14:28 msell
* no message
*
* Revision 1.16 2002/07/21 15:16:41 msell
* no message
*
* Revision 1.15 2002/07/21 15:03:12 msell
* Äänet disabloitu
*
* Revision 1.14 2002/07/19 20:33:28 msell
* #pragma once -> #ifndef
*
* Revision 1.13 2002/07/19 18:59:46 msell
* Alkuhommaa ja säätöä
*
* Revision 1.12 2002/07/18 23:05:31 msell
* Partikkelit ja kakkospelaajan liike
*
* Revision 1.11 2002/07/17 22:45:54 msell
* Ääniä vähän
*
* Revision 1.10 2002/07/17 16:40:33 msell
* Resoluution vaihto
*
* Revision 1.9 2002/07/16 07:27:32 jkaarlas
* nyt latautuu kämmen. paikka ja väri pitää vielä säätää
*
* Revision 1.8 2002/07/14 21:40:43 msell
* Conflictit pois, liikkumiset (hyppy, kävely, lyönti), uusi areena
*
* Revision 1.7 2002/07/14 21:22:39 jkaarlas
* skybox ja ukkojen säätö
*
* Revision 1.6 2002/07/11 18:33:58 jkaarlas
* mallit paikoillaan, vaatii säätöä
*
* Revision 1.5 2002/07/10 17:13:44 msell
* Törmäystarkastelun parantelua
*
* Revision 1.4 2002/07/08 22:53:38 msell
* Säätöä
*
* Revision 1.3 2002/07/08 18:28:47 msell
* Törmäystä ja ukkoja
*
* Revision 1.2 2002/07/07 23:05:22 msell
* Osien liimaaminen toisiinsa (kesken)
*
* Revision 1.1 2002/07/07 17:53:21 msell
* Legoukon alku
*
*
*
* $Date: 2002/07/22 12:07:36 $
*
*/
#ifndef __LEGOMAN_H_INCLUDED__ #ifndef __LEGOMAN_H_INCLUDED__
#define __LEGOMAN_H_INCLUDED__ #define __LEGOMAN_H_INCLUDED__
@ -114,135 +40,135 @@ const char RIGHTPALMASC[] = DATAPATH"rightpalm.asc";
class BodyPart : public Object{ class BodyPart : public Object{
private: private:
float energy; float energy;
float strength; float strength;
Legoman *parent; Legoman *parent;
bool attached; bool attached;
int immortal; int immortal;
public: public:
BodyPart(Legoman *parent, float strength); BodyPart(Legoman *parent, float strength);
void move(void); void move(void);
void hitForce(float speed, float *speed2, Object *source); void hitForce(float speed, float *speed2, Object *source);
void makeDamage(float amount); void makeDamage(float amount);
void reset(void); void reset(void);
friend class DamageVisual; friend class DamageVisual;
friend class Legoman; friend class Legoman;
}; };
class Sensor{ class Sensor{
private: private:
float relativeposition[3]; float relativeposition[3];
Object *object; Object *object;
float position[3], oldposition[3]; float position[3], oldposition[3];
float velocity[3], oldvelocity[3]; float velocity[3], oldvelocity[3];
float acceleration[3]; float acceleration[3];
public: public:
Sensor(); Sensor();
void attach(Object *object, float *relativeposition); void attach(Object *object, float *relativeposition);
void attach(Object *object); void attach(Object *object);
void update(void); void update(void);
void getPosition(float *target); void getPosition(float *target);
void getVelocity(float *target); void getVelocity(float *target);
void getAcceleration(float *target); void getAcceleration(float *target);
}; };
class Legoman{ class Legoman{
private: private:
int side; int side;
bool alive; bool alive;
BodyPart *head; BodyPart *head;
BodyPart *torso; BodyPart *torso;
BodyPart *waist; BodyPart *waist;
BodyPart *lefthand, *righthand; BodyPart *lefthand, *righthand;
BodyPart *leftleg, *rightleg; BodyPart *leftleg, *rightleg;
DamageVisual *headvisual; DamageVisual *headvisual;
DamageVisual *torsovisual; DamageVisual *torsovisual;
DamageVisual *lefthandvisual, *righthandvisual; DamageVisual *lefthandvisual, *righthandvisual;
DamageVisual *leftlegvisual, *rightlegvisual; DamageVisual *leftlegvisual, *rightlegvisual;
ObjectLink *leftleglink, *rightleglink; ObjectLink *leftleglink, *rightleglink;
ObjectLink *lefthandlink, *righthandlink; ObjectLink *lefthandlink, *righthandlink;
ObjectLink *lll, *rll; ObjectLink *lll, *rll;
ObjectLink *leftleglinks[3], *rightleglinks[3]; ObjectLink *leftleglinks[3], *rightleglinks[3];
ObjectLink *lefthandlinks[3], *righthandlinks[3]; ObjectLink *lefthandlinks[3], *righthandlinks[3];
ObjectLink *headlinks[3]; ObjectLink *headlinks[3];
objectlist *harmfulobjects; objectlist *harmfulobjects;
Legoman *opponent; Legoman *opponent;
Sensor *headsensor, *torsosensor; Sensor *headsensor, *torsosensor;
int walkphase, walkdelay; int walkphase, walkdelay;
int jumpphase; int jumpphase;
int hitside; int hitside;
bool jumpenabled; bool jumpenabled;
int hitcounter; int hitcounter;
World *world; World *world;
void balance(void); void balance(void);
void updateLegs(void); void updateLegs(void);
bool isStanding(void); bool isStanding(void);
bool isOnGround(void); bool isOnGround(void);
float getInvMass(void); float getInvMass(void);
void fallOff(void); void fallOff(void);
void releasePart(BodyPart *part); void releasePart(BodyPart *part);
void die(void); void die(void);
public: public:
Legoman(int side); Legoman(int side);
void insertToWorld(World *world); void insertToWorld(World *world);
void heal(void); void heal(void);
void addHarmfulObject(Object *object); void addHarmfulObject(Object *object);
bool isHarmfulObject(Object *object); bool isHarmfulObject(Object *object);
void addOpponent(Legoman *opponent); void addOpponent(Legoman *opponent);
//Call once per frame //Call once per frame
void update(void); void update(void);
//Lock both legs at the same time by calling //Lock both legs at the same time by calling
//lockLeg(LEFTLEG | RIGHTLEG); //lockLeg(LEFTLEG | RIGHTLEG);
void lockPart(int part); void lockPart(int part);
void unlockPart(int part); void unlockPart(int part);
//Relative movement //Relative movement
void move(float *movement); void move(float *movement);
void turn(float amount); void turn(float amount);
void walk(float amount); void walk(float amount);
void jump(void); void jump(void);
void hit(void); void hit(void);
bool isAlive(void); bool isAlive(void);
Legoman *getOpponent(void); Legoman *getOpponent(void);
void drawVisuals(); void drawVisuals();
friend class BodyPart; friend class BodyPart;
friend void drawEnd(int framecount); friend void drawEnd(int framecount);
}; };
@ -255,16 +181,16 @@ extern Texture *damageLeg;
class DamageVisual{ class DamageVisual{
private: private:
BodyPart *object; BodyPart *object;
float x1, y1, x2, y2; float x1, y1, x2, y2;
float tx1, ty1, tx2, ty2; float tx1, ty1, tx2, ty2;
Texture *texture; Texture *texture;
public: public:
DamageVisual(BodyPart *object, Texture *texture, bool mirror, DamageVisual(BodyPart *object, Texture *texture, bool mirror,
float x1, float y1, float x2, float y2); float x1, float y1, float x2, float y2);
void draw(void); void draw(void);
}; };
#endif #endif

View file

@ -1,29 +1,3 @@
/*
* $Id: light.cpp,v 1.5 2002/07/15 20:32:35 msell Exp $
*
*
* $Log: light.cpp,v $
* Revision 1.5 2002/07/15 20:32:35 msell
* Uudet valot ja ulkoasun parantelua
*
* Revision 1.4 2002/06/17 20:49:05 msell
* free -> SDL_FreeSurface
*
* Revision 1.3 2002/06/16 01:04:58 jkaarlas
* tulipa säädettyä includejen kanssa. oon tod.näk. eri mieltä aamulla
*
* Revision 1.2 2002/06/03 23:20:43 msell
* no message
*
* Revision 1.1 2002/05/18 12:29:35 msell
* Valot ja äänijärjestelmän parantelua
*
*
*
* $Date: 2002/07/15 20:32:35 $
*
*/
#include "main.h" #include "main.h"
#include "light.h" #include "light.h"
@ -36,183 +10,183 @@ static int glnextlightnum = 0;
static Light *lights[GL_MAX_LIGHTS]; static Light *lights[GL_MAX_LIGHTS];
Light::Light(void){ Light::Light(void){
setPosition(0, 0, 0); setPosition(0, 0, 0);
setColor(1, 1, 1); setColor(1, 1, 1);
setSpecular(0, 0, 0); setSpecular(0, 0, 0);
setAttenuation(1, 0, 0); setAttenuation(1, 0, 0);
setEnabled(false); setEnabled(false);
glnum = GL_LIGHT0 + glnextlightnum; glnum = GL_LIGHT0 + glnextlightnum;
lights[glnextlightnum] = this; lights[glnextlightnum] = this;
glnextlightnum++; glnextlightnum++;
} }
void Light::setPosition(float x, float y, float z){ void Light::setPosition(float x, float y, float z){
position[0] = x; position[0] = x;
position[1] = y; position[1] = y;
position[2] = z; position[2] = z;
position[3] = 1; position[3] = 1;
} }
void Light::setDirection(float x, float y, float z){ void Light::setDirection(float x, float y, float z){
position[0] = -x; position[0] = -x;
position[1] = -y; position[1] = -y;
position[2] = -z; position[2] = -z;
position[3] = 0; position[3] = 0;
} }
void Light::setColor(float red, float green, float blue){ void Light::setColor(float red, float green, float blue){
diffuse[0] = red; diffuse[0] = red;
diffuse[1] = green; diffuse[1] = green;
diffuse[2] = blue; diffuse[2] = blue;
diffuse[3] = 1; diffuse[3] = 1;
glLightfv(glnum, GL_DIFFUSE, diffuse); glLightfv(glnum, GL_DIFFUSE, diffuse);
} }
void Light::setSpecular(float red, float green, float blue){ void Light::setSpecular(float red, float green, float blue){
specular[0] = red; specular[0] = red;
specular[1] = green; specular[1] = green;
specular[2] = blue; specular[2] = blue;
specular[3] = 1; specular[3] = 1;
glLightfv(glnum, GL_SPECULAR, specular); glLightfv(glnum, GL_SPECULAR, specular);
} }
void Light::setAttenuation(float constant, float linear, float quadratic){ void Light::setAttenuation(float constant, float linear, float quadratic){
attenuation[0] = constant; attenuation[0] = constant;
attenuation[1] = linear; attenuation[1] = linear;
attenuation[2] = quadratic; attenuation[2] = quadratic;
glLightf(glnum, GL_CONSTANT_ATTENUATION, attenuation[0]); glLightf(glnum, GL_CONSTANT_ATTENUATION, attenuation[0]);
glLightf(glnum, GL_LINEAR_ATTENUATION, attenuation[1]); glLightf(glnum, GL_LINEAR_ATTENUATION, attenuation[1]);
glLightf(glnum, GL_QUADRATIC_ATTENUATION, attenuation[2]); glLightf(glnum, GL_QUADRATIC_ATTENUATION, attenuation[2]);
} }
void Light::setEnabled(bool enabled){ void Light::setEnabled(bool enabled){
this->enabled = enabled; this->enabled = enabled;
if (enabled) glEnable(glnum); if (enabled) glEnable(glnum);
else glDisable(glnum); else glDisable(glnum);
} }
void Light::glUpdate(void){ void Light::glUpdate(void){
glLightfv(glnum, GL_POSITION, position); glLightfv(glnum, GL_POSITION, position);
} }
extern Camera camera; extern Camera camera;
void Light::createFlare(void){ void Light::createFlare(void){
glPushMatrix(); glPushMatrix();
GLint viewport[4]; GLint viewport[4];
glGetIntegerv(GL_VIEWPORT, viewport); glGetIntegerv(GL_VIEWPORT, viewport);
int width = viewport[2]; int width = viewport[2];
int height = viewport[3]; int height = viewport[3];
glTranslatef(position[0], position[1], position[2]);
GLboolean lightingenabled = glIsEnabled(GL_LIGHTING); glTranslatef(position[0], position[1], position[2]);
GLboolean lightingenabled = glIsEnabled(GL_LIGHTING);
glDisable(GL_LIGHTING); glDisable(GL_LIGHTING);
/*float cx=cameratarget.x-cameraposition.x; /*float cx=cameratarget.x-cameraposition.x;
float cy=cameratarget.y-cameraposition.y; float cy=cameratarget.y-cameraposition.y;
float cz=cameratarget.z-cameraposition.z; float cz=cameratarget.z-cameraposition.z;
float len=sqrt(cx*cx+cy*cy+cz*cz); float len=sqrt(cx*cx+cy*cy+cz*cz);
cx/=len; cx/=len;
cy/=len; cy/=len;
cz/=len;*/ cz/=len;*/
float dir[3]; float dir[3];
float cameratarget[3], cameraposition[3]; float cameratarget[3], cameraposition[3];
camera.getTarget(cameratarget); camera.getTarget(cameratarget);
camera.getPosition(cameraposition); camera.getPosition(cameraposition);
vectorSub(dir, cameratarget, cameraposition); vectorSub(dir, cameratarget, cameraposition);
vectorNormalize(dir); vectorNormalize(dir);
float dir2[3]; float dir2[3];
vectorSub(dir2, position, cameraposition); vectorSub(dir2, position, cameraposition);
float distance = vectorDot(dir2, dir); float distance = vectorDot(dir2, dir);
/*float xd=(staticlightpositions[lightnumber].x-cameraposition.x)*cx; /*float xd=(staticlightpositions[lightnumber].x-cameraposition.x)*cx;
float yd=(staticlightpositions[lightnumber].y-cameraposition.y)*cy; float yd=(staticlightpositions[lightnumber].y-cameraposition.y)*cy;
float zd=(staticlightpositions[lightnumber].z-cameraposition.z)*cz; float zd=(staticlightpositions[lightnumber].z-cameraposition.z)*cz;
float distance=xd+yd+zd;*/ float distance=xd+yd+zd;*/
float screencoords[3]; float screencoords[3];
/*GLint viewport[4]; /*GLint viewport[4];
glGetIntegerv(GL_VIEWPORT, viewport); glGetIntegerv(GL_VIEWPORT, viewport);
int width=viewport[2]; int width=viewport[2];
int height=viewport[3];*/ int height=viewport[3];*/
GLdouble modelviewm[16], projectionm[16]; GLdouble modelviewm[16], projectionm[16];
glGetDoublev(GL_MODELVIEW_MATRIX, modelviewm); glGetDoublev(GL_MODELVIEW_MATRIX, modelviewm);
glGetDoublev(GL_PROJECTION_MATRIX, projectionm); glGetDoublev(GL_PROJECTION_MATRIX, projectionm);
GLdouble wx,wy,wz; GLdouble wx,wy,wz;
if (gluProject(0, 0, 0, modelviewm, projectionm, viewport, &wx, &wy, &wz) == GL_FALSE){ if (gluProject(0, 0, 0, modelviewm, projectionm, viewport, &wx, &wy, &wz) == GL_FALSE){
printf("Failure\n"); printf("Failure\n");
} }
screencoords[0] = (float)(2*wx-width)/width; screencoords[0] = (float)(2*wx-width)/width;
screencoords[1] = (float)(2*wy-height)/height; screencoords[1] = (float)(2*wy-height)/height;
screencoords[2] = wz; screencoords[2] = wz;
//getPointCoordinates(screencoords); //getPointCoordinates(screencoords);
//point3d screencoords = getPointCoordinates(0, 0, 0); //point3d screencoords = getPointCoordinates(0, 0, 0);
glLoadIdentity();
glTranslatef(screencoords[0], screencoords[1], 0);
glDisable(GL_DEPTH_TEST);
glEnable(GL_CULL_FACE);
glEnable(GL_BLEND);
glBlendFunc(GL_ONE,GL_ONE); glLoadIdentity();
//glEnable(GL_TEXTURE_2D); glTranslatef(screencoords[0], screencoords[1], 0);
//glBindTexture(GL_TEXTURE_2D, flaretexture->getId()); glDisable(GL_DEPTH_TEST);
glEnable(GL_CULL_FACE);
glEnable(GL_BLEND);
glMatrixMode(GL_PROJECTION); glBlendFunc(GL_ONE,GL_ONE);
glPushMatrix(); //glEnable(GL_TEXTURE_2D);
glLoadIdentity(); //glBindTexture(GL_TEXTURE_2D, flaretexture->getId());
float sizey = 6.0/distance * 1.0;//staticlightflarebrightnesses[lightnumber];
float sizex = sizey * height/width;
if (distance>0.5){ glMatrixMode(GL_PROJECTION);
glBegin(GL_QUADS); glPushMatrix();
//glColor3f(staticlightflarebrightnesses[lightnumber],staticlightflarebrightnesses[lightnumber],staticlightflarebrightnesses[lightnumber]); glLoadIdentity();
glColor3fv(diffuse); float sizey = 6.0/distance * 1.0;//staticlightflarebrightnesses[lightnumber];
float sizex = sizey * height/width;
glTexCoord2f(0.0, 0.0);
glVertex2f(-sizex,sizey);
glTexCoord2f(0.0, 1.0); if (distance>0.5){
glVertex2f(-sizex,-sizey); glBegin(GL_QUADS);
//glColor3f(staticlightflarebrightnesses[lightnumber],staticlightflarebrightnesses[lightnumber],staticlightflarebrightnesses[lightnumber]);
glTexCoord2f(1.0, 1.0); glColor3fv(diffuse);
glVertex2f( sizex,-sizey);
glTexCoord2f(1.0, 0.0);
glVertex2f( sizex,sizey);
glEnd();
}
//glDisable(GL_TEXTURE_2D); glTexCoord2f(0.0, 0.0);
glVertex2f(-sizex,sizey);
glDisable(GL_BLEND); glTexCoord2f(0.0, 1.0);
glVertex2f(-sizex,-sizey);
glPopMatrix(); glTexCoord2f(1.0, 1.0);
glMatrixMode(GL_MODELVIEW); glVertex2f( sizex,-sizey);
glLoadIdentity();
if (lightingenabled) glEnable(GL_LIGHTING); glTexCoord2f(1.0, 0.0);
glEnable(GL_DEPTH_TEST); glVertex2f( sizex,sizey);
glEnd();
}
glPopMatrix(); //glDisable(GL_TEXTURE_2D);
glDisable(GL_BLEND);
glPopMatrix();
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
if (lightingenabled) glEnable(GL_LIGHTING);
glEnable(GL_DEPTH_TEST);
glPopMatrix();
} }
void updateLights(void){ void updateLights(void){
int i; int i;
for (i = 0; i < glnextlightnum; i++){ for (i = 0; i < glnextlightnum; i++){
Light *light = lights[i]; Light *light = lights[i];
light->glUpdate(); light->glUpdate();
} }
} }

View file

@ -1,53 +1,27 @@
/*
* $Id: light.h,v 1.5 2002/07/19 20:33:28 msell Exp $
*
*
* $Log: light.h,v $
* Revision 1.5 2002/07/19 20:33:28 msell
* #pragma once -> #ifndef
*
* Revision 1.4 2002/07/15 20:32:35 msell
* Uudet valot ja ulkoasun parantelua
*
* Revision 1.3 2002/06/04 16:28:32 msell
* #pragma once
*
* Revision 1.2 2002/06/03 23:20:43 msell
* no message
*
* Revision 1.1 2002/05/18 12:29:35 msell
* Valot ja äänijärjestelmän parantelua
*
*
*
* $Date: 2002/07/19 20:33:28 $
*
*/
#ifndef __LIGHT_H_INCLUDED__ #ifndef __LIGHT_H_INCLUDED__
#define __LIGHT_H_INCLUDED__ #define __LIGHT_H_INCLUDED__
class Light{ class Light{
private: private:
float position[4]; float position[4];
float diffuse[4]; float diffuse[4];
float specular[4]; float specular[4];
float attenuation[3]; float attenuation[3];
bool enabled; bool enabled;
int glnum; int glnum;
public: public:
//Creates DISABLED light //Creates DISABLED light
Light(void); Light(void);
void setPosition(float x, float y, float z); void setPosition(float x, float y, float z);
void setDirection(float x, float y, float z); void setDirection(float x, float y, float z);
void setColor(float red, float green, float blue); void setColor(float red, float green, float blue);
void setSpecular(float red, float green, float blue); void setSpecular(float red, float green, float blue);
void setAttenuation(float constant, float linear, float quadratic); void setAttenuation(float constant, float linear, float quadratic);
void setEnabled(bool enabled); void setEnabled(bool enabled);
void glUpdate(void); void glUpdate(void);
void createFlare(void); void createFlare(void);
}; };
void updateLights(void); void updateLights(void);

View file

@ -1,106 +1,3 @@
/*
* $Id: main.cpp,v 1.30 2002/07/21 15:03:12 msell Exp $
*
*
* $Log: main.cpp,v $
* Revision 1.30 2002/07/21 15:03:12 msell
* Äänet disabloitu
*
* Revision 1.29 2002/07/19 20:39:31 msell
* Linux-porttausta
*
* Revision 1.28 2002/07/19 20:33:28 msell
* #pragma once -> #ifndef
*
* Revision 1.27 2002/07/19 20:06:32 msell
* Linux-porttausta
*
* Revision 1.26 2002/07/19 18:59:46 msell
* Alkuhommaa ja säätöä
*
* Revision 1.25 2002/07/19 12:42:44 msell
* Loading...
*
* Revision 1.24 2002/07/19 12:28:29 msell
* 2D-mode
*
* Revision 1.23 2002/07/18 23:05:31 msell
* Partikkelit ja kakkospelaajan liike
*
* Revision 1.22 2002/07/17 16:40:33 msell
* Resoluution vaihto
*
* Revision 1.21 2002/07/16 17:16:34 msell
* Fontit ja valikot
*
* Revision 1.20 2002/07/14 21:40:43 msell
* Conflictit pois, liikkumiset (hyppy, kävely, lyönti), uusi areena
*
* Revision 1.19 2002/07/14 21:22:39 jkaarlas
* skybox ja ukkojen säätö
*
* Revision 1.18 2002/07/11 18:33:30 jkaarlas
* turhat äänet pois
*
* Revision 1.17 2002/07/08 22:53:38 msell
* Säätöä
*
* Revision 1.16 2002/07/04 21:05:41 msell
* Se toimii!! =)
* Törmäystarkistukset siis
*
* Revision 1.15 2002/06/20 22:50:12 msell
* Meshit
*
* Revision 1.14 2002/06/17 20:49:05 msell
* free -> SDL_FreeSurface
*
* Revision 1.13 2002/06/17 19:58:08 msell
* #includeiden parantelua
*
* Revision 1.12 2002/06/16 01:04:58 jkaarlas
* tulipa säädettyä includejen kanssa. oon tod.näk. eri mieltä aamulla
*
* Revision 1.11 2002/06/15 22:56:37 msell
* Säätöä
*
* Revision 1.10 2002/06/11 23:11:45 msell
* Törmäystarkistusta
*
* Revision 1.9 2002/06/07 21:16:51 msell
* Fysiikkaenginen alkua
*
* Revision 1.8 2002/06/02 16:57:37 msell
* Objektirakenteen pohja
*
* Revision 1.7 2002/05/19 13:40:19 msell
* Säätöä
*
* Revision 1.6 2002/05/18 12:29:35 msell
* Valot ja äänijärjestelmän parantelua
*
* Revision 1.5 2002/05/17 23:13:30 msell
* Valot
*
* Revision 1.4 2002/05/16 18:41:16 msell
* Vektorifunctioita ja kamera
*
* Revision 1.3 2002/05/15 21:07:23 msell
* Äänisäätöä
*
* Revision 1.2 2002/05/15 15:21:00 msell
* Äänisäätöä
*
* Revision 1.1 2002/05/15 14:36:39 msell
* Yksinkertainen SDL-runko (Kääntyy toistaiseksi vain windowsissa).
* Mukana myös musiikinsoitto fmodilla.
*
*
*
* $Date: 2002/07/21 15:03:12 $
*
*/
#include "main.h" #include "main.h"
#include <SDL.h> #include <SDL.h>
@ -124,125 +21,125 @@ int screenheight=768;
int screenbpp; int screenbpp;
void exitProgram(int code){ void exitProgram(int code){
SDL_Quit(); SDL_Quit();
//uninitAudio(); //uninitAudio();
exit(code); exit(code);
} }
void changeResolution(int width, int height, bool fullscreen){ void changeResolution(int width, int height, bool fullscreen){
int mode = SDL_OPENGL; int mode = SDL_OPENGL;
if (fullscreen) mode |= SDL_FULLSCREEN; if (fullscreen) mode |= SDL_FULLSCREEN;
if (!SDL_SetVideoMode(width, height, screenbpp, mode)){ if (!SDL_SetVideoMode(width, height, screenbpp, mode)){
fprintf(stderr,"Couldn't set %i*%i*%i opengl video mode: %s\n",screenwidth,screenheight,screenbpp,SDL_GetError()); fprintf(stderr,"Couldn't set %i*%i*%i opengl video mode: %s\n",screenwidth,screenheight,screenbpp,SDL_GetError());
exitProgram(-1); exitProgram(-1);
} }
setupOpengl(width, height); setupOpengl(width, height);
screenwidth = width; screenwidth = width;
screenheight = height; screenheight = height;
if (fullscreen) SDL_ShowCursor(SDL_DISABLE); if (fullscreen) SDL_ShowCursor(SDL_DISABLE);
else SDL_ShowCursor(SDL_ENABLE); else SDL_ShowCursor(SDL_ENABLE);
initScenes(); initScenes();
} }
bool keys[SDLK_LAST] = {false}; bool keys[SDLK_LAST] = {false};
void handleKeydown(SDL_keysym *keysym){ void handleKeydown(SDL_keysym *keysym){
keys[keysym->sym] = true; keys[keysym->sym] = true;
} }
void handleKeyup(SDL_keysym *keysym){ void handleKeyup(SDL_keysym *keysym){
keys[keysym->sym] = false; keys[keysym->sym] = false;
} }
void processEvents(void){ void processEvents(void){
SDL_Event event; SDL_Event event;
while (SDL_PollEvent(&event)){ while (SDL_PollEvent(&event)){
switch (event.type){ switch (event.type){
case SDL_KEYDOWN: case SDL_KEYDOWN:
handleKeydown(&event.key.keysym); handleKeydown(&event.key.keysym);
break; break;
case SDL_KEYUP: case SDL_KEYUP:
handleKeyup(&event.key.keysym); handleKeyup(&event.key.keysym);
break; break;
case SDL_VIDEORESIZE: case SDL_VIDEORESIZE:
screenwidth=event.resize.w; screenwidth=event.resize.w;
screenheight=event.resize.h; screenheight=event.resize.h;
setupOpengl(screenwidth,screenheight); setupOpengl(screenwidth,screenheight);
break; break;
case SDL_QUIT: case SDL_QUIT:
exitProgram(0); exitProgram(0);
break; break;
} }
} }
} }
int getTime(void){ int getTime(void){
#ifdef WIN32 #ifdef WIN32
return timeGetTime(); return timeGetTime();
#else #else
return SDL_GetTicks(); return SDL_GetTicks();
#endif #endif
} }
int main(int argc, char *argv[]){ int main(int argc, char *argv[]){
//printf("Initializing SDL.\n"); //printf("Initializing SDL.\n");
if ((SDL_Init(SDL_INIT_VIDEO)==-1)){ if ((SDL_Init(SDL_INIT_VIDEO)==-1)){
printf("Could not initialize SDL: %s.\n",SDL_GetError()); printf("Could not initialize SDL: %s.\n",SDL_GetError());
exitProgram(-1); exitProgram(-1);
} }
const SDL_VideoInfo *info=SDL_GetVideoInfo(); const SDL_VideoInfo *info=SDL_GetVideoInfo();
if (!info){ if (!info){
printf("Could not get video info with SDL: %s.\n",SDL_GetError()); printf("Could not get video info with SDL: %s.\n",SDL_GetError());
exitProgram(-1); exitProgram(-1);
} }
screenbpp=info->vfmt->BitsPerPixel; screenbpp=info->vfmt->BitsPerPixel;
SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 5); SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 5);
SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 5); SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 5);
SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 5); SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 5);
SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 16); SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 16);
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
atexit(SDL_Quit); atexit(SDL_Quit);
SDL_WM_SetCaption("BlockoFighter 2",NULL); SDL_WM_SetCaption("BlockoFighter 2",NULL);
initAudio(); initAudio();
changeResolution(screenwidth, screenheight, false); changeResolution(screenwidth, screenheight, false);
//printf("SDL initialized.\n"); //printf("SDL initialized.\n");
double calculatefps = 200.0; double calculatefps = 200.0;
int framecounter, oldframecounter = 0; int framecounter, oldframecounter = 0;
int currenttime; int currenttime;
int framesdrawn=0; int framesdrawn=0;
int skipframes; int skipframes;
int starttime = getTime(); int starttime = getTime();
while (1){ while (1){
do{ do{
currenttime = getTime()-starttime; currenttime = getTime()-starttime;
framecounter = calculatefps*currenttime/1000.0; framecounter = calculatefps*currenttime/1000.0;
} while (oldframecounter == framecounter); } while (oldframecounter == framecounter);
skipframes = framecounter - oldframecounter; skipframes = framecounter - oldframecounter;
for (; skipframes > 0; skipframes--){ for (; skipframes > 0; skipframes--){
calculateFrame(++oldframecounter); calculateFrame(++oldframecounter);
} }
//calculateFrame(oldframecounter++); //calculateFrame(oldframecounter++);
processEvents(); processEvents();
drawFrame(framecounter); drawFrame(framecounter);
framesdrawn++; framesdrawn++;
} }
return 0; return 0;
} }

View file

@ -1,54 +1,3 @@
/*
* $Id: main.h,v 1.13 2002/07/19 20:33:28 msell Exp $
*
*
* $Log: main.h,v $
* Revision 1.13 2002/07/19 20:33:28 msell
* #pragma once -> #ifndef
*
* Revision 1.12 2002/07/19 20:06:32 msell
* Linux-porttausta
*
* Revision 1.11 2002/07/17 16:40:33 msell
* Resoluution vaihto
*
* Revision 1.10 2002/07/16 17:16:34 msell
* Fontit ja valikot
*
* Revision 1.9 2002/07/14 21:40:43 msell
* Conflictit pois, liikkumiset (hyppy, kävely, lyönti), uusi areena
*
* Revision 1.8 2002/07/14 21:22:39 jkaarlas
* skybox ja ukkojen säätö
*
* Revision 1.7 2002/07/08 22:53:38 msell
* Säätöä
*
* Revision 1.6 2002/06/17 19:58:08 msell
* #includeiden parantelua
*
* Revision 1.5 2002/06/16 01:04:58 jkaarlas
* tulipa säädettyä includejen kanssa. oon tod.näk. eri mieltä aamulla
*
* Revision 1.4 2002/06/04 16:28:32 msell
* #pragma once
*
* Revision 1.3 2002/05/17 12:30:26 msell
* no message
*
* Revision 1.2 2002/05/16 18:41:16 msell
* Vektorifunctioita ja kamera
*
* Revision 1.1 2002/05/15 14:36:39 msell
* Yksinkertainen SDL-runko (Kääntyy toistaiseksi vain windowsissa).
* Mukana myös musiikinsoitto fmodilla.
*
*
*
* $Date: 2002/07/19 20:33:28 $
*
*/
#ifndef __MAIN_H_INCLUDED__ #ifndef __MAIN_H_INCLUDED__
#define __MAIN_H_INCLUDED__ #define __MAIN_H_INCLUDED__

View file

@ -1,41 +1,3 @@
/*
* $Id: material.cpp,v 1.10 2002/07/19 20:40:44 msell Exp $
*
*
* $Log: material.cpp,v $
* Revision 1.10 2002/07/19 20:40:44 msell
* Linux-porttausta
*
* Revision 1.9 2002/07/10 22:22:04 jkaarlas
* getColor
*
* Revision 1.8 2002/06/27 21:43:29 jkaarlas
* lisätty setTexture-funktio
*
* Revision 1.7 2002/06/27 00:08:04 msell
* Kimmotukset palloille myös pyöritettyihin mesheihin
*
* Revision 1.6 2002/06/20 00:21:01 jkaarlas
* materiaali- ja tekstuurihommia edistetty
*
* Revision 1.5 2002/06/19 22:45:29 jkaarlas
* nyt nämä menee järkevästi
*
* Revision 1.4 2002/06/17 20:49:05 msell
* free -> SDL_FreeSurface
*
* Revision 1.3 2002/06/16 01:04:58 jkaarlas
* tulipa säädettyä includejen kanssa. oon tod.näk. eri mieltä aamulla
*
* Revision 1.2 2002/06/03 23:06:38 msell
* no message
*
*
*
* $Date: 2002/07/19 20:40:44 $
*
*/
#include "main.h" #include "main.h"
#include "material.h" #include "material.h"
@ -43,7 +5,7 @@
#include "graphics.h" #include "graphics.h"
Material::Material(void){ Material::Material(void){
setColor(1, 1, 1, 1); setColor(1, 1, 1, 1);
this->texture = new Texture; this->texture = new Texture;
} }
@ -63,19 +25,19 @@ void Material::freeTexture(void){
} }
void Material::setColor(float red, float green, float blue, float alpha){ void Material::setColor(float red, float green, float blue, float alpha){
color[0] = red; color[0] = red;
color[1] = green; color[1] = green;
color[2] = blue; color[2] = blue;
color[3] = alpha; color[3] = alpha;
} }
const float* Material::getColor(void){ const float* Material::getColor(void){
return color; return color;
} }
void Material::enable(void){ void Material::enable(void){
enabled = true; enabled = true;
glColor4fv(color); glColor4fv(color);
this->texture->enable(); this->texture->enable();
} }

View file

@ -1,35 +1,3 @@
/*
* $Id: material.h,v 1.8 2002/07/19 20:33:28 msell Exp $
*
*
* $Log: material.h,v $
* Revision 1.8 2002/07/19 20:33:28 msell
* #pragma once -> #ifndef
*
* Revision 1.7 2002/07/10 22:22:04 jkaarlas
* getColor
*
* Revision 1.6 2002/06/27 21:43:29 jkaarlas
* lisätty setTexture-funktio
*
* Revision 1.5 2002/06/20 00:21:01 jkaarlas
* materiaali- ja tekstuurihommia edistetty
*
* Revision 1.4 2002/06/19 22:45:29 jkaarlas
* nyt nämä menee järkevästi
*
* Revision 1.3 2002/06/04 16:28:32 msell
* #pragma once
*
* Revision 1.2 2002/06/03 23:06:38 msell
* no message
*
*
*
* $Date: 2002/07/19 20:33:28 $
*
*/
#ifndef __MATERIAL_H_INCLUDED__ #ifndef __MATERIAL_H_INCLUDED__
#define __MATERIAL_H_INCLUDED__ #define __MATERIAL_H_INCLUDED__
@ -39,22 +7,22 @@
class Material{ class Material{
private: private:
Texture* texture; Texture* texture;
float color[4]; float color[4];
bool enabled; bool enabled;
public: public:
Material(void); Material(void);
bool loadTexture(char *path); bool loadTexture(char *path);
void freeTexture(void); void freeTexture(void);
void setColor(float red, float green, float blue, float alpha); void setColor(float red, float green, float blue, float alpha);
const float* getColor(void); const float* getColor(void);
void enable(void); void enable(void);
void disable(void); void disable(void);
bool isEnabled(void); bool isEnabled(void);
Texture* getTexture(void); Texture* getTexture(void);
void setTexture(Texture* tex); void setTexture(Texture* tex);
}; };
#endif #endif

File diff suppressed because it is too large Load diff

View file

@ -1,32 +1,3 @@
/*
* $Id: menu.h,v 1.6 2002/07/21 22:50:39 msell Exp $
*
*
* $Log: menu.h,v $
* Revision 1.6 2002/07/21 22:50:39 msell
* no message
*
* Revision 1.5 2002/07/19 21:17:07 msell
* bugifixi
*
* Revision 1.4 2002/07/19 20:33:28 msell
* #pragma once -> #ifndef
*
* Revision 1.3 2002/07/19 20:06:32 msell
* Linux-porttausta
*
* Revision 1.2 2002/07/17 20:32:47 msell
* Detail-optio toimii
*
* Revision 1.1 2002/07/16 17:16:35 msell
* Fontit ja valikot
*
*
*
* $Date: 2002/07/21 22:50:39 $
*
*/
#ifndef __MENU_H_INCLUDED__ #ifndef __MENU_H_INCLUDED__
#define __MENU_H_INCLUDED__ #define __MENU_H_INCLUDED__

View file

@ -1,57 +1,3 @@
/*
* $Id: mesh.cpp,v 1.14 2002/07/19 20:08:28 msell Exp $
*
*
* $Log: mesh.cpp,v $
* Revision 1.14 2002/07/19 20:08:28 msell
* Linux-porttausta
*
* Revision 1.13 2002/07/15 15:22:08 msell
* Parantelua
*
* Revision 1.12 2002/07/14 21:40:43 msell
* Conflictit pois, liikkumiset (hyppy, kävely, lyönti), uusi areena
*
* Revision 1.11 2002/07/14 21:22:39 jkaarlas
* skybox ja ukkojen säätö
*
* Revision 1.10 2002/07/10 22:22:53 msell
* Cartoon-rendaus
*
* Revision 1.9 2002/07/10 22:10:32 jkaarlas
* skaalatut ja käännellyt ruumiinosat
*
* Revision 1.8 2002/07/10 17:13:44 msell
* Törmäystarkastelun parantelua
*
* Revision 1.7 2002/07/07 17:53:21 msell
* Legoukon alku
*
* Revision 1.6 2002/07/07 15:29:07 msell
* Törmäyksien parantelua
*
* Revision 1.5 2002/07/04 21:05:41 msell
* Se toimii!! =)
* Törmäystarkistukset siis
*
* Revision 1.4 2002/06/30 16:05:04 msell
* Törmäyksien parantelua, transformaatioita mukana
*
* Revision 1.3 2002/06/26 22:30:29 jkaarlas
* lisätty Vertexiin tekstuurikoordinaatit
*
* Revision 1.2 2002/06/24 14:12:15 msell
* Nyt toimii sphere -> mesh -törmäykset, ihan tosi
*
* Revision 1.1 2002/06/20 22:50:12 msell
* Meshit
*
*
*
* $Date: 2002/07/19 20:08:28 $
*
*/
#include "main.h" #include "main.h"
#include "mesh.h" #include "mesh.h"
@ -65,19 +11,19 @@
#include "glapi.h" #include "glapi.h"
Vertex::Vertex(void){ Vertex::Vertex(void){
vectorSet(position, 0, 0, 0); vectorSet(position, 0, 0, 0);
vectorSet(normal, 0, 0, 0); vectorSet(normal, 0, 0, 0);
} }
Vertex::Vertex(float x, float y, float z){ Vertex::Vertex(float x, float y, float z){
vectorSet(position, x, y, z); vectorSet(position, x, y, z);
vectorSet(normal, x, y, z); vectorSet(normal, x, y, z);
vectorNormalize(normal); vectorNormalize(normal);
} }
Vertex::Vertex(float x, float y, float z, float nx, float ny, float nz){ Vertex::Vertex(float x, float y, float z, float nx, float ny, float nz){
vectorSet(position, x, y, z); vectorSet(position, x, y, z);
vectorSet(normal, nx, ny, nz); vectorSet(normal, nx, ny, nz);
} }
void Vertex::setTexCoords(float u, float v){ void Vertex::setTexCoords(float u, float v){
@ -86,173 +32,173 @@ void Vertex::setTexCoords(float u, float v){
} }
Polygon::Polygon(void){ Polygon::Polygon(void){
vertexcount = 0; vertexcount = 0;
edgecount = 0; edgecount = 0;
smooth = false; smooth = false;
realsmooth = false; realsmooth = false;
} }
Mesh::Mesh(void){ Mesh::Mesh(void){
vertexcount = 0; vertexcount = 0;
polygoncount = 0; polygoncount = 0;
edgecount = 0; edgecount = 0;
} }
Mesh::~Mesh(void){ Mesh::~Mesh(void){
delete [] polygons; delete [] polygons;
delete [] vertices; delete [] vertices;
} }
void Mesh::createPlanes(void){ void Mesh::createPlanes(void){
int i; int i;
for (i = 0; i < polygoncount; i++){ for (i = 0; i < polygoncount; i++){
class Polygon *polygon = &this->polygons[i]; class Polygon *polygon = &this->polygons[i];
if (polygon->vertexcount >= 3){ if (polygon->vertexcount >= 3){
float v1[3], v2[3]; float v1[3], v2[3];
vectorSub(v1, polygon->vertices[1]->position, vectorSub(v1, polygon->vertices[1]->position,
polygon->vertices[0]->position); polygon->vertices[0]->position);
vectorSub(v2, polygon->vertices[2]->position, vectorSub(v2, polygon->vertices[2]->position,
polygon->vertices[0]->position); polygon->vertices[0]->position);
vectorCross(polygon->planenormal, v1, v2); vectorCross(polygon->planenormal, v1, v2);
vectorNormalize(polygon->planenormal); vectorNormalize(polygon->planenormal);
polygon->planedistance = -vectorDot(polygon->vertices[0]->position, polygon->planenormal); polygon->planedistance = -vectorDot(polygon->vertices[0]->position, polygon->planenormal);
} }
} }
} }
void Mesh::createVertexnormals(void){ void Mesh::createVertexnormals(void){
int i, j, ii; int i, j, ii;
bool connect; bool connect;
float normal[3]; float normal[3];
for (i = 0; i < vertexcount; i++){ for (i = 0; i < vertexcount; i++){
bool found = false; bool found = false;
vectorSet(normal, 0, 0, 0); vectorSet(normal, 0, 0, 0);
for (j = 0; j < polygoncount; j++){ for (j = 0; j < polygoncount; j++){
connect = false; connect = false;
class Polygon *polygon = &polygons[j]; class Polygon *polygon = &polygons[j];
for (ii = 0;ii < polygon->vertexcount; ii++){ for (ii = 0;ii < polygon->vertexcount; ii++){
if (polygons[j].vertices[ii] == &(vertices[i])){ if (polygons[j].vertices[ii] == &(vertices[i])){
connect = true; connect = true;
} }
} }
if (connect){ if (connect){
vectorAdd(normal, polygon->planenormal); vectorAdd(normal, polygon->planenormal);
found = true; found = true;
} }
} }
if (found){ if (found){
vectorNormalize(vertices[i].normal, normal); vectorNormalize(vertices[i].normal, normal);
} }
} }
for (j = 0; j < polygoncount; j++){ for (j = 0; j < polygoncount; j++){
class Polygon *polygon = &polygons[j]; class Polygon *polygon = &polygons[j];
if (!polygon->realsmooth) polygon->smooth = true; if (!polygon->realsmooth) polygon->smooth = true;
} }
} }
void Mesh::createEdges(void){ void Mesh::createEdges(void){
int maxedgecount = 0; int maxedgecount = 0;
int i; int i;
for (i = 0; i < polygoncount; i++){ for (i = 0; i < polygoncount; i++){
class Polygon *polygon = &polygons[i]; class Polygon *polygon = &polygons[i];
maxedgecount += polygon->vertexcount; maxedgecount += polygon->vertexcount;
} }
edgecount = 0; edgecount = 0;
int j, k; int j, k;
Edge *edges = new Edge[maxedgecount]; Edge *edges = new Edge[maxedgecount];
for (i = 0; i < polygoncount; i++){ for (i = 0; i < polygoncount; i++){
class Polygon *polygon = &polygons[i]; class Polygon *polygon = &polygons[i];
polygon->edges = new Edge *[polygon->vertexcount]; polygon->edges = new Edge *[polygon->vertexcount];
for (j = 1; j <= polygon->vertexcount; j++){ for (j = 1; j <= polygon->vertexcount; j++){
Vertex *v1 = polygon->vertices[j-1]; Vertex *v1 = polygon->vertices[j-1];
Vertex *v2 = polygon->vertices[j%polygon->vertexcount]; Vertex *v2 = polygon->vertices[j%polygon->vertexcount];
bool found = false; bool found = false;
for (k = 0; k < edgecount; k++){ for (k = 0; k < edgecount; k++){
if (edges[k].v2 == v1 && edges[k].v1 == v2){ if (edges[k].v2 == v1 && edges[k].v1 == v2){
found = true; found = true;
edges[k].p2 = polygon; edges[k].p2 = polygon;
break; break;
} }
} }
if (!found){ if (!found){
edges[edgecount].v1 = v1; edges[edgecount].v1 = v1;
edges[edgecount].v2 = v2; edges[edgecount].v2 = v2;
edges[edgecount].p1 = polygon; edges[edgecount].p1 = polygon;
edges[edgecount].p2 = NULL; edges[edgecount].p2 = NULL;
edgecount++; edgecount++;
} }
} }
} }
this->edges = new Edge[edgecount]; this->edges = new Edge[edgecount];
//printf("%i\n", edgecount); //printf("%i\n", edgecount);
for (i = 0; i < edgecount; i++){ for (i = 0; i < edgecount; i++){
this->edges[i].v1 = edges[i].v1; this->edges[i].v1 = edges[i].v1;
this->edges[i].v2 = edges[i].v2; this->edges[i].v2 = edges[i].v2;
this->edges[i].p1 = edges[i].p1; this->edges[i].p1 = edges[i].p1;
this->edges[i].p2 = edges[i].p2; this->edges[i].p2 = edges[i].p2;
class Polygon *p; class Polygon *p;
p = edges[i].p1; p = edges[i].p1;
p->edges[p->edgecount++] = &this->edges[i]; p->edges[p->edgecount++] = &this->edges[i];
p = edges[i].p2; p = edges[i].p2;
p->edges[p->edgecount++] = &this->edges[i]; p->edges[p->edgecount++] = &this->edges[i];
//printf("%p, %p\n", edges[i].p1, edges[i].p2); //printf("%p, %p\n", edges[i].p1, edges[i].p2);
} }
delete[] edges; delete[] edges;
} }
float Mesh::calculateScale(float targetLength, int axis){ float Mesh::calculateScale(float targetLength, int axis){
float min = 0.0; float min = 0.0;
float max = 0.0; float max = 0.0;
for (int i=0; i < this->vertexcount; i++){ for (int i=0; i < this->vertexcount; i++){
if (this->vertices->position[axis] > max){ if (this->vertices->position[axis] > max){
max = this->vertices->position[axis]; max = this->vertices->position[axis];
} }
if (this->vertices->position[axis] < min){ if (this->vertices->position[axis] < min){
min = this->vertices->position[axis]; min = this->vertices->position[axis];
} }
} }
return fabs(targetLength / (max - min)); return fabs(targetLength / (max - min));
} }
/* ei toimi kunnolla kaikille objekteille (kädet ok, jalat ja torso ei) */ /* ei toimi kunnolla kaikille objekteille (kädet ok, jalat ja torso ei) */
void Mesh::scale(float targetLength, int axis){ void Mesh::scale(float targetLength, int axis){
float newscale = this->calculateScale(targetLength, axis); float newscale = this->calculateScale(targetLength, axis);
this->scale(newscale); this->scale(newscale);
} }
/* ei toimi kunnolla kaikille objekteille (kädet ok, jalat ja torso ei)*/ /* ei toimi kunnolla kaikille objekteille (kädet ok, jalat ja torso ei)*/
void Mesh::scale(float scale){ void Mesh::scale(float scale){
for (int i=0; i < this->vertexcount; i++){ for (int i=0; i < this->vertexcount; i++){
this->vertices->position[0] *= scale; this->vertices->position[0] *= scale;
this->vertices->position[1] *= scale; this->vertices->position[1] *= scale;
this->vertices->position[2] *= scale; this->vertices->position[2] *= scale;
} }
this->createVertexnormals(); this->createVertexnormals();
this->createPlanes(); this->createPlanes();
} }
MeshObject::MeshObject(Mesh *mesh){ MeshObject::MeshObject(Mesh *mesh){
this->mesh = mesh; this->mesh = mesh;
this->appearance = new MeshAppearance(mesh); this->appearance = new MeshAppearance(mesh);
this->geometry = new MeshShape(this); this->geometry = new MeshShape(this);
} }
MeshAppearance::MeshAppearance(Mesh *mesh){ MeshAppearance::MeshAppearance(Mesh *mesh){
this->mesh = mesh; this->mesh = mesh;
} }
@ -262,41 +208,41 @@ void MeshAppearance::draw(void){
glColor4fv(this->material.getColor()); glColor4fv(this->material.getColor());
this->material.enable(); this->material.enable();
int i, j; int i, j;
for (i = 0; i < mesh->polygoncount; i++){
class Polygon *polygon = &mesh->polygons[i];
glBegin(GL_TRIANGLE_FAN);
if (!polygon->smooth) glNormal3fv(polygon->planenormal); for (i = 0; i < mesh->polygoncount; i++){
class Polygon *polygon = &mesh->polygons[i];
for (j = 0; j < polygon->vertexcount; j++){ glBegin(GL_TRIANGLE_FAN);
Vertex *vertex = polygon->vertices[j];
if (polygon->smooth) glNormal3fv(vertex->normal); if (!polygon->smooth) glNormal3fv(polygon->planenormal);
glVertex3fv(vertex->position);
} for (j = 0; j < polygon->vertexcount; j++){
Vertex *vertex = polygon->vertices[j];
if (polygon->smooth) glNormal3fv(vertex->normal);
glVertex3fv(vertex->position);
}
glEnd(); glEnd();
} }
glDisable(GL_DEPTH); glDisable(GL_DEPTH);
glDisable(GL_LIGHTING); glDisable(GL_LIGHTING);
glLineWidth(5.0); glLineWidth(5.0);
glBegin(GL_LINES); glBegin(GL_LINES);
for (i = 0; i < mesh->edgecount; i++){ for (i = 0; i < mesh->edgecount; i++){
glColor3f(0, 0, 0); glColor3f(0, 0, 0);
glVertex3fv(mesh->edges[i].v1->position); glVertex3fv(mesh->edges[i].v1->position);
glVertex3fv(mesh->edges[i].v2->position); glVertex3fv(mesh->edges[i].v2->position);
} }
glEnd(); glEnd();
glEnable(GL_LIGHTING); glEnable(GL_LIGHTING);
glEnable(GL_DEPTH); glEnable(GL_DEPTH);
this->material.disable(); this->material.disable();
@ -309,125 +255,125 @@ void MeshAppearance::draw(void){
MeshShape::MeshShape(MeshObject *object) : Shape(object){ MeshShape::MeshShape(MeshObject *object) : Shape(object){
mesh = object->mesh; mesh = object->mesh;
} }
MeshShape::MeshShape(Object *object, Mesh *mesh) : Shape(object){ MeshShape::MeshShape(Object *object, Mesh *mesh) : Shape(object){
this->mesh = mesh; this->mesh = mesh;
} }
bool MeshShape::checkCollision(Object *target){ bool MeshShape::checkCollision(Object *target){
return target->geometry->checkCollisionPeer(this); return target->geometry->checkCollisionPeer(this);
} }
float MeshShape::calculateMomentOfInertia(float *rotationvector){ float MeshShape::calculateMomentOfInertia(float *rotationvector){
if (vectorDot(rotationvector, rotationvector) < EPSILON) return 0; if (vectorDot(rotationvector, rotationvector) < EPSILON) return 0;
int i; int i;
float j = 0; float j = 0;
for (i = 0; i < mesh->vertexcount; i++){ for (i = 0; i < mesh->vertexcount; i++){
float proj[3]; float proj[3];
vectorProject(proj, mesh->vertices[i].position, rotationvector); vectorProject(proj, mesh->vertices[i].position, rotationvector);
vectorSub(proj, mesh->vertices[i].position, proj); vectorSub(proj, mesh->vertices[i].position, proj);
//float r = vectorLength(proj); //float r = vectorLength(proj);
float r2 = vectorDot(proj, proj); float r2 = vectorDot(proj, proj);
j += r2; j += r2;
} }
return j / i; return j / i;
} }
bool MeshShape::checkCollisionPeer(SphereShape *target){ bool MeshShape::checkCollisionPeer(SphereShape *target){
float position[3] = {0, 0, 0}; float position[3] = {0, 0, 0};
target->object->transformPoint(position, position); target->object->transformPoint(position, position);
object->unTransformPoint(position, position); object->unTransformPoint(position, position);
float normal[3]; float normal[3];
float contactpoint[3]; float contactpoint[3];
float r = target->getRadius(); float r = target->getRadius();
if (checkSphereMeshCollision(position, r, mesh, normal, contactpoint)){ if (checkSphereMeshCollision(position, r, mesh, normal, contactpoint)){
vectorScale(normal, -1); vectorScale(normal, -1);
object->transformVector(normal, normal); object->transformVector(normal, normal);
object->transformPoint(contactpoint, contactpoint); object->transformPoint(contactpoint, contactpoint);
addCollision(object, target->object, normal, contactpoint); addCollision(object, target->object, normal, contactpoint);
//vectorAdd(contactnormal, normal); //vectorAdd(contactnormal, normal);
return true; return true;
} }
return false; return false;
} }
//extern Sound *shotsound; //extern Sound *shotsound;
bool MeshShape::checkCollisionPeer(MeshShape *target){ bool MeshShape::checkCollisionPeer(MeshShape *target){
float normal[3]; float normal[3];
float contactpoint[3]; float contactpoint[3];
bool collided = false; bool collided = false;
int i; int i;
Mesh *sourcemesh, *targetmesh; Mesh *sourcemesh, *targetmesh;
sourcemesh = this->mesh;
targetmesh = target->mesh;
for (i = 0; i < sourcemesh->vertexcount; i++){
Vertex *vertex = &sourcemesh->vertices[i];
float vertexposition[3];
object->transformPoint(vertexposition, vertex->position);
target->object->unTransformPoint(vertexposition, vertexposition);
if (checkPointMeshCollision(vertexposition, targetmesh, normal, contactpoint)){ sourcemesh = this->mesh;
target->object->transformVector(normal, normal); targetmesh = target->mesh;
target->object->transformPoint(contactpoint, contactpoint); for (i = 0; i < sourcemesh->vertexcount; i++){
Vertex *vertex = &sourcemesh->vertices[i];
float vertexposition[3];
object->transformPoint(vertexposition, vertex->position);
target->object->unTransformPoint(vertexposition, vertexposition);
if (vectorIsZero(contactpoint)){ if (checkPointMeshCollision(vertexposition, targetmesh, normal, contactpoint)){
vectorSet(contactpoint, 0, 0, 0); target->object->transformVector(normal, normal);
} target->object->transformPoint(contactpoint, contactpoint);
addCollision(object, target->object, normal, contactpoint);
collided = true;
}
}
sourcemesh = target->mesh; if (vectorIsZero(contactpoint)){
targetmesh = this->mesh; vectorSet(contactpoint, 0, 0, 0);
for (i = 0; i < sourcemesh->vertexcount; i++){ }
Vertex *vertex = &sourcemesh->vertices[i]; addCollision(object, target->object, normal, contactpoint);
float vertexposition[3]; collided = true;
target->object->transformPoint(vertexposition, vertex->position); }
object->unTransformPoint(vertexposition, vertexposition); }
if (checkPointMeshCollision(vertexposition, targetmesh, normal, contactpoint)){ sourcemesh = target->mesh;
object->transformVector(normal, normal); targetmesh = this->mesh;
object->transformPoint(contactpoint, contactpoint); for (i = 0; i < sourcemesh->vertexcount; i++){
Vertex *vertex = &sourcemesh->vertices[i];
float vertexposition[3];
target->object->transformPoint(vertexposition, vertex->position);
object->unTransformPoint(vertexposition, vertexposition);
addCollision(target->object, object, normal, contactpoint); if (checkPointMeshCollision(vertexposition, targetmesh, normal, contactpoint)){
collided = true; object->transformVector(normal, normal);
} object->transformPoint(contactpoint, contactpoint);
}
sourcemesh = this->mesh; addCollision(target->object, object, normal, contactpoint);
targetmesh = target->mesh; collided = true;
for (i = 0; i < sourcemesh->edgecount; i++){ }
Edge *edge = &sourcemesh->edges[i]; }
float v1[3], v2[3];
object->transformPoint(v1, edge->v1->position);
target->object->unTransformPoint(v1, v1);
object->transformPoint(v2, edge->v2->position); sourcemesh = this->mesh;
target->object->unTransformPoint(v2, v2); targetmesh = target->mesh;
for (i = 0; i < sourcemesh->edgecount; i++){
Edge *edge = &sourcemesh->edges[i];
float v1[3], v2[3];
object->transformPoint(v1, edge->v1->position);
target->object->unTransformPoint(v1, v1);
if (checkEdgeMeshCollision(v1, v2, targetmesh, normal, contactpoint)){ object->transformPoint(v2, edge->v2->position);
target->object->transformVector(normal, normal); target->object->unTransformPoint(v2, v2);
target->object->transformPoint(contactpoint, contactpoint);
addCollision(object, target->object, normal, contactpoint); if (checkEdgeMeshCollision(v1, v2, targetmesh, normal, contactpoint)){
collided = true; target->object->transformVector(normal, normal);
} target->object->transformPoint(contactpoint, contactpoint);
}
return collided; addCollision(object, target->object, normal, contactpoint);
collided = true;
}
}
return collided;
} }

View file

@ -1,51 +1,3 @@
/*
* $Id: mesh.h,v 1.12 2002/07/19 20:33:28 msell Exp $
*
*
* $Log: mesh.h,v $
* Revision 1.12 2002/07/19 20:33:28 msell
* #pragma once -> #ifndef
*
* Revision 1.11 2002/07/19 20:08:28 msell
* Linux-porttausta
*
* Revision 1.10 2002/07/17 20:32:47 msell
* Detail-optio toimii
*
* Revision 1.9 2002/07/15 15:22:08 msell
* Parantelua
*
* Revision 1.8 2002/07/14 21:22:39 jkaarlas
* skybox ja ukkojen säätö
*
* Revision 1.7 2002/07/10 17:13:44 msell
* Törmäystarkastelun parantelua
*
* Revision 1.6 2002/07/07 17:53:21 msell
* Legoukon alku
*
* Revision 1.5 2002/07/04 21:05:41 msell
* Se toimii!! =)
* Törmäystarkistukset siis
*
* Revision 1.4 2002/06/30 16:05:04 msell
* Törmäyksien parantelua, transformaatioita mukana
*
* Revision 1.3 2002/06/26 22:30:29 jkaarlas
* lisätty Vertexiin tekstuurikoordinaatit
*
* Revision 1.2 2002/06/24 14:12:15 msell
* Nyt toimii sphere -> mesh -törmäykset, ihan tosi
*
* Revision 1.1 2002/06/20 22:50:12 msell
* Meshit
*
*
*
* $Date: 2002/07/19 20:33:28 $
*
*/
#ifndef __MESH_H_INCLUDED__ #ifndef __MESH_H_INCLUDED__
#define __MESH_H_INCLUDED__ #define __MESH_H_INCLUDED__
@ -59,16 +11,16 @@
class Vertex{ class Vertex{
public: public:
float position[3]; float position[3];
float oldposition[3]; float oldposition[3];
float normal[3]; float normal[3];
float texcoords[2]; float texcoords[2];
Vertex(void); Vertex(void);
Vertex(float x, float y, float z); Vertex(float x, float y, float z);
Vertex(float x, float y, float z, float nx, float ny, float nz); Vertex(float x, float y, float z, float nx, float ny, float nz);
void setTexCoords(float u, float v); void setTexCoords(float u, float v);
}; };
@ -76,49 +28,49 @@ class Edge;
class Polygon{ class Polygon{
public: public:
float planenormal[3]; float planenormal[3];
float planedistance; float planedistance;
bool smooth; bool smooth;
bool realsmooth; bool realsmooth;
int vertexcount; int vertexcount;
Vertex **vertices; Vertex **vertices;
int edgecount; int edgecount;
Edge **edges; Edge **edges;
Polygon(void); Polygon(void);
}; };
class Edge{ class Edge{
public: public:
Vertex *v1, *v2; Vertex *v1, *v2;
class Polygon *p1, *p2; class Polygon *p1, *p2;
}; };
class Mesh{ class Mesh{
public: public:
int vertexcount; int vertexcount;
Vertex *vertices; Vertex *vertices;
int polygoncount; int polygoncount;
class Polygon *polygons; class Polygon *polygons;
Edge *edges; Edge *edges;
int edgecount; int edgecount;
Mesh(void); Mesh(void);
~Mesh(void); ~Mesh(void);
void createPlanes(void); void createPlanes(void);
void createVertexnormals(void); void createVertexnormals(void);
void createEdges(void); void createEdges(void);
float calculateScale(float targetLength, int axis); float calculateScale(float targetLength, int axis);
void scale(float targetLength, int axis); void scale(float targetLength, int axis);
void scale(float scale); void scale(float scale);
}; };
@ -126,21 +78,21 @@ public:
class MeshObject : public Object{ class MeshObject : public Object{
public: public:
Mesh *mesh; Mesh *mesh;
MeshObject(Mesh *mesh); MeshObject(Mesh *mesh);
}; };
class MeshAppearance : public Appearance{ class MeshAppearance : public Appearance{
private: private:
Mesh *mesh; Mesh *mesh;
public: public:
MeshAppearance(Mesh *mesh); MeshAppearance(Mesh *mesh);
void draw(void); void draw(void);
}; };
@ -149,20 +101,20 @@ public:
class MeshShape : public Shape{ class MeshShape : public Shape{
private: private:
Mesh *mesh; Mesh *mesh;
public: public:
MeshShape(MeshObject *meshobject); MeshShape(MeshObject *meshobject);
MeshShape(Object *object, Mesh *mesh); MeshShape(Object *object, Mesh *mesh);
float calculateMomentOfInertia(float *rotationvector); float calculateMomentOfInertia(float *rotationvector);
bool checkCollision(Object *target); bool checkCollision(Object *target);
bool checkCollisionPeer(SphereShape *target); bool checkCollisionPeer(SphereShape *target);
bool checkCollisionPeer(MeshShape *target); bool checkCollisionPeer(MeshShape *target);
friend class SphereShape; friend class SphereShape;
}; };
#endif #endif

View file

@ -1,82 +1,3 @@
/*
* $Id: object.cpp,v 1.22 2002/07/18 23:05:31 msell Exp $
*
*
* $Log: object.cpp,v $
* Revision 1.22 2002/07/18 23:05:31 msell
* Partikkelit ja kakkospelaajan liike
*
* Revision 1.21 2002/07/17 22:45:54 msell
* Ääniä vähän
*
* Revision 1.20 2002/07/15 15:22:08 msell
* Parantelua
*
* Revision 1.19 2002/07/14 21:40:43 msell
* Conflictit pois, liikkumiset (hyppy, kävely, lyönti), uusi areena
*
* Revision 1.18 2002/07/14 21:22:39 jkaarlas
* skybox ja ukkojen säätö
*
* Revision 1.17 2002/07/07 15:29:07 msell
* Törmäyksien parantelua
*
* Revision 1.16 2002/07/04 21:05:41 msell
* Se toimii!! =)
* Törmäystarkistukset siis
*
* Revision 1.15 2002/06/30 16:05:04 msell
* Törmäyksien parantelua, transformaatioita mukana
*
* Revision 1.14 2002/06/27 14:39:48 msell
* Toimiva maila :)
* Pyörivät kappaleet siis antaa liike-energiaa liikkuville kappaleille (ei toisin päin vielä)
*
* Revision 1.13 2002/06/27 00:08:04 msell
* Kimmotukset palloille myös pyöritettyihin mesheihin
*
* Revision 1.12 2002/06/24 14:12:15 msell
* Nyt toimii sphere -> mesh -törmäykset, ihan tosi
*
* Revision 1.11 2002/06/17 20:49:05 msell
* free -> SDL_FreeSurface
*
* Revision 1.10 2002/06/16 01:04:58 jkaarlas
* tulipa säädettyä includejen kanssa. oon tod.näk. eri mieltä aamulla
*
* Revision 1.9 2002/06/15 17:18:37 msell
* Toimiva törmäystarkastus kiinteille laatikoille
*
* Revision 1.8 2002/06/14 00:05:05 msell
* Törmäyssimulaatio kunnossa toivon mukaan
*
* Revision 1.7 2002/06/11 23:11:45 msell
* Törmäystarkistusta
*
* Revision 1.6 2002/06/07 21:16:51 msell
* Fysiikkaenginen alkua
*
* Revision 1.5 2002/06/05 18:39:05 msell
* Jotain pientä
*
* Revision 1.4 2002/06/05 15:00:41 msell
* Palikoihin lisää detailia, facet jaetaan halutun kokosiin osiin
*
* Revision 1.3 2002/06/03 23:20:43 msell
* no message
*
* Revision 1.2 2002/06/03 23:06:38 msell
* no message
*
* Revision 1.1 2002/06/02 16:57:37 msell
* Objektirakenteen pohja
*
*
*
* $Date: 2002/07/18 23:05:31 $
*
*/
#include "main.h" #include "main.h"
#include <stdlib.h> #include <stdlib.h>
@ -89,204 +10,204 @@
#include "glapi.h" #include "glapi.h"
Object::Object(void){ Object::Object(void){
appearance = NULL; appearance = NULL;
geometry = NULL; geometry = NULL;
invmass = 0.0; invmass = 0.0;
setPosition(0, 0, 0); setPosition(0, 0, 0);
vectorSet(momentum, 0, 0, 0); vectorSet(momentum, 0, 0, 0);
invmomentofinertia = 0.0; invmomentofinertia = 0.0;
matrixIdentity(rotation); matrixIdentity(rotation);
vectorSet(angularmomentum, 0, 0, 0); vectorSet(angularmomentum, 0, 0, 0);
setCollisionGroup(COLLISIONGROUP_NONE); setCollisionGroup(COLLISIONGROUP_NONE);
gravity = false; gravity = false;
} }
void Object::prepare(void){ void Object::prepare(void){
if (appearance != NULL) appearance->prepare(); if (appearance != NULL) appearance->prepare();
} }
#define DT 0.01 #define DT 0.01
void Object::move(void){ void Object::move(void){
moveStep(DT); moveStep(DT);
} }
void Object::moveStep(float dt){ void Object::moveStep(float dt){
if (invmass == 0) return; if (invmass == 0) return;
if (vectorDot(momentum, momentum) > 1.0e+5) vectorSet(momentum, 0, 0, 0); if (vectorDot(momentum, momentum) > 1.0e+5) vectorSet(momentum, 0, 0, 0);
if (vectorDot(angularmomentum, angularmomentum) > 1.0e+5) vectorSet(angularmomentum, 0, 0, 0); if (vectorDot(angularmomentum, angularmomentum) > 1.0e+5) vectorSet(angularmomentum, 0, 0, 0);
calculateStateVariables(); calculateStateVariables();
float velocitydt[3];
vectorScale(velocitydt, velocity, dt);
vectorAdd(position, velocitydt);
float rotationdt[9]; float velocitydt[3];
if (vectorIsZero(angularmomentum)){ vectorScale(velocitydt, velocity, dt);
matrixIdentity(rotationdt); vectorAdd(position, velocitydt);
} else{
float angularvelocitydt[3];
vectorScale(angularvelocitydt, angularvelocity, dt);
matrixCreateRotation(rotationdt, angularvelocitydt);
}
matrixMultiply(rotation, rotation, rotationdt);
vectorScale(angularmomentum, 0.99); float rotationdt[9];
if (vectorIsZero(angularmomentum)){
matrixIdentity(rotationdt);
} else{
float angularvelocitydt[3];
vectorScale(angularvelocitydt, angularvelocity, dt);
matrixCreateRotation(rotationdt, angularvelocitydt);
}
matrixMultiply(rotation, rotation, rotationdt);
vectorScale(angularmomentum, 0.99);
} }
void Object::calculateStateVariables(void){ void Object::calculateStateVariables(void){
getVelocity(velocity); getVelocity(velocity);
if (vectorIsZero(angularmomentum)){ if (vectorIsZero(angularmomentum)){
invmomentofinertia = 0; invmomentofinertia = 0;
} else{ } else{
invmomentofinertia = invmass * 1.0 / geometry->calculateMomentOfInertia(angularmomentum); invmomentofinertia = invmass * 1.0 / geometry->calculateMomentOfInertia(angularmomentum);
} }
vectorScale(angularvelocity, angularmomentum, invmomentofinertia); vectorScale(angularvelocity, angularmomentum, invmomentofinertia);
} }
void Object::setPosition(float x, float y, float z){ void Object::setPosition(float x, float y, float z){
position[0] = x; position[0] = x;
position[1] = y; position[1] = y;
position[2] = z; position[2] = z;
} }
void Object::getPosition(float *position){ void Object::getPosition(float *position){
vectorCopy(position, this->position); vectorCopy(position, this->position);
} }
void Object::getVelocity(float *velocity){ void Object::getVelocity(float *velocity){
vectorCopy(velocity, momentum); vectorCopy(velocity, momentum);
vectorScale(velocity, invmass); vectorScale(velocity, invmass);
} }
void Object::getVelocity(float *velocity, float *point){ void Object::getVelocity(float *velocity, float *point){
getVelocity(velocity); getVelocity(velocity);
float tangentialvelocity[3]; float tangentialvelocity[3];
getTangentialVelocity(tangentialvelocity, point); getTangentialVelocity(tangentialvelocity, point);
//float tv[3]; //float tv[3];
//transformVector(tv, tangentialvelocity); //transformVector(tv, tangentialvelocity);
vectorAdd(velocity, tangentialvelocity); vectorAdd(velocity, tangentialvelocity);
} }
void Object::getTangentialVelocity(float *target, float *point){ void Object::getTangentialVelocity(float *target, float *point){
if (vectorIsZero(angularmomentum)){ if (vectorIsZero(angularmomentum)){
vectorSet(target, 0, 0, 0); vectorSet(target, 0, 0, 0);
return; return;
} }
vectorCross(target, angularmomentum, point); vectorCross(target, angularmomentum, point);
vectorScale(target, invmomentofinertia); vectorScale(target, invmomentofinertia);
} }
void Object::getMomentum(float *momentum){ void Object::getMomentum(float *momentum){
vectorCopy(momentum, this->momentum); vectorCopy(momentum, this->momentum);
} }
void Object::setMass(float mass){ void Object::setMass(float mass){
if (mass == 0) this->invmass = 0; if (mass == 0) this->invmass = 0;
else this->invmass = 1.0 / mass; else this->invmass = 1.0 / mass;
} }
float Object::getMass(void){ float Object::getMass(void){
if (invmass == 0) return 0; if (invmass == 0) return 0;
return 1.0 / invmass; return 1.0 / invmass;
} }
void Object::setCollisionGroup(int group){ void Object::setCollisionGroup(int group){
this->collisiongroup = group; this->collisiongroup = group;
} }
int Object::getCollisionGroup(void){ int Object::getCollisionGroup(void){
return collisiongroup; return collisiongroup;
} }
void Object::addImpulse(float *impulse, float *contactpoint){ void Object::addImpulse(float *impulse, float *contactpoint){
if (invmass == 0) return; if (invmass == 0) return;
float angularimpulse[3]; float angularimpulse[3];
vectorCross(angularimpulse, contactpoint, impulse); vectorCross(angularimpulse, contactpoint, impulse);
vectorAdd(angularmomentum, angularimpulse); vectorAdd(angularmomentum, angularimpulse);
vectorAdd(momentum, impulse); vectorAdd(momentum, impulse);
float t1[3], t2[3]; float t1[3], t2[3];
vectorAdd(t1, contactpoint, position); vectorAdd(t1, contactpoint, position);
vectorNormalize(t2, impulse); vectorNormalize(t2, impulse);
vectorAdd(t2, t1); vectorAdd(t2, t1);
//addGraphicsVector(t1, t2, vectorLength(impulse)); //addGraphicsVector(t1, t2, vectorLength(impulse));
} }
void Object::addExternalForce(float *force){ void Object::addExternalForce(float *force){
float impulse[3]; float impulse[3];
vectorScale(impulse, force, DT); vectorScale(impulse, force, DT);
float contact[3] = {0, 0, 0}; float contact[3] = {0, 0, 0};
this->addImpulse(impulse, contact); this->addImpulse(impulse, contact);
} }
void Object::transformPoint(float *newpoint, float *oldpoint){ void Object::transformPoint(float *newpoint, float *oldpoint){
vectorMatrixMultiply(newpoint, oldpoint, rotation); vectorMatrixMultiply(newpoint, oldpoint, rotation);
vectorAdd(newpoint, position); vectorAdd(newpoint, position);
} }
void Object::unTransformPoint(float *newpoint, float *oldpoint){ void Object::unTransformPoint(float *newpoint, float *oldpoint){
vectorSub(newpoint, oldpoint, position); vectorSub(newpoint, oldpoint, position);
float rotmat[9]; float rotmat[9];
matrixTranspose(rotmat, rotation); matrixTranspose(rotmat, rotation);
vectorMatrixMultiply(newpoint, newpoint, rotmat); vectorMatrixMultiply(newpoint, newpoint, rotmat);
} }
void Object::transformVector(float *newvector, float *oldvector){ void Object::transformVector(float *newvector, float *oldvector){
vectorMatrixMultiply(newvector, oldvector, rotation); vectorMatrixMultiply(newvector, oldvector, rotation);
} }
void Object::unTransformVector(float *newvector, float *oldvector){ void Object::unTransformVector(float *newvector, float *oldvector){
float rotmat[9]; float rotmat[9];
matrixTranspose(rotmat, rotation); matrixTranspose(rotmat, rotation);
vectorMatrixMultiply(newvector, oldvector, rotmat); vectorMatrixMultiply(newvector, oldvector, rotmat);
} }
void Object::hitForce(float speed, float *speed2, Object *source){ void Object::hitForce(float speed, float *speed2, Object *source){
float tolerance = 1.0; float tolerance = 1.0;
if (speed > tolerance){ if (speed > tolerance){
Sound *sound; Sound *sound;
if (rand()&1) sound = softhitsound1; if (rand()&1) sound = softhitsound1;
else sound = softhitsound2; else sound = softhitsound2;
float volume = (speed-tolerance)*2; float volume = (speed-tolerance)*2;
if (volume > 1) volume = 1; if (volume > 1) volume = 1;
sound->setVolume(volume); sound->setVolume(volume);
sound->play(30 + random(70)); sound->play(30 + random(70));
} }
} }
void Object::setGravity(bool enabled){ void Object::setGravity(bool enabled){
gravity = enabled; gravity = enabled;
} }
void Object::draw(void){ void Object::draw(void){
glPushMatrix(); glPushMatrix();
glTranslatef(position[0], position[1], position[2]); glTranslatef(position[0], position[1], position[2]);
GLfloat glmatrix[16] = {
rotation[0], rotation[1], rotation[2], 0,
rotation[3], rotation[4], rotation[5], 0,
rotation[6], rotation[7], rotation[8], 0,
0 , 0 , 0 , 1};
glMultMatrixf(glmatrix);
if (appearance != NULL) appearance->draw(); GLfloat glmatrix[16] = {
rotation[0], rotation[1], rotation[2], 0,
rotation[3], rotation[4], rotation[5], 0,
rotation[6], rotation[7], rotation[8], 0,
0 , 0 , 0 , 1};
glMultMatrixf(glmatrix);
glPopMatrix(); if (appearance != NULL) appearance->draw();
glPopMatrix();
} }

View file

@ -1,76 +1,3 @@
/*
* $Id: object.h,v 1.20 2002/07/19 20:33:28 msell Exp $
*
*
* $Log: object.h,v $
* Revision 1.20 2002/07/19 20:33:28 msell
* #pragma once -> #ifndef
*
* Revision 1.19 2002/07/18 23:05:31 msell
* Partikkelit ja kakkospelaajan liike
*
* Revision 1.18 2002/07/17 22:45:54 msell
* Ääniä vähän
*
* Revision 1.17 2002/07/14 21:40:43 msell
* Conflictit pois, liikkumiset (hyppy, kävely, lyönti), uusi areena
*
* Revision 1.16 2002/07/07 23:05:22 msell
* Osien liimaaminen toisiinsa (kesken)
*
* Revision 1.15 2002/07/04 21:05:41 msell
* Se toimii!! =)
* Törmäystarkistukset siis
*
* Revision 1.14 2002/06/30 16:05:04 msell
* Törmäyksien parantelua, transformaatioita mukana
*
* Revision 1.13 2002/06/27 14:39:48 msell
* Toimiva maila :)
* Pyörivät kappaleet siis antaa liike-energiaa liikkuville kappaleille (ei toisin päin vielä)
*
* Revision 1.12 2002/06/27 00:08:04 msell
* Kimmotukset palloille myös pyöritettyihin mesheihin
*
* Revision 1.11 2002/06/24 14:12:15 msell
* Nyt toimii sphere -> mesh -törmäykset, ihan tosi
*
* Revision 1.10 2002/06/15 22:56:37 msell
* Säätöä
*
* Revision 1.9 2002/06/14 00:05:05 msell
* Törmäyssimulaatio kunnossa toivon mukaan
*
* Revision 1.8 2002/06/11 23:11:45 msell
* Törmäystarkistusta
*
* Revision 1.7 2002/06/07 21:16:51 msell
* Fysiikkaenginen alkua
*
* Revision 1.6 2002/06/05 18:39:05 msell
* Jotain pientä
*
* Revision 1.5 2002/06/05 15:00:41 msell
* Palikoihin lisää detailia, facet jaetaan halutun kokosiin osiin
*
* Revision 1.4 2002/06/04 16:28:32 msell
* #pragma once
*
* Revision 1.3 2002/06/03 23:20:43 msell
* no message
*
* Revision 1.2 2002/06/03 23:06:38 msell
* no message
*
* Revision 1.1 2002/06/02 16:57:37 msell
* Objektirakenteen pohja
*
*
*
* $Date: 2002/07/19 20:33:28 $
*
*/
#ifndef __OBJECT_H_INCLUDED__ #ifndef __OBJECT_H_INCLUDED__
#define __OBJECT_H_INCLUDED__ #define __OBJECT_H_INCLUDED__
@ -84,135 +11,135 @@ class Object;
#include "appearance.h" #include "appearance.h"
struct objectlist{ struct objectlist{
Object *object; Object *object;
objectlist *next; objectlist *next;
}; };
class Object{ class Object{
public: public:
float invmass; float invmass;
/* Linear movement: /* Linear movement:
* position <-> paikka (x) * position <-> paikka (x)
* velocity <-> nopeus (v) * velocity <-> nopeus (v)
* momentum <-> liikemäärä (p) * momentum <-> liikemäärä (p)
* force <-> voima (F) * force <-> voima (F)
* x' = v * x' = v
* p' = F * p' = F
* p = mv * p = mv
* F = ma * F = ma
* v' = a * v' = a
*/ */
float position[3]; float position[3];
//derivative: velocity = momentum / mass //derivative: velocity = momentum / mass
float momentum[3];//, oldmomentum[3]; float momentum[3];//, oldmomentum[3];
//derivative: force //derivative: force
//float force[3]; //Temporary properties //float force[3]; //Temporary properties
//float externalforce[3]; //float externalforce[3];
/* Angular movement: /* Angular movement:
* rotation <-> orientaatio (R) * rotation <-> orientaatio (R)
* angular velocity <-> kulmanopeus (w) * angular velocity <-> kulmanopeus (w)
* angular momentum <-> pyörimisliikemäärä, vääntömomentti (L) * angular momentum <-> pyörimisliikemäärä, vääntömomentti (L)
* torque <-> voiman momentti (M,T) * torque <-> voiman momentti (M,T)
* moment of inertia <-> hitausmomentti (J,I) * moment of inertia <-> hitausmomentti (J,I)
* angular acceleration <-> kulmakiihtyvyys (a) * angular acceleration <-> kulmakiihtyvyys (a)
* L = J*w * L = J*w
* R' = Star(L) * R * R' = Star(L) * R
* T = J*a * T = J*a
* w' = a * w' = a
* L' = T * L' = T
*/ */
float invmomentofinertia; float invmomentofinertia;
float rotation[9]; float rotation[9];
//derivative: StarOperation(angularvelocity) * rotation //derivative: StarOperation(angularvelocity) * rotation
float angularmomentum[3]; float angularmomentum[3];
//angular momentum = angular velocity * moment of inertia //angular momentum = angular velocity * moment of inertia
//derivative: torque = angular acceleration * moment of inertia //derivative: torque = angular acceleration * moment of inertia
//float torque[3]; //Temporary property //float torque[3]; //Temporary property
void moveStep(float dt); void moveStep(float dt);
//void applyForces(float dt); //void applyForces(float dt);
void calculateStateVariables(void); void calculateStateVariables(void);
int collisiongroup; int collisiongroup;
void addImpulse(float *impulse, float *contactpoint); void addImpulse(float *impulse, float *contactpoint);
Appearance *appearance; Appearance *appearance;
Shape *geometry; Shape *geometry;
bool gravity; bool gravity;
Object(void); Object(void);
virtual void prepare(void); virtual void prepare(void);
virtual void move(void); virtual void move(void);
virtual void draw(void); virtual void draw(void);
void setPosition(float x, float y, float z); void setPosition(float x, float y, float z);
void getPosition(float *position); void getPosition(float *position);
//Gets velocity from object and return it in "velocity" //Gets velocity from object and return it in "velocity"
void getVelocity(float *velocity); void getVelocity(float *velocity);
//Gets velocity from object for point "point" with //Gets velocity from object for point "point" with
//tangential speed and return it in "velocity" //tangential speed and return it in "velocity"
void getVelocity(float *velocity, float *point); void getVelocity(float *velocity, float *point);
void getTangentialVelocity(float *target, float *point); void getTangentialVelocity(float *target, float *point);
void getMomentum(float *momentum); void getMomentum(float *momentum);
//void getForce(float *force); //void getForce(float *force);
void setMass(float mass); void setMass(float mass);
float getMass(void); float getMass(void);
void setCollisionGroup(int group); void setCollisionGroup(int group);
int getCollisionGroup(void); int getCollisionGroup(void);
void transformPoint(float *newpoint, float *oldpoint); void transformPoint(float *newpoint, float *oldpoint);
void unTransformPoint(float *newpoint, float *oldpoint); void unTransformPoint(float *newpoint, float *oldpoint);
void transformVector(float *newvector, float *oldvector); void transformVector(float *newvector, float *oldvector);
void unTransformVector(float *newvector, float *oldvector); void unTransformVector(float *newvector, float *oldvector);
void addExternalForce(float *force); void addExternalForce(float *force);
void setGravity(bool enabled); void setGravity(bool enabled);
virtual void hitForce(float speed, float *speed2, Object *source); virtual void hitForce(float speed, float *speed2, Object *source);
friend class ObjectLink;
//friend void collide(Object *source, Object *target, float *normal, float *contactpoint);
friend bool checkCollisions(Object *object, float *contactnormal); friend class ObjectLink;
//friend void collide(Object *source, Object *target, float *normal, float *contactpoint);
friend bool checkCollisions(Object *object, float *contactnormal);
//Temporary state variables //Temporary state variables
float velocity[3]; float velocity[3];
float angularvelocity[3]; float angularvelocity[3];
}; };
#endif #endif

View file

@ -1,50 +1,3 @@
/*
* $Id: objectfactory.cpp,v 1.12 2002/07/22 01:14:14 msell Exp $
*
*
* $Log: objectfactory.cpp,v $
* Revision 1.12 2002/07/22 01:14:14 msell
* Lopetussysteemi
*
* Revision 1.11 2002/07/15 20:32:35 msell
* Uudet valot ja ulkoasun parantelua
*
* Revision 1.10 2002/07/15 15:22:08 msell
* Parantelua
*
* Revision 1.9 2002/07/14 21:22:39 jkaarlas
* skybox ja ukkojen säätö
*
* Revision 1.8 2002/07/11 18:33:07 jkaarlas
* ascloaderi palauttaa nyt meshin
*
* Revision 1.7 2002/07/10 22:22:53 msell
* Cartoon-rendaus
*
* Revision 1.6 2002/07/10 22:07:23 jkaarlas
* skaalatut ja käännellyt ruumiinosat
*
* Revision 1.5 2002/07/09 19:54:35 msell
* intit floateiks asc-loaderista
*
* Revision 1.4 2002/06/26 22:30:02 jkaarlas
* lisätty asc-loaderi
*
* Revision 1.3 2002/06/24 14:12:15 msell
* Nyt toimii sphere -> mesh -törmäykset, ihan tosi
*
* Revision 1.2 2002/06/23 20:12:19 msell
* Parempi törmäystarkistus palloista mesheihin
*
* Revision 1.1 2002/06/20 22:50:12 msell
* Meshit
*
*
*
* $Date: 2002/07/22 01:14:14 $
*
*/
#include "main.h" #include "main.h"
#include <stdlib.h> #include <stdlib.h>
@ -61,183 +14,183 @@
MeshObject *createPyramid(float width, float height){ MeshObject *createPyramid(float width, float height){
Mesh *mesh = new Mesh(); Mesh *mesh = new Mesh();
mesh->vertexcount = 5; mesh->vertexcount = 5;
mesh->vertices = new Vertex[5]; mesh->vertices = new Vertex[5];
vectorSet(mesh->vertices[0].position, width, 0, 0); vectorSet(mesh->vertices[0].position, width, 0, 0);
vectorSet(mesh->vertices[0].normal, 1, 0, 0); vectorSet(mesh->vertices[0].normal, 1, 0, 0);
vectorSet(mesh->vertices[1].position, -width, 0, 0); vectorSet(mesh->vertices[1].position, -width, 0, 0);
vectorSet(mesh->vertices[1].normal, -1, 0, 0); vectorSet(mesh->vertices[1].normal, -1, 0, 0);
vectorSet(mesh->vertices[2].position, 0, 0, width); vectorSet(mesh->vertices[2].position, 0, 0, width);
vectorSet(mesh->vertices[2].normal, 0, 0, 1); vectorSet(mesh->vertices[2].normal, 0, 0, 1);
vectorSet(mesh->vertices[3].position, 0, 0, -width); vectorSet(mesh->vertices[3].position, 0, 0, -width);
vectorSet(mesh->vertices[3].normal, 0, 0, -1); vectorSet(mesh->vertices[3].normal, 0, 0, -1);
vectorSet(mesh->vertices[4].position, 0, height, 0); vectorSet(mesh->vertices[4].position, 0, height, 0);
vectorSet(mesh->vertices[4].normal, 0, 1, 0); vectorSet(mesh->vertices[4].normal, 0, 1, 0);
mesh->polygoncount = 5; mesh->polygoncount = 5;
mesh->polygons = new class Polygon[5]; mesh->polygons = new class Polygon[5];
mesh->polygons[0].vertexcount = 3; mesh->polygons[0].vertexcount = 3;
mesh->polygons[0].vertices = new Vertex *[3]; mesh->polygons[0].vertices = new Vertex *[3];
mesh->polygons[0].vertices[0] = &mesh->vertices[4]; mesh->polygons[0].vertices[0] = &mesh->vertices[4];
mesh->polygons[0].vertices[1] = &mesh->vertices[0]; mesh->polygons[0].vertices[1] = &mesh->vertices[0];
mesh->polygons[0].vertices[2] = &mesh->vertices[3]; mesh->polygons[0].vertices[2] = &mesh->vertices[3];
mesh->polygons[1].vertexcount = 3; mesh->polygons[1].vertexcount = 3;
mesh->polygons[1].vertices = new Vertex *[3]; mesh->polygons[1].vertices = new Vertex *[3];
mesh->polygons[1].vertices[0] = &mesh->vertices[4]; mesh->polygons[1].vertices[0] = &mesh->vertices[4];
mesh->polygons[1].vertices[1] = &mesh->vertices[3]; mesh->polygons[1].vertices[1] = &mesh->vertices[3];
mesh->polygons[1].vertices[2] = &mesh->vertices[1]; mesh->polygons[1].vertices[2] = &mesh->vertices[1];
mesh->polygons[2].vertexcount = 3; mesh->polygons[2].vertexcount = 3;
mesh->polygons[2].vertices = new Vertex *[3]; mesh->polygons[2].vertices = new Vertex *[3];
mesh->polygons[2].vertices[0] = &mesh->vertices[4]; mesh->polygons[2].vertices[0] = &mesh->vertices[4];
mesh->polygons[2].vertices[1] = &mesh->vertices[1]; mesh->polygons[2].vertices[1] = &mesh->vertices[1];
mesh->polygons[2].vertices[2] = &mesh->vertices[2]; mesh->polygons[2].vertices[2] = &mesh->vertices[2];
mesh->polygons[3].vertexcount = 3; mesh->polygons[3].vertexcount = 3;
mesh->polygons[3].vertices = new Vertex *[3]; mesh->polygons[3].vertices = new Vertex *[3];
mesh->polygons[3].vertices[0] = &mesh->vertices[4]; mesh->polygons[3].vertices[0] = &mesh->vertices[4];
mesh->polygons[3].vertices[1] = &mesh->vertices[2]; mesh->polygons[3].vertices[1] = &mesh->vertices[2];
mesh->polygons[3].vertices[2] = &mesh->vertices[0]; mesh->polygons[3].vertices[2] = &mesh->vertices[0];
mesh->polygons[4].vertexcount = 4; mesh->polygons[4].vertexcount = 4;
mesh->polygons[4].vertices = new Vertex *[4]; mesh->polygons[4].vertices = new Vertex *[4];
mesh->polygons[4].vertices[0] = &mesh->vertices[0]; mesh->polygons[4].vertices[0] = &mesh->vertices[0];
mesh->polygons[4].vertices[1] = &mesh->vertices[2]; mesh->polygons[4].vertices[1] = &mesh->vertices[2];
mesh->polygons[4].vertices[2] = &mesh->vertices[1]; mesh->polygons[4].vertices[2] = &mesh->vertices[1];
mesh->polygons[4].vertices[3] = &mesh->vertices[3]; mesh->polygons[4].vertices[3] = &mesh->vertices[3];
mesh->polygons[0].smooth = false; mesh->polygons[0].smooth = false;
mesh->polygons[1].smooth = false; mesh->polygons[1].smooth = false;
mesh->polygons[2].smooth = false; mesh->polygons[2].smooth = false;
mesh->polygons[3].smooth = false; mesh->polygons[3].smooth = false;
mesh->polygons[4].smooth = false; mesh->polygons[4].smooth = false;
mesh->createPlanes(); mesh->createPlanes();
MeshObject *object = new MeshObject(mesh); MeshObject *object = new MeshObject(mesh);
return object; return object;
} }
MeshObject *createSpherePool(float width, float height){ MeshObject *createSpherePool(float width, float height){
int grid = 16; int grid = 16;
Mesh *mesh = new Mesh(); Mesh *mesh = new Mesh();
mesh->vertexcount = (grid+1)*(grid+1); mesh->vertexcount = (grid+1)*(grid+1);
mesh->vertices = new Vertex[mesh->vertexcount]; mesh->vertices = new Vertex[mesh->vertexcount];
int x, z; int x, z;
for (z = 0; z < grid; z++){ for (z = 0; z < grid; z++){
float pz = (2.0*z/(grid-1) - 1)*width; float pz = (2.0*z/(grid-1) - 1)*width;
for (x = 0; x < grid; x++){ for (x = 0; x < grid; x++){
float px = (2.0*x/(grid-1) - 1)*width; float px = (2.0*x/(grid-1) - 1)*width;
//float py = randomf(1); //float py = randomf(1);
float l = sqrt(pz*pz + px*px)*1; float l = sqrt(pz*pz + px*px)*1;
if (l > width) l = width; if (l > width) l = width;
l = l/width; l = l/width;
//l = l*l; //l = l*l;
float py = height*(sin(PI*(1.5+l*2))+1)/2; float py = height*(sin(PI*(1.5+l*2))+1)/2;
vectorSet(mesh->vertices[z * grid + x].position, px, py, pz); vectorSet(mesh->vertices[z * grid + x].position, px, py, pz);
} }
} }
mesh->polygoncount = (grid-1)*(grid-1); mesh->polygoncount = (grid-1)*(grid-1);
mesh->polygons = new class Polygon[mesh->polygoncount]; mesh->polygons = new class Polygon[mesh->polygoncount];
for (z = 0; z < grid-1; z++){ for (z = 0; z < grid-1; z++){
for (x = 0; x < grid-1; x++){ for (x = 0; x < grid-1; x++){
class Polygon *poly = &mesh->polygons[z * (grid-1) + x]; class Polygon *poly = &mesh->polygons[z * (grid-1) + x];
poly->vertexcount = 4; poly->vertexcount = 4;
poly->vertices = new Vertex *[4]; poly->vertices = new Vertex *[4];
poly->vertices[0] = &mesh->vertices[z * grid + x + 1]; poly->vertices[0] = &mesh->vertices[z * grid + x + 1];
poly->vertices[1] = &mesh->vertices[z * grid + x ]; poly->vertices[1] = &mesh->vertices[z * grid + x ];
poly->vertices[2] = &mesh->vertices[(z + 1) * grid + x]; poly->vertices[2] = &mesh->vertices[(z + 1) * grid + x];
poly->vertices[3] = &mesh->vertices[(z + 1) * grid + x + 1]; poly->vertices[3] = &mesh->vertices[(z + 1) * grid + x + 1];
poly->smooth = true; poly->smooth = true;
} }
} }
mesh->createPlanes(); mesh->createPlanes();
mesh->createVertexnormals(); mesh->createVertexnormals();
MeshObject *object = new MeshObject(mesh); MeshObject *object = new MeshObject(mesh);
return object; return object;
} }
Mesh *createBox(float x1, float x2, float y1, float y2, float z1, float z2){ Mesh *createBox(float x1, float x2, float y1, float y2, float z1, float z2){
Mesh *mesh = new Mesh(); Mesh *mesh = new Mesh();
mesh->vertexcount = 8; mesh->vertexcount = 8;
mesh->vertices = new Vertex[8]; mesh->vertices = new Vertex[8];
vectorSet(mesh->vertices[0].position, x1, y1, z1); vectorSet(mesh->vertices[0].position, x1, y1, z1);
vectorSet(mesh->vertices[1].position, x2, y1, z1); vectorSet(mesh->vertices[1].position, x2, y1, z1);
vectorSet(mesh->vertices[2].position, x1, y2, z1); vectorSet(mesh->vertices[2].position, x1, y2, z1);
vectorSet(mesh->vertices[3].position, x2, y2, z1); vectorSet(mesh->vertices[3].position, x2, y2, z1);
vectorSet(mesh->vertices[4].position, x1, y1, z2); vectorSet(mesh->vertices[4].position, x1, y1, z2);
vectorSet(mesh->vertices[5].position, x2, y1, z2); vectorSet(mesh->vertices[5].position, x2, y1, z2);
vectorSet(mesh->vertices[6].position, x1, y2, z2); vectorSet(mesh->vertices[6].position, x1, y2, z2);
vectorSet(mesh->vertices[7].position, x2, y2, z2); vectorSet(mesh->vertices[7].position, x2, y2, z2);
mesh->polygoncount = 6; mesh->polygoncount = 6;
mesh->polygons = new class Polygon[6]; mesh->polygons = new class Polygon[6];
//Back //Back
mesh->polygons[0].vertexcount = 4; mesh->polygons[0].vertexcount = 4;
mesh->polygons[0].vertices = new Vertex *[4]; mesh->polygons[0].vertices = new Vertex *[4];
mesh->polygons[0].vertices[0] = &mesh->vertices[0]; mesh->polygons[0].vertices[0] = &mesh->vertices[0];
mesh->polygons[0].vertices[1] = &mesh->vertices[2]; mesh->polygons[0].vertices[1] = &mesh->vertices[2];
mesh->polygons[0].vertices[2] = &mesh->vertices[3]; mesh->polygons[0].vertices[2] = &mesh->vertices[3];
mesh->polygons[0].vertices[3] = &mesh->vertices[1]; mesh->polygons[0].vertices[3] = &mesh->vertices[1];
//Front //Front
mesh->polygons[1].vertexcount = 4; mesh->polygons[1].vertexcount = 4;
mesh->polygons[1].vertices = new Vertex *[4]; mesh->polygons[1].vertices = new Vertex *[4];
mesh->polygons[1].vertices[0] = &mesh->vertices[4]; mesh->polygons[1].vertices[0] = &mesh->vertices[4];
mesh->polygons[1].vertices[1] = &mesh->vertices[5]; mesh->polygons[1].vertices[1] = &mesh->vertices[5];
mesh->polygons[1].vertices[2] = &mesh->vertices[7]; mesh->polygons[1].vertices[2] = &mesh->vertices[7];
mesh->polygons[1].vertices[3] = &mesh->vertices[6]; mesh->polygons[1].vertices[3] = &mesh->vertices[6];
//Left //Left
mesh->polygons[2].vertexcount = 4; mesh->polygons[2].vertexcount = 4;
mesh->polygons[2].vertices = new Vertex *[4]; mesh->polygons[2].vertices = new Vertex *[4];
mesh->polygons[2].vertices[0] = &mesh->vertices[0]; mesh->polygons[2].vertices[0] = &mesh->vertices[0];
mesh->polygons[2].vertices[1] = &mesh->vertices[4]; mesh->polygons[2].vertices[1] = &mesh->vertices[4];
mesh->polygons[2].vertices[2] = &mesh->vertices[6]; mesh->polygons[2].vertices[2] = &mesh->vertices[6];
mesh->polygons[2].vertices[3] = &mesh->vertices[2]; mesh->polygons[2].vertices[3] = &mesh->vertices[2];
//Right //Right
mesh->polygons[3].vertexcount = 4; mesh->polygons[3].vertexcount = 4;
mesh->polygons[3].vertices = new Vertex *[4]; mesh->polygons[3].vertices = new Vertex *[4];
mesh->polygons[3].vertices[0] = &mesh->vertices[1]; mesh->polygons[3].vertices[0] = &mesh->vertices[1];
mesh->polygons[3].vertices[1] = &mesh->vertices[3]; mesh->polygons[3].vertices[1] = &mesh->vertices[3];
mesh->polygons[3].vertices[2] = &mesh->vertices[7]; mesh->polygons[3].vertices[2] = &mesh->vertices[7];
mesh->polygons[3].vertices[3] = &mesh->vertices[5]; mesh->polygons[3].vertices[3] = &mesh->vertices[5];
//Top //Top
mesh->polygons[4].vertexcount = 4; mesh->polygons[4].vertexcount = 4;
mesh->polygons[4].vertices = new Vertex *[4]; mesh->polygons[4].vertices = new Vertex *[4];
mesh->polygons[4].vertices[0] = &mesh->vertices[2]; mesh->polygons[4].vertices[0] = &mesh->vertices[2];
mesh->polygons[4].vertices[1] = &mesh->vertices[6]; mesh->polygons[4].vertices[1] = &mesh->vertices[6];
mesh->polygons[4].vertices[2] = &mesh->vertices[7]; mesh->polygons[4].vertices[2] = &mesh->vertices[7];
mesh->polygons[4].vertices[3] = &mesh->vertices[3]; mesh->polygons[4].vertices[3] = &mesh->vertices[3];
//Bottom //Bottom
mesh->polygons[5].vertexcount = 4; mesh->polygons[5].vertexcount = 4;
mesh->polygons[5].vertices = new Vertex *[4]; mesh->polygons[5].vertices = new Vertex *[4];
mesh->polygons[5].vertices[0] = &mesh->vertices[0]; mesh->polygons[5].vertices[0] = &mesh->vertices[0];
mesh->polygons[5].vertices[1] = &mesh->vertices[1]; mesh->polygons[5].vertices[1] = &mesh->vertices[1];
mesh->polygons[5].vertices[2] = &mesh->vertices[5]; mesh->polygons[5].vertices[2] = &mesh->vertices[5];
mesh->polygons[5].vertices[3] = &mesh->vertices[4]; mesh->polygons[5].vertices[3] = &mesh->vertices[4];
mesh->createPlanes(); mesh->createPlanes();
mesh->createEdges(); mesh->createEdges();
//mesh->createVertexnormals(); //mesh->createVertexnormals();
return mesh; return mesh;
} }
@ -259,14 +212,14 @@ char* findStringEnd(char* data, char* findstring){
} }
Mesh* loadAscModel(char *filename, float scale){ Mesh* loadAscModel(char *filename, float scale){
float zeroOffset[3] = {0.0, 0.0, 0.0}; float zeroOffset[3] = {0.0, 0.0, 0.0};
return loadAscModel(filename, scale, (float*)zeroOffset); return loadAscModel(filename, scale, (float*)zeroOffset);
} }
Mesh* loadAscModel(char *filename, float scale, float* offset){ Mesh* loadAscModel(char *filename, float scale, float* offset){
Mesh* target = new Mesh(); Mesh* target = new Mesh();
FILE* file; FILE* file;
float x, y, z; float x, y, z;
@ -287,7 +240,7 @@ Mesh* loadAscModel(char *filename, float scale, float* offset){
target->polygoncount=getValueFromString(face); target->polygoncount=getValueFromString(face);
target->vertices = new Vertex[target->vertexcount]; target->vertices = new Vertex[target->vertexcount];
target->polygons = new class Polygon[target->polygoncount]; target->polygons = new class Polygon[target->polygoncount];
int i; int i;
@ -311,7 +264,7 @@ Mesh* loadAscModel(char *filename, float scale, float* offset){
} }
int vnum; int vnum;
face=findStringEnd(data,"Face list:"); face=findStringEnd(data,"Face list:");
for (i=0;i<target->polygoncount;i++){ for (i=0;i<target->polygoncount;i++){
face=findStringEnd(face,"Face"); face=findStringEnd(face,"Face");
@ -320,25 +273,25 @@ Mesh* loadAscModel(char *filename, float scale, float* offset){
target->polygons[i].vertexcount = 3; target->polygons[i].vertexcount = 3;
target->polygons[i].vertices = new Vertex *[3]; target->polygons[i].vertices = new Vertex *[3];
target->polygons[i].vertices[0]=&(target->vertices[vnum]); target->polygons[i].vertices[0]=&(target->vertices[vnum]);
target->polygons[i].vertices[0]->setTexCoords(target->vertices[vnum].texcoords[0], target->polygons[i].vertices[0]->setTexCoords(target->vertices[vnum].texcoords[0],
target->vertices[vnum].texcoords[1]); target->vertices[vnum].texcoords[1]);
face=findStringEnd(face,"B:"); face=findStringEnd(face,"B:");
vnum=getValueFromString(face); vnum=getValueFromString(face);
target->polygons[i].vertices[1]=&(target->vertices[vnum]); target->polygons[i].vertices[1]=&(target->vertices[vnum]);
target->polygons[i].vertices[1]->setTexCoords(target->vertices[vnum].texcoords[0], target->polygons[i].vertices[1]->setTexCoords(target->vertices[vnum].texcoords[0],
target->vertices[vnum].texcoords[1]); target->vertices[vnum].texcoords[1]);
face=findStringEnd(face,"C:"); face=findStringEnd(face,"C:");
vnum=getValueFromString(face); vnum=getValueFromString(face);
target->polygons[i].vertices[2]=&(target->vertices[vnum]); target->polygons[i].vertices[2]=&(target->vertices[vnum]);
target->polygons[i].vertices[2]->setTexCoords(target->vertices[vnum].texcoords[0], target->polygons[i].vertices[2]->setTexCoords(target->vertices[vnum].texcoords[0],
target->vertices[vnum].texcoords[1]); target->vertices[vnum].texcoords[1]);
char *face2=findStringEnd(face,"Nosmooth"); char *face2=findStringEnd(face,"Nosmooth");
char *face3=findStringEnd(face,"Smoothing"); char *face3=findStringEnd(face,"Smoothing");
if (face2 > face && face2 < face3) target->polygons[i].realsmooth = true; if (face2 > face && face2 < face3) target->polygons[i].realsmooth = true;
} }
free(data); free(data);
data = NULL; data = NULL;
//target->createEdges(); //target->createEdges();
target->createPlanes(); target->createPlanes();
target->createVertexnormals(); target->createVertexnormals();
//return new MeshObject(target); //return new MeshObject(target);
@ -346,26 +299,26 @@ Mesh* loadAscModel(char *filename, float scale, float* offset){
} }
void drawTrophy(void){ void drawTrophy(void){
point2d points[14]; point2d points[14];
int width = 3; int width = 3;
int i = 0; int i = 0;
points[i].x = 0.0; points[i].y = 0.0; i++; points[i].x = 0.0; points[i].y = 0.0; i++;
points[i].x = width; points[i].y = 0.0; i++; points[i].x = width; points[i].y = 0.0; i++;
points[i].x = width-2; points[i].y = 2.0; i++; points[i].x = width-2; points[i].y = 2.0; i++;
points[i].x = width-2; points[i].y = 3.0; i++; points[i].x = width-2; points[i].y = 3.0; i++;
points[i].x = width-1; points[i].y = 4.0; i++; points[i].x = width-1; points[i].y = 4.0; i++;
points[i].x = width-2; points[i].y = 5.0; i++; points[i].x = width-2; points[i].y = 5.0; i++;
points[i].x = width-2; points[i].y = 6.0; i++; points[i].x = width-2; points[i].y = 6.0; i++;
points[i].x = width-1; points[i].y = 8.0; i++; points[i].x = width-1; points[i].y = 8.0; i++;
points[i].x = width; points[i].y = 9.0; i++; points[i].x = width; points[i].y = 9.0; i++;
points[i].x = width+1; points[i].y = 11.0; i++; points[i].x = width+1; points[i].y = 11.0; i++;
points[i].x = width+2; points[i].y = 15.0; i++; points[i].x = width+2; points[i].y = 15.0; i++;
points[i].x = width+3; points[i].y = 21.0; i++; points[i].x = width+3; points[i].y = 21.0; i++;
points[i].x = width+2; points[i].y = 21.0; i++; points[i].x = width+2; points[i].y = 21.0; i++;
points[i].x = 0.0; points[i].y = 8.0; i++; points[i].x = 0.0; points[i].y = 8.0; i++;
createLathedSurface(points, NULL, i, i*5, i*10); createLathedSurface(points, NULL, i, i*5, i*10);
} }

View file

@ -1,35 +1,3 @@
/*
* $Id: objectfactory.h,v 1.7 2002/07/22 01:14:14 msell Exp $
*
*
* $Log: objectfactory.h,v $
* Revision 1.7 2002/07/22 01:14:14 msell
* Lopetussysteemi
*
* Revision 1.6 2002/07/19 20:33:28 msell
* #pragma once -> #ifndef
*
* Revision 1.5 2002/07/14 21:22:39 jkaarlas
* skybox ja ukkojen säätö
*
* Revision 1.4 2002/07/11 18:33:06 jkaarlas
* ascloaderi palauttaa nyt meshin
*
* Revision 1.3 2002/06/26 22:30:02 jkaarlas
* lisätty asc-loaderi
*
* Revision 1.2 2002/06/24 14:12:15 msell
* Nyt toimii sphere -> mesh -törmäykset, ihan tosi
*
* Revision 1.1 2002/06/20 22:50:12 msell
* Meshit
*
*
*
* $Date: 2002/07/22 01:14:14 $
*
*/
#ifndef __OBJECTFACTORY_H_INCLUDED__ #ifndef __OBJECTFACTORY_H_INCLUDED__
#define __OBJECTFACTORY_H_INCLUDED__ #define __OBJECTFACTORY_H_INCLUDED__

View file

@ -1,17 +1,3 @@
/*
* $Id: particle.cpp,v 1.1 2002/07/19 12:10:53 msell Exp $
*
*
* $Log: particle.cpp,v $
* Revision 1.1 2002/07/19 12:10:53 msell
* Hups
*
*
*
* $Date: 2002/07/19 12:10:53 $
*
*/
#include "main.h" #include "main.h"
#include <math.h> #include <math.h>
@ -26,7 +12,7 @@
Particle::Particle(World *world, Mesh *mesh) : MeshObject(mesh){ Particle::Particle(World *world, Mesh *mesh) : MeshObject(mesh){
this->world = world; this->world = world;
} }
Contact *contact = new Contact(); Contact *contact = new Contact();
@ -34,132 +20,132 @@ Contact *contact = new Contact();
int bloodcount; int bloodcount;
void Particle::move(void){ void Particle::move(void){
/*if (position[1] + momentum[1] < 0.5){ /*if (position[1] + momentum[1] < 0.5){
currentparticle->velocity.x*=0.8; currentparticle->velocity.x*=0.8;
currentparticle->velocity.y=fabs(currentparticle->velocity.y)*0.8; currentparticle->velocity.y=fabs(currentparticle->velocity.y)*0.8;
currentparticle->velocity.z*=0.8; currentparticle->velocity.z*=0.8;
currentparticle->bounces++; currentparticle->bounces++;
} }
currentparticle->position.x+=currentparticle->velocity.x; currentparticle->position.x+=currentparticle->velocity.x;
currentparticle->position.y+=currentparticle->velocity.y; currentparticle->position.y+=currentparticle->velocity.y;
currentparticle->position.z+=currentparticle->velocity.z; currentparticle->position.z+=currentparticle->velocity.z;
currentparticle->angle.x+=currentparticle->velocity.x*50; currentparticle->angle.x+=currentparticle->velocity.x*50;
currentparticle->angle.y+=currentparticle->velocity.y*50; currentparticle->angle.y+=currentparticle->velocity.y*50;
currentparticle->angle.z+=currentparticle->velocity.z*50; currentparticle->angle.z+=currentparticle->velocity.z*50;
currentparticle->velocity.y-=0.003; currentparticle->velocity.y-=0.003;
if (currentparticle->bounces==3) dieParticle(currentparticle);*/ if (currentparticle->bounces==3) dieParticle(currentparticle);*/
momentum[1] -= 0.02; momentum[1] -= 0.02;
int i; int i;
vectorSet(contact->normal, 0, 1, 0); vectorSet(contact->normal, 0, 1, 0);
contact->object2 = NULL; contact->object2 = NULL;
bool die = false; bool die = false;
for (i = 0; i < mesh->vertexcount; i++){ for (i = 0; i < mesh->vertexcount; i++){
float point[3]; float point[3];
transformPoint(point, mesh->vertices[i].position); transformPoint(point, mesh->vertices[i].position);
if (point[1] < 0){ if (point[1] < 0){
contact->object1 = this; contact->object1 = this;
vectorCopy(contact->position, point); vectorCopy(contact->position, point);
handleCollision(contact); handleCollision(contact);
/*float impulse[3]; /*float impulse[3];
getMomentum(impulse); getMomentum(impulse);
impulse[0] = 0; impulse[0] = 0;
impulse[1] = fabs(impulse[1]); impulse[1] = fabs(impulse[1]);
impulse[2] = 0; impulse[2] = 0;
vectorScale(impulse, 1.1); vectorScale(impulse, 1.1);
addImpulse(impulse, point); addImpulse(impulse, point);
position[1] -= point[1]; position[1] -= point[1];
momentum[1] = impulse[1]*0.5;*/ momentum[1] = impulse[1]*0.5;*/
} }
} }
/*if (vectorLength(momentum) < 0.5) die = true; /*if (vectorLength(momentum) < 0.5) die = true;
if (die) removeBlood(id);*/ if (die) removeBlood(id);*/
lifetime++; lifetime++;
Object::move(); Object::move();
if (lifetime > 300) removeBlood(id); if (lifetime > 300) removeBlood(id);
} }
void Particle::hitForce(float speed, Object *source){ void Particle::hitForce(float speed, Object *source){
/*bounces++; /*bounces++;
if (bounces == 2){ if (bounces == 2){
removeBlood(id); removeBlood(id);
}*/ }*/
} }
void Particle::create(float *position, float *velocity){ void Particle::create(float *position, float *velocity){
vectorCopy(this->position, position); vectorCopy(this->position, position);
vectorCopy(this->momentum, velocity); vectorCopy(this->momentum, velocity);
float rotate[3] = {randomf(2)-1, randomf(2)-1, randomf(2)-1}; float rotate[3] = {randomf(2)-1, randomf(2)-1, randomf(2)-1};
vectorCopy(this->angularmomentum, rotate); vectorCopy(this->angularmomentum, rotate);
bounces = 0; bounces = 0;
lifetime = 0; lifetime = 0;
world->addParticle(this); world->addParticle(this);
} }
void Particle::destroy(void){ void Particle::destroy(void){
world->removeParticle(this); world->removeParticle(this);
} }
Particle **bloodparticles; Particle **bloodparticles;
BloodAppearance::BloodAppearance(int *lifetime) : BasicBlockAppearance(1, 1, 1){ BloodAppearance::BloodAppearance(int *lifetime) : BasicBlockAppearance(1, 1, 1){
this->lifetime = lifetime; this->lifetime = lifetime;
usematerial = false; usematerial = false;
} }
void BloodAppearance::draw(void){ void BloodAppearance::draw(void){
glPushMatrix(); glPushMatrix();
glEnable(GL_BLEND); glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
float alpha = 1-*lifetime*0.003; float alpha = 1-*lifetime*0.003;
if (alpha < 0) alpha = 0; if (alpha < 0) alpha = 0;
glColor4f(1, 0, 0, alpha);//1.0/(1+*lifetime*0.004)); glColor4f(1, 0, 0, alpha);//1.0/(1+*lifetime*0.004));
glScalef(0.5, 0.5, 0.5); glScalef(0.5, 0.5, 0.5);
BasicBlockAppearance::draw(); BasicBlockAppearance::draw();
glDisable(GL_BLEND); glDisable(GL_BLEND);
glPopMatrix(); glPopMatrix();
} }
World *bloodworld; World *bloodworld;
void initBloods(World *world){ void initBloods(World *world){
bloodcount = 0; bloodcount = 0;
bloodparticles = new Particle *[MAXBLOOD]; bloodparticles = new Particle *[MAXBLOOD];
int i; int i;
Mesh *bloodmesh = createBox(-0.5, 0.5, -0.5*BLOCKHEIGHT, 0.5*BLOCKHEIGHT, -0.5, 0.5); Mesh *bloodmesh = createBox(-0.5, 0.5, -0.5*BLOCKHEIGHT, 0.5*BLOCKHEIGHT, -0.5, 0.5);
for (i = 0; i < MAXBLOOD; i++){ for (i = 0; i < MAXBLOOD; i++){
bloodparticles[i] = new Particle(world, bloodmesh); bloodparticles[i] = new Particle(world, bloodmesh);
bloodparticles[i]->appearance = new BloodAppearance(&(bloodparticles[i]->lifetime)); bloodparticles[i]->appearance = new BloodAppearance(&(bloodparticles[i]->lifetime));
bloodparticles[i]->setMass(1); bloodparticles[i]->setMass(1);
bloodparticles[i]->prepare(); bloodparticles[i]->prepare();
//bloodparticles[i]->setGravity(true); //bloodparticles[i]->setGravity(true);
//bloodparticles[i]->setCollisionGroup(COLLISIONGROUP_PARTICLE); //bloodparticles[i]->setCollisionGroup(COLLISIONGROUP_PARTICLE);
//bloodparticles[i]->id = i; //bloodparticles[i]->id = i;
} }
bloodworld = world; bloodworld = world;
} }
void createBlood(float *position, float *velocity){ void createBlood(float *position, float *velocity){
if (bloodcount < MAXBLOOD){ if (bloodcount < MAXBLOOD){
Particle *currentparticle = bloodparticles[bloodcount]; Particle *currentparticle = bloodparticles[bloodcount];
currentparticle->create(position, velocity); currentparticle->create(position, velocity);
currentparticle->id = bloodcount; currentparticle->id = bloodcount;
bloodcount++; bloodcount++;
} }
} }
void removeBlood(int id){ void removeBlood(int id){
Particle *particle = bloodparticles[id]; Particle *particle = bloodparticles[id];
particle->destroy(); particle->destroy();
bloodparticles[id] = bloodparticles[bloodcount-1]; bloodparticles[id] = bloodparticles[bloodcount-1];
bloodparticles[id]->id = id; bloodparticles[id]->id = id;
bloodparticles[bloodcount-1] = particle; bloodparticles[bloodcount-1] = particle;
bloodcount--; bloodcount--;
} }

View file

@ -1,20 +1,3 @@
/*
* $Id: particle.h,v 1.2 2002/07/19 20:33:28 msell Exp $
*
*
* $Log: particle.h,v $
* Revision 1.2 2002/07/19 20:33:28 msell
* #pragma once -> #ifndef
*
* Revision 1.1 2002/07/19 12:10:53 msell
* Hups
*
*
*
* $Date: 2002/07/19 20:33:28 $
*
*/
#ifndef __PARTICLE_H_INCLUDED__ #ifndef __PARTICLE_H_INCLUDED__
#define __PARTICLE_H_INCLUDED__ #define __PARTICLE_H_INCLUDED__
@ -27,26 +10,26 @@ class BloodAppearance;
class Particle : public MeshObject{ class Particle : public MeshObject{
private: private:
int bounces; int bounces;
bool enabled; bool enabled;
World *world; World *world;
bool alive; bool alive;
public: public:
int lifetime; int lifetime;
int id; int id;
Particle(World *world, Mesh *mesh); Particle(World *world, Mesh *mesh);
void move(void); void move(void);
void hitForce(float speed, Object *source); void hitForce(float speed, Object *source);
void create(float *position, float *velocity); void create(float *position, float *velocity);
void destroy(void); void destroy(void);
}; };
@ -57,12 +40,12 @@ public:
class BloodAppearance : public BasicBlockAppearance{ class BloodAppearance : public BasicBlockAppearance{
private: private:
int *lifetime; int *lifetime;
public: public:
BloodAppearance(int *lifetime); BloodAppearance(int *lifetime);
void draw(void); void draw(void);
}; };
void initBloods(World *world); void initBloods(World *world);

View file

@ -1,88 +1,3 @@
/*
* $Id: run.cpp,v 1.24 2002/07/22 11:44:16 jkaarlas Exp $
*
*
* $Log: run.cpp,v $
* Revision 1.24 2002/07/22 11:44:16 jkaarlas
* naama
*
* Revision 1.23 2002/07/22 01:14:14 msell
* Lopetussysteemi
*
* Revision 1.22 2002/07/19 22:38:38 msell
* Pingviini
*
* Revision 1.21 2002/07/19 21:17:07 msell
* bugifixi
*
* Revision 1.20 2002/07/19 20:06:32 msell
* Linux-porttausta
*
* Revision 1.19 2002/07/19 19:46:07 msell
* Makefile
*
* Revision 1.18 2002/07/19 18:59:46 msell
* Alkuhommaa ja säätöä
*
* Revision 1.17 2002/07/19 14:05:52 msell
* Damagetextuurit näkyy
*
* Revision 1.16 2002/07/19 12:48:57 jkaarlas
* damagepää
*
* Revision 1.15 2002/07/19 12:42:44 msell
* Loading...
*
* Revision 1.14 2002/07/17 20:32:48 msell
* Detail-optio toimii
*
* Revision 1.13 2002/07/17 16:40:33 msell
* Resoluution vaihto
*
* Revision 1.12 2002/07/16 19:57:14 jkaarlas
* lisätty DATAPATH tiedostonimien eteen
*
* Revision 1.11 2002/07/16 17:16:35 msell
* Fontit ja valikot
*
* Revision 1.10 2002/07/04 21:05:41 msell
* Se toimii!! =)
* Törmäystarkistukset siis
*
* Revision 1.9 2002/06/17 20:49:05 msell
* free -> SDL_FreeSurface
*
* Revision 1.8 2002/06/17 19:58:08 msell
* #includeiden parantelua
*
* Revision 1.7 2002/06/16 01:04:58 jkaarlas
* tulipa säädettyä includejen kanssa. oon tod.näk. eri mieltä aamulla
*
* Revision 1.6 2002/06/02 16:57:37 msell
* Objektirakenteen pohja
*
* Revision 1.5 2002/05/18 12:29:35 msell
* Valot ja äänijärjestelmän parantelua
*
* Revision 1.4 2002/05/17 12:30:26 msell
* no message
*
* Revision 1.3 2002/05/16 18:41:16 msell
* Vektorifunctioita ja kamera
*
* Revision 1.2 2002/05/15 21:07:23 msell
* Äänisäätöä
*
* Revision 1.1 2002/05/15 14:36:39 msell
* Yksinkertainen SDL-runko (Kääntyy toistaiseksi vain windowsissa).
* Mukana myös musiikinsoitto fmodilla.
*
*
*
* $Date: 2002/07/22 11:44:16 $
*
*/
#include "main.h" #include "main.h"
#include <SDL.h> #include <SDL.h>
@ -107,77 +22,77 @@ bool gameinitialized = false;
void initFontTexture(void); void initFontTexture(void);
void initScenes(void){ void initScenes(void){
knobgllist = glGenLists(1); knobgllist = glGenLists(1);
setDetail(detail); setDetail(detail);
//Simple loading-screen
enable2D();
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //Simple loading-screen
SDL_GL_SwapBuffers(); enable2D();
initFontTexture(); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
SDL_GL_SwapBuffers();
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); initFontTexture();
print(0.08, 0.4, "Loading...", 0.2);
SDL_GL_SwapBuffers();
disable2D(); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
print(0.08, 0.4, "Loading...", 0.2);
SDL_GL_SwapBuffers();
disable2D();
SKYBOX = -1; SKYBOX = -1;
initTextures(); initTextures();
initFight(); initFight();
initMenu(); initMenu();
initEnd(); initEnd();
changeGameMode(MENUMODE); changeGameMode(MENUMODE);
//changeGameMode(ENDMODE); //changeGameMode(ENDMODE);
gameinitialized = true; gameinitialized = true;
} }
void changeGameMode(int newmode){ void changeGameMode(int newmode){
gamemode = newmode; gamemode = newmode;
changed = true; changed = true;
} }
void calculateFrame(int framecount){ void calculateFrame(int framecount){
switch(gamemode){ switch(gamemode){
case MENUMODE: case MENUMODE:
calculateMenu(framecount); calculateMenu(framecount);
break; break;
case FIGHTMODE: case FIGHTMODE:
calculateFight(framecount); calculateFight(framecount);
break; break;
case ENDMODE: case ENDMODE:
calculateEnd(framecount); calculateEnd(framecount);
break; break;
} }
updateAudio(); updateAudio();
changed = false; changed = false;
} }
void drawFrame(int framecount){ void drawFrame(int framecount){
if (changed) calculateFrame(framecount); if (changed) calculateFrame(framecount);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW); glMatrixMode(GL_MODELVIEW);
switch(gamemode){
case MENUMODE:
drawMenu(framecount);
break;
case FIGHTMODE:
drawFight(framecount);
break;
case ENDMODE:
drawEnd(framecount);
break;
}
SDL_GL_SwapBuffers(); switch(gamemode){
case MENUMODE:
drawMenu(framecount);
break;
case FIGHTMODE:
drawFight(framecount);
break;
case ENDMODE:
drawEnd(framecount);
break;
}
SDL_GL_SwapBuffers();
} }
/*int SKY_FRONT_ID; /*int SKY_FRONT_ID;
@ -204,95 +119,95 @@ Texture *tuxtexture;
Texture *faceTexture; Texture *faceTexture;
void initFontTexture(void){ void initFontTexture(void){
if (!texturesloaded){ if (!texturesloaded){
float trans[3] = {1, 0, 0}; float trans[3] = {1, 0, 0};
fonttexture = new Texture(); fonttexture = new Texture();
fonttexture->loadImage(DATAPATH"font.png", trans); fonttexture->loadImage(DATAPATH"font.png", trans);
} else{ } else{
fonttexture->reload(); fonttexture->reload();
} }
} }
void initTextures(void){ void initTextures(void){
/*SKY_FRONT_ID = DRUID.loadTexture(SKYFRONT); /*SKY_FRONT_ID = DRUID.loadTexture(SKYFRONT);
SKY_BACK_ID = DRUID.loadTexture(SKYBACK); SKY_BACK_ID = DRUID.loadTexture(SKYBACK);
SKY_LEFT_ID = DRUID.loadTexture(SKYLEFT); SKY_LEFT_ID = DRUID.loadTexture(SKYLEFT);
SKY_RIGHT_ID = DRUID.loadTexture(SKYRIGHT); SKY_RIGHT_ID = DRUID.loadTexture(SKYRIGHT);
SKY_TOP_ID = DRUID.loadTexture(SKYTOP); SKY_TOP_ID = DRUID.loadTexture(SKYTOP);
SKY_BOTTOM_ID = DRUID.loadTexture(SKYBOTTOM);*/ SKY_BOTTOM_ID = DRUID.loadTexture(SKYBOTTOM);*/
if (!texturesloaded){ if (!texturesloaded){
skyfronttexture = new Texture(); skyfronttexture = new Texture();
skyfronttexture->loadImage(SKYFRONT); skyfronttexture->loadImage(SKYFRONT);
skybacktexture = new Texture(); skybacktexture = new Texture();
skybacktexture->loadImage(SKYBACK); skybacktexture->loadImage(SKYBACK);
skylefttexture = new Texture(); skylefttexture = new Texture();
skylefttexture->loadImage(SKYLEFT); skylefttexture->loadImage(SKYLEFT);
skyrighttexture = new Texture(); skyrighttexture = new Texture();
skyrighttexture->loadImage(SKYRIGHT); skyrighttexture->loadImage(SKYRIGHT);
skytoptexture = new Texture(); skytoptexture = new Texture();
skytoptexture->loadImage(SKYTOP); skytoptexture->loadImage(SKYTOP);
skybottomtexture = new Texture(); skybottomtexture = new Texture();
skybottomtexture->loadImage(SKYBOTTOM); skybottomtexture->loadImage(SKYBOTTOM);
float something[3] = {1, 0, 0.5}; float something[3] = {1, 0, 0.5};
damageHead = new Texture(); damageHead = new Texture();
damageHead->loadImage(DAMAGEHEAD, something); damageHead->loadImage(DAMAGEHEAD, something);
damageTorso = new Texture(); damageTorso = new Texture();
damageTorso->loadImage(DAMAGETORSO, something); damageTorso->loadImage(DAMAGETORSO, something);
damageHand = new Texture(); damageHand = new Texture();
damageHand->loadImage(DAMAGEHAND, something); damageHand->loadImage(DAMAGEHAND, something);
damageLeg = new Texture(); damageLeg = new Texture();
damageLeg->loadImage(DAMAGELEG, something); damageLeg->loadImage(DAMAGELEG, something);
faceTexture = new Texture(); faceTexture = new Texture();
something[2] = 1; something[2] = 1;
faceTexture->loadImage(FACE, something); faceTexture->loadImage(FACE, something);
float zeros[3] = {0, 0, 0}; float zeros[3] = {0, 0, 0};
flaretexture = new Texture(); flaretexture = new Texture();
flaretexture->loadImage(DATAPATH"flare.png", zeros); flaretexture->loadImage(DATAPATH"flare.png", zeros);
float pink[3] = {1, 0, 1};
tuxtexture = new Texture();
tuxtexture->loadImage(DATAPATH"tux.png", pink);
} else{
skyfronttexture->reload();
skybacktexture->reload();
skylefttexture->reload();
skyrighttexture->reload();
skytoptexture->reload();
skybottomtexture->reload();
damageHead->reload(); float pink[3] = {1, 0, 1};
damageTorso->reload(); tuxtexture = new Texture();
damageHand->reload(); tuxtexture->loadImage(DATAPATH"tux.png", pink);
damageLeg->reload(); } else{
skyfronttexture->reload();
skybacktexture->reload();
skylefttexture->reload();
skyrighttexture->reload();
skytoptexture->reload();
skybottomtexture->reload();
flaretexture->reload(); damageHead->reload();
damageTorso->reload();
damageHand->reload();
damageLeg->reload();
tuxtexture->reload(); flaretexture->reload();
}
texturesloaded = true; tuxtexture->reload();
}
texturesloaded = true;
} }
void setDetail(int detail){ void setDetail(int detail){
switch(detail){ switch(detail){
case 0: case 0:
knobdetail = 0; knobdetail = 0;
break; break;
case 1: case 1:
knobdetail = 5; knobdetail = 5;
break; break;
case 2: case 2:
knobdetail = 8; knobdetail = 8;
break; break;
case 3: case 3:
knobdetail = 16; knobdetail = 16;
break; break;
} }
initKnob(); initKnob();
} }

View file

@ -1,42 +1,3 @@
/*
* $Id: run.h,v 1.9 2002/07/22 01:14:14 msell Exp $
*
*
* $Log: run.h,v $
* Revision 1.9 2002/07/22 01:14:14 msell
* Lopetussysteemi
*
* Revision 1.8 2002/07/19 20:33:29 msell
* #pragma once -> #ifndef
*
* Revision 1.7 2002/07/17 20:32:48 msell
* Detail-optio toimii
*
* Revision 1.6 2002/07/16 17:16:35 msell
* Fontit ja valikot
*
* Revision 1.5 2002/06/04 16:28:32 msell
* #pragma once
*
* Revision 1.4 2002/06/02 16:57:37 msell
* Objektirakenteen pohja
*
* Revision 1.3 2002/05/17 12:30:26 msell
* no message
*
* Revision 1.2 2002/05/16 18:41:16 msell
* Vektorifunctioita ja kamera
*
* Revision 1.1 2002/05/15 14:36:39 msell
* Yksinkertainen SDL-runko (Kääntyy toistaiseksi vain windowsissa).
* Mukana myös musiikinsoitto fmodilla.
*
*
*
* $Date: 2002/07/22 01:14:14 $
*
*/
#ifndef __RUN_H_INCLUDED__ #ifndef __RUN_H_INCLUDED__
#define __RUN_H_INCLUDED__ #define __RUN_H_INCLUDED__

View file

@ -1,52 +1,18 @@
/*
* $Id: shape.cpp,v 1.7 2002/07/04 21:05:41 msell Exp $
*
*
* $Log: shape.cpp,v $
* Revision 1.7 2002/07/04 21:05:41 msell
* Se toimii!! =)
* Törmäystarkistukset siis
*
* Revision 1.6 2002/06/30 16:05:04 msell
* Törmäyksien parantelua, transformaatioita mukana
*
* Revision 1.5 2002/06/24 14:12:15 msell
* Nyt toimii sphere -> mesh -törmäykset, ihan tosi
*
* Revision 1.4 2002/06/20 22:50:12 msell
* Meshit
*
* Revision 1.3 2002/06/15 17:18:37 msell
* Toimiva törmäystarkastus kiinteille laatikoille
*
* Revision 1.2 2002/06/14 00:05:05 msell
* Törmäyssimulaatio kunnossa toivon mukaan
*
* Revision 1.1 2002/06/11 23:11:45 msell
* Törmäystarkistusta
*
*
*
*
* $Date: 2002/07/04 21:05:41 $
*
*/
#include "shape.h" #include "shape.h"
Shape::Shape(Object *object){ Shape::Shape(Object *object){
this->object = object; this->object = object;
} }
bool Shape::checkCollision(Object *target){ bool Shape::checkCollision(Object *target){
return false; return false;
} }
bool Shape::checkCollisionPeer(Shape *target){ bool Shape::checkCollisionPeer(Shape *target){
return false; return false;
} }
bool Shape::checkCollisionPeer(SphereShape *target){ bool Shape::checkCollisionPeer(SphereShape *target){
return false; return false;
} }
bool Shape::checkCollisionPeer(MeshShape *target){ bool Shape::checkCollisionPeer(MeshShape *target){
return false; return false;
} }

View file

@ -1,51 +1,3 @@
/*
* $Id: shape.h,v 1.12 2002/07/19 20:33:29 msell Exp $
*
*
* $Log: shape.h,v $
* Revision 1.12 2002/07/19 20:33:29 msell
* #pragma once -> #ifndef
*
* Revision 1.11 2002/07/04 21:05:41 msell
* Se toimii!! =)
* Törmäystarkistukset siis
*
* Revision 1.10 2002/06/30 16:05:04 msell
* Törmäyksien parantelua, transformaatioita mukana
*
* Revision 1.9 2002/06/24 14:12:15 msell
* Nyt toimii sphere -> mesh -törmäykset, ihan tosi
*
* Revision 1.8 2002/06/20 22:50:12 msell
* Meshit
*
* Revision 1.7 2002/06/15 17:18:37 msell
* Toimiva törmäystarkastus kiinteille laatikoille
*
* Revision 1.6 2002/06/14 00:05:05 msell
* Törmäyssimulaatio kunnossa toivon mukaan
*
* Revision 1.5 2002/06/11 23:11:45 msell
* Törmäystarkistusta
*
* Revision 1.4 2002/06/07 21:16:51 msell
* Fysiikkaenginen alkua
*
* Revision 1.3 2002/06/05 23:55:46 msell
* Pallo
*
* Revision 1.2 2002/06/04 16:28:32 msell
* #pragma once
*
* Revision 1.1 2002/06/02 16:57:37 msell
* Objektirakenteen pohja
*
*
*
* $Date: 2002/07/19 20:33:29 $
*
*/
#ifndef __SHAPE_H_INCLUDED__ #ifndef __SHAPE_H_INCLUDED__
#define __SHAPE_H_INCLUDED__ #define __SHAPE_H_INCLUDED__
@ -60,19 +12,19 @@ class MeshShape;
*/ */
class Shape{ class Shape{
protected: protected:
Object *object; Object *object;
public: public:
Shape(Object *object); Shape(Object *object);
virtual float calculateMomentOfInertia(float *rotationvector) = 0; virtual float calculateMomentOfInertia(float *rotationvector) = 0;
virtual bool checkCollision(Object *target); virtual bool checkCollision(Object *target);
virtual bool checkCollisionPeer(Shape *target); virtual bool checkCollisionPeer(Shape *target);
virtual bool checkCollisionPeer(SphereShape *target); virtual bool checkCollisionPeer(SphereShape *target);
virtual bool checkCollisionPeer(MeshShape *target); virtual bool checkCollisionPeer(MeshShape *target);
}; };
#endif #endif

View file

@ -1,73 +1,3 @@
/*
* $Id: sphere.cpp,v 1.19 2002/07/19 18:59:46 msell Exp $
*
*
* $Log: sphere.cpp,v $
* Revision 1.19 2002/07/19 18:59:46 msell
* Alkuhommaa ja säätöä
*
* Revision 1.18 2002/07/07 17:53:21 msell
* Legoukon alku
*
* Revision 1.17 2002/07/04 21:05:41 msell
* Se toimii!! =)
* Törmäystarkistukset siis
*
* Revision 1.16 2002/06/30 16:05:04 msell
* Törmäyksien parantelua, transformaatioita mukana
*
* Revision 1.15 2002/06/27 14:39:48 msell
* Toimiva maila :)
* Pyörivät kappaleet siis antaa liike-energiaa liikkuville kappaleille (ei toisin päin vielä)
*
* Revision 1.14 2002/06/27 00:08:04 msell
* Kimmotukset palloille myös pyöritettyihin mesheihin
*
* Revision 1.13 2002/06/24 14:12:15 msell
* Nyt toimii sphere -> mesh -törmäykset, ihan tosi
*
* Revision 1.12 2002/06/23 20:12:19 msell
* Parempi törmäystarkistus palloista mesheihin
*
* Revision 1.11 2002/06/20 22:50:12 msell
* Meshit
*
* Revision 1.10 2002/06/20 00:21:19 jkaarlas
* materiaali- ja tekstuurihommia edistetty
*
* Revision 1.9 2002/06/17 20:49:05 msell
* free -> SDL_FreeSurface
*
* Revision 1.8 2002/06/16 01:04:58 jkaarlas
* tulipa säädettyä includejen kanssa. oon tod.näk. eri mieltä aamulla
*
* Revision 1.7 2002/06/15 17:18:37 msell
* Toimiva törmäystarkastus kiinteille laatikoille
*
* Revision 1.6 2002/06/14 00:26:17 msell
* 100 kimpoilevaa palloa ja vähän vaimennusta
*
* Revision 1.5 2002/06/14 00:05:05 msell
* Törmäyssimulaatio kunnossa toivon mukaan
*
* Revision 1.4 2002/06/11 23:23:03 msell
* Törmäystarkistusta
*
* Revision 1.3 2002/06/11 23:11:45 msell
* Törmäystarkistusta
*
* Revision 1.2 2002/06/07 21:16:51 msell
* Fysiikkaenginen alkua
*
* Revision 1.1 2002/06/05 23:55:46 msell
* Pallo
*
*
*
* $Date: 2002/07/19 18:59:46 $
*
*/
#include "main.h" #include "main.h"
#include <math.h> #include <math.h>
@ -82,252 +12,252 @@
Sphere::Sphere(void){ Sphere::Sphere(void){
appearance = new SphereAppearance(); appearance = new SphereAppearance();
Object::appearance = appearance; Object::appearance = appearance;
geometry = new SphereShape(this); geometry = new SphereShape(this);
Object::geometry = geometry; Object::geometry = geometry;
} }
void Sphere::setRadius(float r){ void Sphere::setRadius(float r){
if (r < 0) r = -r; if (r < 0) r = -r;
this->r = r; this->r = r;
appearance->setRadius(r); appearance->setRadius(r);
geometry->setRadius(r); geometry->setRadius(r);
} }
SphereAppearance::SphereAppearance(void){ SphereAppearance::SphereAppearance(void){
setRadius(1); setRadius(1);
} }
void SphereAppearance::setRadius(float r){ void SphereAppearance::setRadius(float r){
if (r < 0) r = -r; if (r < 0) r = -r;
this->r = r; this->r = r;
} }
void Sphere::setColor(float red, float green, float blue){ void Sphere::setColor(float red, float green, float blue){
appearance->getMaterial()->setColor(red, green, blue, 1); appearance->getMaterial()->setColor(red, green, blue, 1);
} }
void SphereAppearance::draw(void){ void SphereAppearance::draw(void){
material.enable(); material.enable();
createSphere(r); createSphere(r);
} }
SphereShape::SphereShape(Object *sphere) : Shape(sphere){ SphereShape::SphereShape(Object *sphere) : Shape(sphere){
setRadius(1); setRadius(1);
} }
void SphereShape::setRadius(float r){ void SphereShape::setRadius(float r){
this->r = r; this->r = r;
} }
float SphereShape::getRadius(void){ float SphereShape::getRadius(void){
return r; return r;
} }
bool SphereShape::checkCollision(Object *target){ bool SphereShape::checkCollision(Object *target){
return target->geometry->checkCollisionPeer(this); return target->geometry->checkCollisionPeer(this);
} }
float SphereShape::calculateMomentOfInertia(float *rotationvector){ float SphereShape::calculateMomentOfInertia(float *rotationvector){
return 2.0/3.0*r*r; return 2.0/3.0*r*r;
} }
/*bool SphereShape::checkCollisionPeer(PlaneShape *target){ /*bool SphereShape::checkCollisionPeer(PlaneShape *target){
float sourceposition[3], targetposition[3]; float sourceposition[3], targetposition[3];
object->getPosition(sourceposition); object->getPosition(sourceposition);
target->object->getPosition(targetposition); target->object->getPosition(targetposition);
float height = target->height + targetposition[1]; float height = target->height + targetposition[1];
if (sourceposition[1] - r < height){ if (sourceposition[1] - r < height){
//shotsound->play(); //shotsound->play();
float normal[3] = {0, 1, 0}; float normal[3] = {0, 1, 0};
float contactpoint[3] = {0, target->height, 0}; float contactpoint[3] = {0, target->height, 0};
collide(object, target->object, normal, contactpoint); collide(object, target->object, normal, contactpoint);
return true; return true;
} }
return false; return false;
}*/ }*/
bool SphereShape::checkCollisionPeer(SphereShape *target){ bool SphereShape::checkCollisionPeer(SphereShape *target){
/*float sourceposition[3], targetposition[3]; /*float sourceposition[3], targetposition[3];
object->getPosition(sourceposition); object->getPosition(sourceposition);
target->object->getPosition(targetposition); target->object->getPosition(targetposition);
float impact[3]; float impact[3];
vectorSub(impact, sourceposition, targetposition);*/ vectorSub(impact, sourceposition, targetposition);*/
float impact[3] = {0, 0, 0}; float impact[3] = {0, 0, 0};
object->transformPoint(impact, impact); object->transformPoint(impact, impact);
target->object->unTransformPoint(impact, impact); target->object->unTransformPoint(impact, impact);
float distance2 = vectorDot(impact, impact); float distance2 = vectorDot(impact, impact);
if (distance2 < (r + target->r)*(r + target->r)){ if (distance2 < (r + target->r)*(r + target->r)){
/*float temp[3], temp2[3], temp3[3]; /*float temp[3], temp2[3], temp3[3];
object->getMomentum(temp2); object->getMomentum(temp2);
target->object->getMomentum(temp3); target->object->getMomentum(temp3);
vectorSub(temp, temp2, temp3); vectorSub(temp, temp2, temp3);
shotsound->setVolume(1.0-1/(1+vectorLength(temp)*0.5)); shotsound->setVolume(1.0-1/(1+vectorLength(temp)*0.5));
shotsound->play();*/ shotsound->play();*/
float normal[3]; float normal[3];
vectorNormalize(normal, impact); vectorNormalize(normal, impact);
float contactpoint[3]; float contactpoint[3];
vectorScale(contactpoint, normal, target->r); vectorScale(contactpoint, normal, target->r);
target->object->transformVector(normal, normal); target->object->transformVector(normal, normal);
target->object->transformPoint(contactpoint, contactpoint); target->object->transformPoint(contactpoint, contactpoint);
addCollision(object, target->object, normal, contactpoint); addCollision(object, target->object, normal, contactpoint);
//vectorAdd(contactnormal, normal); //vectorAdd(contactnormal, normal);
return true;
}
return false; return true;
}
return false;
} }
bool between(float x, float x1, float x2){ bool between(float x, float x1, float x2){
if ((x >= x1 && x <=x2) || (x >= x2 && x <=x1)) return true; if ((x >= x1 && x <=x2) || (x >= x2 && x <=x1)) return true;
return false; return false;
} }
/*bool SphereShape::checkCollisionPeer(BoxShape *target){ /*bool SphereShape::checkCollisionPeer(BoxShape *target){
float sourceposition[3], targetposition[3]; float sourceposition[3], targetposition[3];
object->getPosition(sourceposition); object->getPosition(sourceposition);
target->object->getPosition(targetposition); target->object->getPosition(targetposition);
float x1 = target->x1 + targetposition[0]; float x1 = target->x1 + targetposition[0];
float x2 = target->x2 + targetposition[0]; float x2 = target->x2 + targetposition[0];
float y1 = target->y1 + targetposition[1]; float y1 = target->y1 + targetposition[1];
float y2 = target->y2 + targetposition[1]; float y2 = target->y2 + targetposition[1];
float z1 = target->z1 + targetposition[2]; float z1 = target->z1 + targetposition[2];
float z2 = target->z2 + targetposition[2]; float z2 = target->z2 + targetposition[2];
float points[3][2] = {{x1, x2}, {y1, y2}, {z1, z2}}; float points[3][2] = {{x1, x2}, {y1, y2}, {z1, z2}};
float p[2], op1[2], op2[2]; float p[2], op1[2], op2[2];
float c, oc1, oc2; float c, oc1, oc2;
int i; int i;
float normal[3]; float normal[3];
float *normal2[3]; float *normal2[3];
//Faces //Faces
for (i = 0; i < 3; i++){ for (i = 0; i < 3; i++){
p[0] = points[i][0]; p[0] = points[i][0];
p[1] = points[i][1]; p[1] = points[i][1];
op1[0] = points[(i+1)%3][0]; op1[0] = points[(i+1)%3][0];
op1[1] = points[(i+1)%3][1]; op1[1] = points[(i+1)%3][1];
op2[0] = points[(i+2)%3][0]; op2[0] = points[(i+2)%3][0];
op2[1] = points[(i+2)%3][1]; op2[1] = points[(i+2)%3][1];
c = sourceposition[i]; c = sourceposition[i];
oc1 = sourceposition[(i+1)%3]; oc1 = sourceposition[(i+1)%3];
oc2 = sourceposition[(i+2)%3]; oc2 = sourceposition[(i+2)%3];
normal2[0] = &normal[i]; normal2[0] = &normal[i];
normal2[1] = &normal[(i+1)%3]; normal2[1] = &normal[(i+1)%3];
normal2[2] = &normal[(i+2)%3]; normal2[2] = &normal[(i+2)%3];
if (between(oc1, op1[0], op1[1]) && if (between(oc1, op1[0], op1[1]) &&
between(oc2, op2[0], op2[1])){ between(oc2, op2[0], op2[1])){
if (c < p[0] && c+r > p[0]){ if (c < p[0] && c+r > p[0]){
*normal2[0] = -1; *normal2[0] = -1;
*normal2[1] = 0; *normal2[1] = 0;
*normal2[2] = 0; *normal2[2] = 0;
collide(object, target->object, normal); collide(object, target->object, normal);
return true; return true;
} }
if (c > p[1] && c-r < p[1]){ if (c > p[1] && c-r < p[1]){
*normal2[0] = 1; *normal2[0] = 1;
*normal2[1] = 0; *normal2[1] = 0;
*normal2[2] = 0; *normal2[2] = 0;
collide(object, target->object, normal); collide(object, target->object, normal);
return true; return true;
} }
} }
} }
//Edges //Edges
for (i = 0; i < 3; i++){ for (i = 0; i < 3; i++){
p[0] = points[i][0]; p[0] = points[i][0];
p[1] = points[i][1]; p[1] = points[i][1];
op1[0] = points[(i+1)%3][0]; op1[0] = points[(i+1)%3][0];
op1[1] = points[(i+1)%3][1]; op1[1] = points[(i+1)%3][1];
op2[0] = points[(i+2)%3][0]; op2[0] = points[(i+2)%3][0];
op2[1] = points[(i+2)%3][1]; op2[1] = points[(i+2)%3][1];
c = sourceposition[i]; c = sourceposition[i];
oc1 = sourceposition[(i+1)%3]; oc1 = sourceposition[(i+1)%3];
oc2 = sourceposition[(i+2)%3]; oc2 = sourceposition[(i+2)%3];
normal2[0] = &normal[i]; normal2[0] = &normal[i];
normal2[1] = &normal[(i+1)%3]; normal2[1] = &normal[(i+1)%3];
normal2[2] = &normal[(i+2)%3]; normal2[2] = &normal[(i+2)%3];
float edges[4][2] = { float edges[4][2] = {
{p[0], op1[0]}, {p[0], op1[0]},
{p[1], op1[0]}, {p[1], op1[0]},
{p[0], op1[1]}, {p[0], op1[1]},
{p[1], op1[1]}}; {p[1], op1[1]}};
if (between(oc2, op2[0], op2[1])){ if (between(oc2, op2[0], op2[1])){
int j; int j;
for (j = 0; j < 4; j++){ for (j = 0; j < 4; j++){
float diff[2] = {c - edges[j][0], oc1 - edges[j][1]}; float diff[2] = {c - edges[j][0], oc1 - edges[j][1]};
if (diff[0]*diff[0] + diff[1]*diff[1] < r*r){ if (diff[0]*diff[0] + diff[1]*diff[1] < r*r){
*normal2[0] = diff[0]; *normal2[0] = diff[0];
*normal2[1] = diff[1]; *normal2[1] = diff[1];
*normal2[2] = 0; *normal2[2] = 0;
vectorNormalize(normal); vectorNormalize(normal);
collide(object, target->object, normal); collide(object, target->object, normal);
return true; return true;
} }
} }
} }
} }
//Corners //Corners
float corners[8][3] = { float corners[8][3] = {
{x1, y1, z1}, {x1, y1, z1},
{x1, y1, z2}, {x1, y1, z2},
{x1, y2, z1}, {x1, y2, z1},
{x1, y2, z2}, {x1, y2, z2},
{x2, y1, z1}, {x2, y1, z1},
{x2, y1, z2}, {x2, y1, z2},
{x2, y2, z1}, {x2, y2, z1},
{x2, y2, z2}}; {x2, y2, z2}};
for (i = 0; i < 8; i++){ for (i = 0; i < 8; i++){
float *corner = corners[i]; float *corner = corners[i];
float difference[3]; float difference[3];
vectorSub(difference, sourceposition, corner); vectorSub(difference, sourceposition, corner);
float length2 = vectorDot(difference, difference); float length2 = vectorDot(difference, difference);
if (length2 < r*r){ if (length2 < r*r){
float normal[3]; float normal[3];
vectorNormalize(normal, difference); vectorNormalize(normal, difference);
collide(object, target->object, normal); collide(object, target->object, normal);
return true; return true;
} }
} }
return false; return false;
}*/ }*/
bool SphereShape::checkCollisionPeer(MeshShape *target){ bool SphereShape::checkCollisionPeer(MeshShape *target){
float position[3] = {0, 0, 0}; float position[3] = {0, 0, 0};
object->transformPoint(position, position); object->transformPoint(position, position);
target->object->unTransformPoint(position, position); target->object->unTransformPoint(position, position);
Mesh *mesh = target->mesh; Mesh *mesh = target->mesh;
float normal[3]; float normal[3];
float contactpoint[3]; float contactpoint[3];
if (checkSphereMeshCollision(position, r, mesh, normal, contactpoint)){ if (checkSphereMeshCollision(position, r, mesh, normal, contactpoint)){
target->object->transformVector(normal, normal); target->object->transformVector(normal, normal);
target->object->transformPoint(contactpoint, contactpoint); target->object->transformPoint(contactpoint, contactpoint);
addCollision(object, target->object, normal, contactpoint);
//vectorAdd(contactnormal, normal); addCollision(object, target->object, normal, contactpoint);
return true; //vectorAdd(contactnormal, normal);
}
return false; return true;
} }
return false;
}

View file

@ -1,48 +1,3 @@
/*
* $Id: sphere.h,v 1.11 2002/07/19 20:33:29 msell Exp $
*
*
* $Log: sphere.h,v $
* Revision 1.11 2002/07/19 20:33:29 msell
* #pragma once -> #ifndef
*
* Revision 1.10 2002/07/07 17:53:21 msell
* Legoukon alku
*
* Revision 1.9 2002/07/04 21:05:41 msell
* Se toimii!! =)
* Törmäystarkistukset siis
*
* Revision 1.8 2002/06/30 16:05:04 msell
* Törmäyksien parantelua, transformaatioita mukana
*
* Revision 1.7 2002/06/24 14:12:15 msell
* Nyt toimii sphere -> mesh -törmäykset, ihan tosi
*
* Revision 1.6 2002/06/20 22:50:12 msell
* Meshit
*
* Revision 1.5 2002/06/15 17:18:37 msell
* Toimiva törmäystarkastus kiinteille laatikoille
*
* Revision 1.4 2002/06/14 00:05:05 msell
* Törmäyssimulaatio kunnossa toivon mukaan
*
* Revision 1.3 2002/06/11 23:11:45 msell
* Törmäystarkistusta
*
* Revision 1.2 2002/06/07 21:16:51 msell
* Fysiikkaenginen alkua
*
* Revision 1.1 2002/06/05 23:55:46 msell
* Pallo
*
*
*
* $Date: 2002/07/19 20:33:29 $
*
*/
#ifndef __SPHERE_H_INCLUDED__ #ifndef __SPHERE_H_INCLUDED__
#define __SPHERE_H_INCLUDED__ #define __SPHERE_H_INCLUDED__
@ -57,15 +12,15 @@ class SphereAppearance;
class Sphere : public Object{ class Sphere : public Object{
private: private:
float r; float r;
SphereAppearance *appearance; SphereAppearance *appearance;
SphereShape *geometry; SphereShape *geometry;
public: public:
Sphere(void); Sphere(void);
void setRadius(float r); void setRadius(float r);
void setColor(float red, float green, float blue); void setColor(float red, float green, float blue);
}; };
@ -74,13 +29,13 @@ public:
class SphereAppearance : public Appearance{ class SphereAppearance : public Appearance{
private: private:
float r; float r;
public: public:
SphereAppearance(void); SphereAppearance(void);
void setRadius(float r); void setRadius(float r);
void draw(void); void draw(void);
}; };
@ -89,23 +44,23 @@ public:
class SphereShape : public Shape{ class SphereShape : public Shape{
private: private:
float r; float r;
public: public:
SphereShape(Object *sphere); SphereShape(Object *sphere);
void setRadius(float r); void setRadius(float r);
float getRadius(void); float getRadius(void);
float calculateMomentOfInertia(float *rotationvector); float calculateMomentOfInertia(float *rotationvector);
bool checkCollision(Object *target); bool checkCollision(Object *target);
bool checkCollisionPeer(SphereShape *target); bool checkCollisionPeer(SphereShape *target);
bool checkCollisionPeer(MeshShape *target); bool checkCollisionPeer(MeshShape *target);
friend class Sphere; friend class Sphere;
friend class MeshShape; friend class MeshShape;
}; };
#endif #endif

View file

@ -1,33 +1,3 @@
/*
* $Id: texture.cpp,v 1.7 2002/07/17 16:40:33 msell Exp $
*
*
* $Log: texture.cpp,v $
* Revision 1.7 2002/07/17 16:40:33 msell
* Resoluution vaihto
*
* Revision 1.6 2002/06/27 21:43:50 jkaarlas
* lisätty setId-funktio
*
* Revision 1.5 2002/06/20 15:27:48 jkaarlas
* bindtexture siirretty oikeaan paikkaan
*
* Revision 1.4 2002/06/20 00:21:01 jkaarlas
* materiaali- ja tekstuurihommia edistetty
*
* Revision 1.3 2002/06/19 22:45:29 jkaarlas
* nyt nämä menee järkevästi
*
* Revision 1.2 2002/06/15 22:04:01 jkaarlas
* tähänkin jotain sisältöä
*
*
*
*
* $Date: 2002/07/17 16:40:33 $
*
*/
#include "texture.h" #include "texture.h"
#include "graphics.h" #include "graphics.h"
@ -56,9 +26,9 @@ Texture::Texture(int id){
} }
bool Texture::loadImage(char* path){ bool Texture::loadImage(char* path){
format = GL_RGB; format = GL_RGB;
texture = IMG_Load(path); texture = IMG_Load(path);
//texture = SDL_DisplayFormatAlpha(texture); //texture = SDL_DisplayFormatAlpha(texture);
@ -69,18 +39,18 @@ bool Texture::loadImage(char* path){
} }
bool Texture::loadImage(char* path, float *trans){ bool Texture::loadImage(char* path, float *trans){
format = GL_RGBA; format = GL_RGBA;
texture = IMG_Load(path); texture = IMG_Load(path);
Uint32 colorKey = SDL_MapRGB(texture->format, Uint32 colorKey = SDL_MapRGB(texture->format,
(Uint8)(trans[0] * 255), (Uint8)(trans[0] * 255),
(Uint8)(trans[1] * 255), (Uint8)(trans[1] * 255),
(Uint8)(trans[2] * 255)); (Uint8)(trans[2] * 255));
//SDL_SetAlpha(texture, 0, SDL_ALPHA_OPAQUE); //SDL_SetAlpha(texture, 0, SDL_ALPHA_OPAQUE);
SDL_SetColorKey(texture, SDL_SRCCOLORKEY, colorKey); SDL_SetColorKey(texture, SDL_SRCCOLORKEY, colorKey);
//SDL_Surface* alphaSurface = SDL_DisplayFormatAlpha(texture); //SDL_Surface* alphaSurface = SDL_DisplayFormatAlpha(texture);
texture = SDL_DisplayFormatAlpha(texture); texture = SDL_DisplayFormatAlpha(texture);
@ -90,8 +60,8 @@ bool Texture::loadImage(char* path, float *trans){
} }
void Texture::reload(void){ void Texture::reload(void){
this->textureId = DRUID.loadTexture(texture, -1, format); this->textureId = DRUID.loadTexture(texture, -1, format);
this->enable(); this->enable();
} }
void Texture::disable(void){ void Texture::disable(void){

View file

@ -1,32 +1,3 @@
/*
* $Id: texture.h,v 1.8 2002/07/19 20:33:29 msell Exp $
*
*
* $Log: texture.h,v $
* Revision 1.8 2002/07/19 20:33:29 msell
* #pragma once -> #ifndef
*
* Revision 1.7 2002/07/17 16:40:33 msell
* Resoluution vaihto
*
* Revision 1.6 2002/06/27 21:43:50 jkaarlas
* lisätty setId-funktio
*
* Revision 1.5 2002/06/20 00:21:01 jkaarlas
* materiaali- ja tekstuurihommia edistetty
*
* Revision 1.4 2002/06/19 22:45:29 jkaarlas
* nyt nämä menee järkevästi
*
* Revision 1.3 2002/06/15 22:52:32 jkaarlas
* tekstuurimanageri ja työkalupakki
*
*
*
* $Date: 2002/07/19 20:33:29 $
*
*/
#ifndef __TEXTURE_H_INCLUDED__ #ifndef __TEXTURE_H_INCLUDED__
#define __TEXTURE_H_INCLUDED__ #define __TEXTURE_H_INCLUDED__
@ -48,8 +19,8 @@ public:
int getId(void); int getId(void);
void setId(int id); void setId(int id);
bool isValidId(void); bool isValidId(void);
void reload(void); void reload(void);
//int* getOGLTexture(void); //int* getOGLTexture(void);
//int* getModifiableOGLTexture(void); //int* getModifiableOGLTexture(void);
@ -59,8 +30,8 @@ private:
//int* modTexture; //int* modTexture;
bool enabled; bool enabled;
SDL_Surface *texture; SDL_Surface *texture;
int format; int format;
}; };
#endif #endif

View file

@ -1,59 +1,39 @@
/*
* $Id: utils.cpp,v 1.3 2002/07/14 21:40:43 msell Exp $
*
*
* $Log: utils.cpp,v $
* Revision 1.3 2002/07/14 21:40:43 msell
* Conflictit pois, liikkumiset (hyppy, kävely, lyönti), uusi areena
*
* Revision 1.2 2002/06/14 00:05:05 msell
* Törmäyssimulaatio kunnossa toivon mukaan
*
* Revision 1.1 2002/06/02 16:57:37 msell
* Objektirakenteen pohja
*
*
*
* $Date: 2002/07/14 21:40:43 $
*
*/
#include <stdlib.h> #include <stdlib.h>
void swapInt(int *a, int *b){ void swapInt(int *a, int *b){
int temp = *a; int temp = *a;
*a = *b; *a = *b;
*b = temp; *b = temp;
} }
void swapFloat(float *a, float *b){ void swapFloat(float *a, float *b){
float temp = *a; float temp = *a;
*a = *b; *a = *b;
*b = temp; *b = temp;
} }
int random(int x){ int random(int x){
return rand() * x / RAND_MAX; return rand() * x / RAND_MAX;
} }
float randomf(float x){ float randomf(float x){
return rand() * x / RAND_MAX; return rand() * x / RAND_MAX;
} }
int smod(int val, int mod){ int smod(int val, int mod){
if (val>=0) return val%mod; if (val>=0) return val%mod;
int temp=-val/mod+1; int temp=-val/mod+1;
return (val+temp*mod)%mod; return (val+temp*mod)%mod;
} }
double sdes(double val){ double sdes(double val){
if (val>=0) return val-(int)(val); if (val>=0) return val-(int)(val);
return val-(int)(val)+1; return val-(int)(val)+1;
} }
double sfmod(double val, double mod){ double sfmod(double val, double mod){
val-=(int)(val/mod)*mod; val-=(int)(val/mod)*mod;
if (val<0) val+=mod; if (val<0) val+=mod;
return val; return val;
} }

View file

@ -1,32 +1,3 @@
/*
* $Id: utils.h,v 1.6 2002/07/19 20:33:29 msell Exp $
*
*
* $Log: utils.h,v $
* Revision 1.6 2002/07/19 20:33:29 msell
* #pragma once -> #ifndef
*
* Revision 1.5 2002/07/14 21:40:43 msell
* Conflictit pois, liikkumiset (hyppy, kävely, lyönti), uusi areena
*
* Revision 1.4 2002/06/14 00:05:05 msell
* Törmäyssimulaatio kunnossa toivon mukaan
*
* Revision 1.3 2002/06/04 16:28:32 msell
* #pragma once
*
* Revision 1.2 2002/06/03 23:06:38 msell
* no message
*
* Revision 1.1 2002/06/02 16:57:37 msell
* Objektirakenteen pohja
*
*
*
* $Date: 2002/07/19 20:33:29 $
*
*/
#ifndef __UTILS_H_INCLUDED__ #ifndef __UTILS_H_INCLUDED__
#define __UTILS_H_INCLUDED__ #define __UTILS_H_INCLUDED__

View file

@ -1,37 +1,3 @@
/*
* $Id: vector.cpp,v 1.7 2002/07/14 21:40:43 msell Exp $
*
*
* $Log: vector.cpp,v $
* Revision 1.7 2002/07/14 21:40:43 msell
* Conflictit pois, liikkumiset (hyppy, kävely, lyönti), uusi areena
*
* Revision 1.6 2002/07/04 21:05:41 msell
* Se toimii!! =)
* Törmäystarkistukset siis
*
* Revision 1.5 2002/06/27 00:08:04 msell
* Kimmotukset palloille myös pyöritettyihin mesheihin
*
* Revision 1.4 2002/06/23 20:12:19 msell
* Parempi törmäystarkistus palloista mesheihin
*
* Revision 1.3 2002/06/17 12:42:46 msell
* Hieman parempi törmäysmallinnus taas
*
* Revision 1.2 2002/06/11 23:23:03 msell
* Törmäystarkistusta
*
* Revision 1.1 2002/05/16 18:42:07 msell
* Vektorifunctioita ja kamera
*
*
*
* $Date: 2002/07/14 21:40:43 $
*
*/
#include <math.h> #include <math.h>
#include "main.h" #include "main.h"
@ -39,270 +5,270 @@
#include "utils.h" #include "utils.h"
void vectorSet(float *target, float x, float y, float z){ void vectorSet(float *target, float x, float y, float z){
target[0] = x; target[0] = x;
target[1] = y; target[1] = y;
target[2] = z; target[2] = z;
} }
void vectorCopy(float *target, float *source){ void vectorCopy(float *target, float *source){
target[0] = source[0]; target[0] = source[0];
target[1] = source[1]; target[1] = source[1];
target[2] = source[2]; target[2] = source[2];
} }
void vectorAdd(float *target, float *source1, float *source2){ void vectorAdd(float *target, float *source1, float *source2){
target[0] = source1[0] + source2[0]; target[0] = source1[0] + source2[0];
target[1] = source1[1] + source2[1]; target[1] = source1[1] + source2[1];
target[2] = source1[2] + source2[2]; target[2] = source1[2] + source2[2];
} }
void vectorAdd(float *target, float *source){ void vectorAdd(float *target, float *source){
target[0] += source[0]; target[0] += source[0];
target[1] += source[1]; target[1] += source[1];
target[2] += source[2]; target[2] += source[2];
} }
void vectorSub(float *target, float *source1, float *source2){ void vectorSub(float *target, float *source1, float *source2){
target[0] = source1[0] - source2[0]; target[0] = source1[0] - source2[0];
target[1] = source1[1] - source2[1]; target[1] = source1[1] - source2[1];
target[2] = source1[2] - source2[2]; target[2] = source1[2] - source2[2];
} }
void vectorSub(float *target, float *source){ void vectorSub(float *target, float *source){
target[0] -= source[0]; target[0] -= source[0];
target[1] -= source[1]; target[1] -= source[1];
target[2] -= source[2]; target[2] -= source[2];
} }
void vectorNegative(float *target, float *source){ void vectorNegative(float *target, float *source){
target[0] = -source[0]; target[0] = -source[0];
target[1] = -source[1]; target[1] = -source[1];
target[2] = -source[2]; target[2] = -source[2];
} }
void vectorNegative(float *target){ void vectorNegative(float *target){
target[0] = -target[0]; target[0] = -target[0];
target[1] = -target[1]; target[1] = -target[1];
target[2] = -target[2]; target[2] = -target[2];
} }
void vectorScale(float *target, float *source, float scale){ void vectorScale(float *target, float *source, float scale){
target[0] = source[0] * scale; target[0] = source[0] * scale;
target[1] = source[1] * scale; target[1] = source[1] * scale;
target[2] = source[2] * scale; target[2] = source[2] * scale;
} }
void vectorScale(float *target, float scale){ void vectorScale(float *target, float scale){
target[0] *= scale; target[0] *= scale;
target[1] *= scale; target[1] *= scale;
target[2] *= scale; target[2] *= scale;
} }
float vectorDot(float *source1, float *source2){ float vectorDot(float *source1, float *source2){
return source1[0]*source2[0] + source1[1]*source2[1] + source1[2]*source2[2]; return source1[0]*source2[0] + source1[1]*source2[1] + source1[2]*source2[2];
} }
float vectorNormalizedDot(float *source1, float *source2){ float vectorNormalizedDot(float *source1, float *source2){
return vectorDot(source1, source2) / (vectorLength(source1) * vectorLength(source2)); return vectorDot(source1, source2) / (vectorLength(source1) * vectorLength(source2));
} }
float vectorLength(float *source){ float vectorLength(float *source){
return sqrtf(vectorDot(source, source)); return sqrtf(vectorDot(source, source));
} }
void vectorCross(float *target, float *source1, float *source2){ void vectorCross(float *target, float *source1, float *source2){
target[0] = source1[1]*source2[2] - source1[2]*source2[1]; target[0] = source1[1]*source2[2] - source1[2]*source2[1];
target[1] = source1[2]*source2[0] - source1[0]*source2[2]; target[1] = source1[2]*source2[0] - source1[0]*source2[2];
target[2] = source1[0]*source2[1] - source1[1]*source2[0]; target[2] = source1[0]*source2[1] - source1[1]*source2[0];
} }
void vectorNormalize(float *target, float *source){ void vectorNormalize(float *target, float *source){
vectorScale(target, source, 1.0/vectorLength(source)); vectorScale(target, source, 1.0/vectorLength(source));
} }
void vectorNormalize(float *target){ void vectorNormalize(float *target){
vectorScale(target, 1.0/vectorLength(target)); vectorScale(target, 1.0/vectorLength(target));
} }
void vectorReflect(float *target, float *source, float *normal){ void vectorReflect(float *target, float *source, float *normal){
vectorCopy(target, normal); vectorCopy(target, normal);
vectorScale(target, -vectorDot(source, normal)*2); vectorScale(target, -vectorDot(source, normal)*2);
vectorAdd(target, source); vectorAdd(target, source);
} }
void vectorProject(float *target, float *source1, float *source2){ void vectorProject(float *target, float *source1, float *source2){
vectorScale(target, source2, vectorDot(source1, source2) / vectorDot(source2, source2)); vectorScale(target, source2, vectorDot(source1, source2) / vectorDot(source2, source2));
} }
bool vectorIsZero(float *vector){ bool vectorIsZero(float *vector){
if (vector[0] == 0 && vector[1] == 0 && vector[2] == 0) return true; if (vector[0] == 0 && vector[1] == 0 && vector[2] == 0) return true;
//if (vectorDot(vector, vector) < 0.00001) return true; //if (vectorDot(vector, vector) < 0.00001) return true;
else return false; else return false;
} }
void vectorSaturate(float *target, float *source, float min, float max){ void vectorSaturate(float *target, float *source, float min, float max){
float len = vectorLength(source); float len = vectorLength(source);
if (len < min){ if (len < min){
len = min; len = min;
} else if (len > max){ } else if (len > max){
len = max; len = max;
} else{ } else{
if (target != source) vectorCopy(target, source); if (target != source) vectorCopy(target, source);
return; return;
} }
vectorNormalize(target, source); vectorNormalize(target, source);
vectorScale(target, len); vectorScale(target, len);
} }
void vectorSaturate(float *vector, float min, float max){ void vectorSaturate(float *vector, float min, float max){
vectorSaturate(vector, vector, min, max); vectorSaturate(vector, vector, min, max);
} }
void vectorMatrixMultiply(float *target, float *source, float *matrix){ void vectorMatrixMultiply(float *target, float *source, float *matrix){
float source2[3]; float source2[3];
if (source == target){ if (source == target){
vectorCopy(source2, source); vectorCopy(source2, source);
source = source2; source = source2;
} }
int x; int x;
for (x = 0; x < 3; x++){ for (x = 0; x < 3; x++){
target[x] = source[0]*matrix[0+x] + target[x] = source[0]*matrix[0+x] +
source[1]*matrix[3+x] + source[1]*matrix[3+x] +
source[2]*matrix[6+x]; source[2]*matrix[6+x];
} }
} }
void matrixSet(float *matrix, void matrixSet(float *matrix,
float x1, float y1, float z1, float x1, float y1, float z1,
float x2, float y2, float z2, float x2, float y2, float z2,
float x3, float y3, float z3){ float x3, float y3, float z3){
matrix[0] = x1; matrix[0] = x1;
matrix[1] = y1; matrix[1] = y1;
matrix[2] = z1; matrix[2] = z1;
matrix[3] = x2; matrix[3] = x2;
matrix[4] = y2; matrix[4] = y2;
matrix[5] = z2; matrix[5] = z2;
matrix[6] = x3; matrix[6] = x3;
matrix[7] = y3; matrix[7] = y3;
matrix[8] = z3; matrix[8] = z3;
} }
void matrixSet(float *matrix, float *r1, float *r2, float *r3){ void matrixSet(float *matrix, float *r1, float *r2, float *r3){
vectorCopy(&matrix[0], r1); vectorCopy(&matrix[0], r1);
vectorCopy(&matrix[3], r2); vectorCopy(&matrix[3], r2);
vectorCopy(&matrix[6], r3); vectorCopy(&matrix[6], r3);
} }
void matrixCopy(float *target, float *source){ void matrixCopy(float *target, float *source){
target[0] = source[0]; target[0] = source[0];
target[1] = source[1]; target[1] = source[1];
target[2] = source[2]; target[2] = source[2];
target[3] = source[3]; target[3] = source[3];
target[4] = source[4]; target[4] = source[4];
target[5] = source[5]; target[5] = source[5];
target[6] = source[6]; target[6] = source[6];
target[7] = source[7]; target[7] = source[7];
target[8] = source[8]; target[8] = source[8];
} }
void matrixIdentity(float *matrix){ void matrixIdentity(float *matrix){
matrixSet(matrix, 1, 0, 0, 0, 1, 0, 0, 0, 1); matrixSet(matrix, 1, 0, 0, 0, 1, 0, 0, 0, 1);
} }
void matrixAdd(float *target, float *source1, float *source2){ void matrixAdd(float *target, float *source1, float *source2){
target[0] = source1[0] + source2[0]; target[0] = source1[0] + source2[0];
target[1] = source1[1] + source2[1]; target[1] = source1[1] + source2[1];
target[2] = source1[2] + source2[2]; target[2] = source1[2] + source2[2];
target[3] = source1[3] + source2[3]; target[3] = source1[3] + source2[3];
target[4] = source1[4] + source2[4]; target[4] = source1[4] + source2[4];
target[5] = source1[5] + source2[5]; target[5] = source1[5] + source2[5];
target[6] = source1[6] + source2[6]; target[6] = source1[6] + source2[6];
target[7] = source1[7] + source2[7]; target[7] = source1[7] + source2[7];
target[8] = source1[8] + source2[8]; target[8] = source1[8] + source2[8];
} }
void matrixAdd(float *target, float *source){ void matrixAdd(float *target, float *source){
target[0] += source[0]; target[0] += source[0];
target[1] += source[1]; target[1] += source[1];
target[2] += source[2]; target[2] += source[2];
target[3] += source[3]; target[3] += source[3];
target[4] += source[4]; target[4] += source[4];
target[5] += source[5]; target[5] += source[5];
target[6] += source[6]; target[6] += source[6];
target[7] += source[7]; target[7] += source[7];
target[8] += source[8]; target[8] += source[8];
} }
void matrixMultiply(float *target, float *source1, float *source2){ void matrixMultiply(float *target, float *source1, float *source2){
float target2[9]; float target2[9];
float *oldtarget = target; float *oldtarget = target;
bool copy = false; bool copy = false;
if (source1 == target || source2 == target){ if (source1 == target || source2 == target){
copy = true; copy = true;
target = target2; target = target2;
} }
int x, y; int x, y;
for (y = 0; y < 3; y++){ for (y = 0; y < 3; y++){
for (x = 0; x < 3; x++){ for (x = 0; x < 3; x++){
*target = source1[y*3+0]*source2[x] + *target = source1[y*3+0]*source2[x] +
source1[y*3+1]*source2[3+x] + source1[y*3+1]*source2[3+x] +
source1[y*3+2]*source2[6+x]; source1[y*3+2]*source2[6+x];
target++; target++;
} }
} }
if (copy){ if (copy){
matrixCopy(oldtarget, target2); matrixCopy(oldtarget, target2);
} }
} }
/*void matrixMultiply(float *target, float *source){ /*void matrixMultiply(float *target, float *source){
matrixMultiply(target, source, source); matrixMultiply(target, source, source);
}*/ }*/
/*void matrixRotate(float *matrix, float *vector){ /*void matrixRotate(float *matrix, float *vector){
float rotmat[9]; float rotmat[9];
createRotationMatrix(rotmat, vector); createRotationMatrix(rotmat, vector);
matrixMultiply(matrix, matrix, rotmat); matrixMultiply(matrix, matrix, rotmat);
}*/ }*/
void matrixCreateRotation(float *matrix, float *vector){ void matrixCreateRotation(float *matrix, float *vector){
float angle = vectorLength(vector); float angle = vectorLength(vector);
float n[3]; float n[3];
vectorNormalize(n, vector); vectorNormalize(n, vector);
float c = cos(angle); float c = cos(angle);
float s = sin(angle); float s = sin(angle);
float t = 1 - c; float t = 1 - c;
float x = n[0]; float x = n[0];
float y = n[1]; float y = n[1];
float z = n[2]; float z = n[2];
matrixSet(matrix, matrixSet(matrix,
t*x*x + c, t*y*x + s*z, t*z*x - s*y, t*x*x + c, t*y*x + s*z, t*z*x - s*y,
t*x*y - s*z, t*y*y + c, t*z*y + s*x, t*x*y - s*z, t*y*y + c, t*z*y + s*x,
t*x*z + s*y, t*y*z - s*x, t*z*z + c); t*x*z + s*y, t*y*z - s*x, t*z*z + c);
} }
void matrixTranspose(float *target, float *source){ void matrixTranspose(float *target, float *source){
target[0] = source[0]; target[1] = source[3]; target[2] = source[6]; target[0] = source[0]; target[1] = source[3]; target[2] = source[6];
target[3] = source[1]; target[4] = source[4]; target[5] = source[7]; target[3] = source[1]; target[4] = source[4]; target[5] = source[7];
target[6] = source[2]; target[7] = source[5]; target[8] = source[8]; target[6] = source[2]; target[7] = source[5]; target[8] = source[8];
} }
/*void rotatePointAroundVector(float *target, float *point, float *vector){ /*void rotatePointAroundVector(float *target, float *point, float *vector){
float angle = vectorLength(vector); float angle = vectorLength(vector);
float n[3]; float n[3];
vectorNormalize(n, vector); vectorNormalize(n, vector);
float c = cos(angle); float c = cos(angle);
float s = sin(angle); float s = sin(angle);
float t = 1 - c; float t = 1 - c;
//r' = r*c + n*(n . r)*t + (r x n)*s //r' = r*c + n*(n . r)*t + (r x n)*s
}*/ }*/

View file

@ -1,38 +1,3 @@
/*
* $Id: vector.h,v 1.8 2002/07/19 20:33:29 msell Exp $
*
*
* $Log: vector.h,v $
* Revision 1.8 2002/07/19 20:33:29 msell
* #pragma once -> #ifndef
*
* Revision 1.7 2002/07/14 21:40:43 msell
* Conflictit pois, liikkumiset (hyppy, kävely, lyönti), uusi areena
*
* Revision 1.6 2002/06/27 00:08:04 msell
* Kimmotukset palloille myös pyöritettyihin mesheihin
*
* Revision 1.5 2002/06/23 20:12:19 msell
* Parempi törmäystarkistus palloista mesheihin
*
* Revision 1.4 2002/06/17 12:42:46 msell
* Hieman parempi törmäysmallinnus taas
*
* Revision 1.3 2002/06/11 23:23:03 msell
* Törmäystarkistusta
*
* Revision 1.2 2002/06/04 16:28:32 msell
* #pragma once
*
* Revision 1.1 2002/05/16 18:42:07 msell
* Vektorifunctioita ja kamera
*
*
*
* $Date: 2002/07/19 20:33:29 $
*
*/
#ifndef __VECTOR_H_INCLUDED__ #ifndef __VECTOR_H_INCLUDED__
#define __VECTOR_H_INCLUDED__ #define __VECTOR_H_INCLUDED__
@ -67,9 +32,9 @@ void vectorMatrixMultiply(float *target, float *source, float *matrix);
void matrixSet(float *matrix, void matrixSet(float *matrix,
float x1, float y1, float z1, float x1, float y1, float z1,
float x2, float y2, float z2, float x2, float y2, float z2,
float x3, float y3, float z3); float x3, float y3, float z3);
void matrixSet(float *matrix, float *r1, float *r2, float *r3); void matrixSet(float *matrix, float *r1, float *r2, float *r3);
void matrixCopy(float *target, float *source); void matrixCopy(float *target, float *source);
void matrixIdentity(float *matrix); void matrixIdentity(float *matrix);

View file

@ -1,42 +1,3 @@
/*
* $Id: world.cpp,v 1.9 2002/07/18 23:05:31 msell Exp $
*
*
* $Log: world.cpp,v $
* Revision 1.9 2002/07/18 23:05:31 msell
* Partikkelit ja kakkospelaajan liike
*
* Revision 1.8 2002/07/15 20:32:36 msell
* Uudet valot ja ulkoasun parantelua
*
* Revision 1.7 2002/07/15 15:22:08 msell
* Parantelua
*
* Revision 1.6 2002/07/14 21:40:43 msell
* Conflictit pois, liikkumiset (hyppy, kävely, lyönti), uusi areena
*
* Revision 1.5 2002/07/10 17:13:44 msell
* Törmäystarkastelun parantelua
*
* Revision 1.4 2002/07/08 18:28:47 msell
* Törmäystä ja ukkoja
*
* Revision 1.3 2002/07/07 23:05:22 msell
* Osien liimaaminen toisiinsa (kesken)
*
* Revision 1.2 2002/07/07 15:29:07 msell
* Törmäyksien parantelua
*
* Revision 1.1 2002/07/04 21:05:41 msell
* Se toimii!! =)
* Törmäystarkistukset siis
*
*
*
* $Date: 2002/07/18 23:05:31 $
*
*/
#include "world.h" #include "world.h"
#include "object.h" #include "object.h"
@ -44,207 +5,207 @@
#include "vector.h" #include "vector.h"
World::World(void){ World::World(void){
childlist = NULL; childlist = NULL;
linklist = NULL; linklist = NULL;
maxparticles = 500; maxparticles = 500;
particles = new Particle *[maxparticles]; particles = new Particle *[maxparticles];
particlecount = 0; particlecount = 0;
} }
void World::prepare(void){ void World::prepare(void){
objectlist *node = childlist; objectlist *node = childlist;
childcount = 0; childcount = 0;
while (node != NULL){ while (node != NULL){
Object *child = node->object; Object *child = node->object;
child->prepare(); child->prepare();
node = node->next; node = node->next;
childcount++; childcount++;
} }
childs = new Object *[childcount]; childs = new Object *[childcount];
node = childlist; node = childlist;
int i = 0; int i = 0;
while (node != NULL){ while (node != NULL){
Object *child = node->object; Object *child = node->object;
childs[i] = child; childs[i] = child;
node = node->next; node = node->next;
i++; i++;
} }
contacts = new Contact[MAXCONTACTS];//childcount*childcount]; contacts = new Contact[MAXCONTACTS];//childcount*childcount];
} }
#define GRAVITY 9.81 #define GRAVITY 9.81
//#define GRAVITY 15 //#define GRAVITY 15
void World::move(void){ void World::move(void){
int i, j; int i, j;
//Gravity //Gravity
float gravity[3]; float gravity[3];
vectorSet(gravity, 0, 0, 0); vectorSet(gravity, 0, 0, 0);
for (i = 0; i < childcount; i++){ for (i = 0; i < childcount; i++){
Object *object = childs[i]; Object *object = childs[i];
if (object->gravity){ if (object->gravity){
gravity[1] = -object->getMass()*GRAVITY; gravity[1] = -object->getMass()*GRAVITY;
object->addExternalForce(gravity); object->addExternalForce(gravity);
} }
} }
/*for (i = 0; i < particlecount; i++){ /*for (i = 0; i < particlecount; i++){
Particle *object = particles[i]; Particle *object = particles[i];
if (object->gravity){ if (object->gravity){
gravity[1] = -object->getMass()*GRAVITY; gravity[1] = -object->getMass()*GRAVITY;
object->addExternalForce(gravity); object->addExternalForce(gravity);
} }
}*/ }*/
//Collisions //Collisions
contactcount = 0; contactcount = 0;
for (i = 0; i < childcount; i++){ for (i = 0; i < childcount; i++){
Object *object1 = childs[i]; Object *object1 = childs[i];
int group1 = object1->getCollisionGroup(); int group1 = object1->getCollisionGroup();
for (j = i+1; j < childcount; j++){ for (j = i+1; j < childcount; j++){
Object *object2 = childs[j]; Object *object2 = childs[j];
int group2 = object2->getCollisionGroup(); int group2 = object2->getCollisionGroup();
if (isCollisionLink(group1, group2)){ if (isCollisionLink(group1, group2)){
object2->geometry->checkCollision(object1); object2->geometry->checkCollision(object1);
} }
} }
} }
/*for (i = 0; i < particlecount; i++){ /*for (i = 0; i < particlecount; i++){
Particle *object1 = particles[i]; Particle *object1 = particles[i];
int group1 = object1->getCollisionGroup(); int group1 = object1->getCollisionGroup();
for (j = 0; j < childcount; j++){ for (j = 0; j < childcount; j++){
Object *object2 = childs[j]; Object *object2 = childs[j];
int group2 = object2->getCollisionGroup(); int group2 = object2->getCollisionGroup();
if (isCollisionLink(group1, group2)){ if (isCollisionLink(group1, group2)){
object2->geometry->checkCollision(object1); object2->geometry->checkCollision(object1);
} }
} }
}*/ }*/
//printf("Contacts: %i\n", contactcount); //printf("Contacts: %i\n", contactcount);
bool contactresponse;
j = 0;
do{
contactresponse = false;
//Links between objects
objectlinklist *node = linklist;
while (node != NULL){
ObjectLink *link = node->link;
if (handleLink(link)) contactresponse = true;
node = node->next;
}
//Collision contact
for (i = 0; i < contactcount; i++){
Contact *contact = &contacts[i];
if (handleCollision(contact)) contactresponse = true;
}
j++;
} while (contactresponse && j < 10);
/*j = 0;
do{
contactresponse = false;
//Collision contact
for (i = 0; i < contactcount; i++){
Contact *contact = &contacts[i];
if (handleCollision(contact)) contactresponse = true;
}
j++;
} while (contactresponse && j < 10);*/
/*j = 0;
do{
contactresponse = false;
//Links between objects
objectlinklist *node = linklist;
while (node != NULL){
ObjectLink *link = node->link;
if (handleLink(link)) contactresponse = true;
node = node->next;
}
j++;
} while (contactresponse && j < 3);*/
for (i = 0; i < childcount; i++){ bool contactresponse;
childs[i]->move();
} j = 0;
for (i = 0; i < particlecount; i++){ do{
particles[i]->move(); contactresponse = false;
}
//Links between objects
objectlinklist *node = linklist;
while (node != NULL){
ObjectLink *link = node->link;
if (handleLink(link)) contactresponse = true;
node = node->next;
}
//Collision contact
for (i = 0; i < contactcount; i++){
Contact *contact = &contacts[i];
if (handleCollision(contact)) contactresponse = true;
}
j++;
} while (contactresponse && j < 10);
/*j = 0;
do{
contactresponse = false;
//Collision contact
for (i = 0; i < contactcount; i++){
Contact *contact = &contacts[i];
if (handleCollision(contact)) contactresponse = true;
}
j++;
} while (contactresponse && j < 10);*/
/*j = 0;
do{
contactresponse = false;
//Links between objects
objectlinklist *node = linklist;
while (node != NULL){
ObjectLink *link = node->link;
if (handleLink(link)) contactresponse = true;
node = node->next;
}
j++;
} while (contactresponse && j < 3);*/
for (i = 0; i < childcount; i++){
childs[i]->move();
}
for (i = 0; i < particlecount; i++){
particles[i]->move();
}
} }
void World::draw(void){ void World::draw(void){
int i; int i;
for (i = 0; i < childcount; i++) childs[i]->draw(); for (i = 0; i < childcount; i++) childs[i]->draw();
for (i = 0; i < particlecount; i++) particles[i]->draw(); for (i = 0; i < particlecount; i++) particles[i]->draw();
} }
void World::addChild(Object *child){ void World::addChild(Object *child){
objectlist *node = new objectlist; objectlist *node = new objectlist;
node->object = child; node->object = child;
node->next = childlist; node->next = childlist;
childlist = node; childlist = node;
} }
void World::addParticle(Particle *particle){ void World::addParticle(Particle *particle){
if (particlecount < maxparticles){ if (particlecount < maxparticles){
particles[particlecount++] = particle; particles[particlecount++] = particle;
} }
} }
void World::removeParticle(Particle *particle){ void World::removeParticle(Particle *particle){
int i; int i;
for (i = 0; i < particlecount; i++){ for (i = 0; i < particlecount; i++){
if (particles[i] == particle){ if (particles[i] == particle){
particles[i] = particles[particlecount-1]; particles[i] = particles[particlecount-1];
particlecount--; particlecount--;
break; break;
} }
} }
} }
ObjectLink *World::addLink(Object *object1, Object *object2, float *point){ ObjectLink *World::addLink(Object *object1, Object *object2, float *point){
ObjectLink *link = new ObjectLink(); ObjectLink *link = new ObjectLink();
link->object1 = object1; link->object1 = object1;
link->object2 = object2; link->object2 = object2;
if (point != NULL){ if (point != NULL){
object1->unTransformPoint(link->point1, point); object1->unTransformPoint(link->point1, point);
object2->unTransformPoint(link->point2, point); object2->unTransformPoint(link->point2, point);
link->enabled = true; link->enabled = true;
} else{ } else{
link->enabled = false; link->enabled = false;
} }
objectlinklist *node = new objectlinklist; objectlinklist *node = new objectlinklist;
node->link = link; node->link = link;
node->next = linklist; node->next = linklist;
linklist = node; linklist = node;
return link; return link;
} }
void World::renewLink(ObjectLink *link, float *point){ void World::renewLink(ObjectLink *link, float *point){
link->object1->unTransformPoint(link->point1, point); link->object1->unTransformPoint(link->point1, point);
link->object2->unTransformPoint(link->point2, point); link->object2->unTransformPoint(link->point2, point);
link->enabled = true; link->enabled = true;
} }

View file

@ -1,33 +1,3 @@
/*
* $Id: world.h,v 1.6 2002/07/19 20:33:29 msell Exp $
*
*
* $Log: world.h,v $
* Revision 1.6 2002/07/19 20:33:29 msell
* #pragma once -> #ifndef
*
* Revision 1.5 2002/07/18 23:05:31 msell
* Partikkelit ja kakkospelaajan liike
*
* Revision 1.4 2002/07/15 15:22:08 msell
* Parantelua
*
* Revision 1.3 2002/07/10 17:13:44 msell
* Törmäystarkastelun parantelua
*
* Revision 1.2 2002/07/07 23:05:22 msell
* Osien liimaaminen toisiinsa (kesken)
*
* Revision 1.1 2002/07/04 21:05:41 msell
* Se toimii!! =)
* Törmäystarkistukset siis
*
*
*
* $Date: 2002/07/19 20:33:29 $
*
*/
#ifndef __WORLD_H_INCLUDED__ #ifndef __WORLD_H_INCLUDED__
#define __WORLD_H_INCLUDED__ #define __WORLD_H_INCLUDED__
@ -39,47 +9,47 @@ class ObjectLink;
class ObjectLink{ class ObjectLink{
public: public:
Object *object1, *object2; Object *object1, *object2;
float point1[3], point2[3]; float point1[3], point2[3];
bool enabled; bool enabled;
}; };
struct objectlinklist{ struct objectlinklist{
ObjectLink *link; ObjectLink *link;
objectlinklist *next; objectlinklist *next;
}; };
#define MAXCONTACTS 100 #define MAXCONTACTS 100
class World{ class World{
private: private:
objectlist *childlist; objectlist *childlist;
int childcount; int childcount;
Object **childs; Object **childs;
int particlecount; int particlecount;
int maxparticles; int maxparticles;
Particle **particles; Particle **particles;
objectlinklist *linklist; objectlinklist *linklist;
public: public:
World(void); World(void);
void prepare(void); void prepare(void);
void move(void); void move(void);
void draw(void); void draw(void);
void addChild(Object *child); void addChild(Object *child);
void addParticle(Particle *particle); void addParticle(Particle *particle);
void removeParticle(Particle *particle); void removeParticle(Particle *particle);
//Point is world-relative //Point is world-relative
ObjectLink *addLink(Object *object1, Object *object2, float *point); ObjectLink *addLink(Object *object1, Object *object2, float *point);
void renewLink(ObjectLink *link, float *point); void renewLink(ObjectLink *link, float *point);
}; };
#endif #endif