diff --git a/include/defines.h b/include/defines.h index ce09da1..50a941a 100644 --- a/include/defines.h +++ b/include/defines.h @@ -16,11 +16,12 @@ // Sound // Sound engine #define SND_DIST_MIN 200 -#define SND_DIST_MAX 1200 +#define SND_DIST_MAX 800 #define SND_ATTENUATION 6144 #define SND_MAX_VOL 16383 -#define SND_RANGE (SND_DIST_MAX-SND_DIST_MIN) -#define SND_NMALIZED (SND_RANGE*SND_ATTENUATION/SND_MAX_VOL) +#define SND_RANGE (SND_DIST_MAX - SND_DIST_MIN) +#define SND_NMALIZED (SND_RANGE * SND_ATTENUATION / SND_MAX_VOL) +#define SND_DZ 32 // SPU channels #define SPU_00CH (0x1L<< 0) #define SPU_01CH (0x1L<< 1) diff --git a/include/sound.h b/include/sound.h index 5bbc529..e323550 100644 --- a/include/sound.h +++ b/include/sound.h @@ -31,7 +31,7 @@ u_long setSPUtransfer(SpuVoiceAttr * voiceAttributes, VAGsound * sound); void setVAGvolume(SpuVoiceAttr * voiceAttributes, VAGsound * sound, int volumeL,int volumeR); void setLvlVAG(LEVEL * level, SpuCommonAttr * spuSettings, SpuVoiceAttr * voiceAttributes, char spu_malloc_rec[]); void playSFX(SpuVoiceAttr * voiceAttributes, VAGsound * sound, int volumeL, int volumeR ); -VECTOR setSFXdist(LEVEL * level, CAMERA * camera, int camMode); +void setSFXdist(LEVEL * level, CAMERA * camera, int camMode); // XA playback void XAsetup(void); void getXAoffset(LEVEL * level); diff --git a/levels/level0.c b/levels/level0.c index 38f14b5..44a5652 100644 --- a/levels/level0.c +++ b/levels/level0.c @@ -5,8 +5,8 @@ CVECTOR level0_BGc = { 134, 231, 229, 0 }; VECTOR level0_BKc = { 173, 173, 173, 0 }; CAMPOS level0_camPos_Camera = { - { -770,459,623 }, - { 301,-4096,0 } + { -370,359,323 }, + { 301,531,0 } }; CAMPATH level0_camPath = { @@ -992,21 +992,19 @@ NODE * level0_curNode = &level0_nodePlane; extern u_char _binary_VAG_1_cuek_vag_start; extern u_char _binary_VAG_3_hehe_vag_start; -extern u_char _binary_VAG_7_wron_vag_start; VAGbank level0_VAGBank = { - 10, + 9, { { &_binary_VAG_1_cuek_vag_start, SPU_00CH, 0 }, { &_binary_VAG_3_hehe_vag_start, SPU_01CH, 0 }, - { &_binary_VAG_7_wron_vag_start, SPU_02CH, 0 }, - { &_binary_VAG_3_hehe_vag_start, SPU_03CH, 0 }, + { &_binary_VAG_3_hehe_vag_start, SPU_02CH, 0 }, + { &_binary_VAG_1_cuek_vag_start, SPU_03CH, 0 }, { &_binary_VAG_1_cuek_vag_start, SPU_04CH, 0 }, - { &_binary_VAG_1_cuek_vag_start, SPU_05CH, 0 }, + { &_binary_VAG_3_hehe_vag_start, SPU_05CH, 0 }, { &_binary_VAG_3_hehe_vag_start, SPU_06CH, 0 }, - { &_binary_VAG_3_hehe_vag_start, SPU_07CH, 0 }, - { &_binary_VAG_1_cuek_vag_start, SPU_08CH, 0 }, - { &_binary_VAG_3_hehe_vag_start, SPU_09CH, 0 } + { &_binary_VAG_1_cuek_vag_start, SPU_07CH, 0 }, + { &_binary_VAG_3_hehe_vag_start, SPU_08CH, 0 } } }; @@ -1040,18 +1038,10 @@ SOUND_OBJECT level0_Speaker_001 = { &level0_meshCube }; -SOUND_OBJECT level0_Speaker_002 = { - {-267,432,-146}, - 16383, 16383, 0, 16383, - &level0_VAGBank.samples[2], - 0, - 0 -}; - SOUND_OBJECT level0_Speaker_003 = { {-101,156,253}, 16383, 16383, 0, 16383, - &level0_VAGBank.samples[3], + &level0_VAGBank.samples[2], 0, &level0_meshCube }; @@ -1059,7 +1049,7 @@ SOUND_OBJECT level0_Speaker_003 = { SOUND_OBJECT level0_Speaker_004 = { {83,161,253}, 16383, 16383, 0, 16383, - &level0_VAGBank.samples[4], + &level0_VAGBank.samples[3], 0, &level0_meshCube }; @@ -1067,7 +1057,7 @@ SOUND_OBJECT level0_Speaker_004 = { SOUND_OBJECT level0_Speaker_005 = { {76,-39,188}, 16383, 16383, 0, 16383, - &level0_VAGBank.samples[5], + &level0_VAGBank.samples[4], 0, &level0_meshCube }; @@ -1075,7 +1065,7 @@ SOUND_OBJECT level0_Speaker_005 = { SOUND_OBJECT level0_Speaker_006 = { {-108,-43,188}, 16383, 16383, 0, 16383, - &level0_VAGBank.samples[6], + &level0_VAGBank.samples[5], 0, &level0_meshCube }; @@ -1083,7 +1073,7 @@ SOUND_OBJECT level0_Speaker_006 = { SOUND_OBJECT level0_Speaker_007 = { {-352,55,234}, 16383, 16383, 0, 16383, - &level0_VAGBank.samples[7], + &level0_VAGBank.samples[6], 0, &level0_meshCube }; @@ -1091,7 +1081,7 @@ SOUND_OBJECT level0_Speaker_007 = { SOUND_OBJECT level0_Speaker_008 = { {-168,60,234}, 16383, 16383, 0, 16383, - &level0_VAGBank.samples[8], + &level0_VAGBank.samples[7], 0, &level0_meshCube }; @@ -1107,17 +1097,16 @@ SOUND_OBJECT level0_Speaker_009 = { SOUND_OBJECT level0_Speaker_010 = { {4,-160,143}, 16383, 16383, 0, 16383, - &level0_VAGBank.samples[9], + &level0_VAGBank.samples[8], 0, &level0_meshCube }; LEVEL_SOUNDS level0_sounds = { - 11, + 10, { &level0_Speaker, &level0_Speaker_001, - &level0_Speaker_002, &level0_Speaker_003, &level0_Speaker_004, &level0_Speaker_005, diff --git a/levels/level0.h b/levels/level0.h index 52a257c..e9a3834 100644 --- a/levels/level0.h +++ b/levels/level0.h @@ -41,7 +41,6 @@ extern XAbank level0_XABank_0; extern XAfiles level0_XAFiles; extern SOUND_OBJECT level0_Speaker; extern SOUND_OBJECT level0_Speaker_001; -extern SOUND_OBJECT level0_Speaker_002; extern SOUND_OBJECT level0_Speaker_003; extern SOUND_OBJECT level0_Speaker_004; extern SOUND_OBJECT level0_Speaker_005; diff --git a/levels/level1.c b/levels/level1.c index 6ed5cb2..81329f6 100644 --- a/levels/level1.c +++ b/levels/level1.c @@ -11086,7 +11086,7 @@ SOUND_OBJECT level1_Speaker = { 16383, 16383, 0, 16383, &level1_VAGBank.samples[0], 0, - &level1_meshCube + &level1_meshSphere }; SOUND_OBJECT level1_Speaker_001 = { @@ -11094,7 +11094,7 @@ SOUND_OBJECT level1_Speaker_001 = { 16383, 16383, 0, 16383, &level1_VAGBank.samples[1], 0, - &level1_meshCube + &level1_meshSphere }; SOUND_OBJECT level1_Speaker_002 = { @@ -11110,7 +11110,7 @@ SOUND_OBJECT level1_Speaker_003 = { 16383, 16383, 0, 16383, &level1_VAGBank.samples[3], 0, - &level1_meshCube + &level1_meshSphere_001 }; SOUND_OBJECT level1_Speaker_004 = { @@ -11126,7 +11126,7 @@ SOUND_OBJECT level1_Speaker_005 = { 16383, 16383, 0, 16383, &level1_VAGBank.samples[5], 0, - &level1_meshCube + &level1_meshSphere }; SOUND_OBJECT level1_Speaker_006 = { @@ -11134,7 +11134,7 @@ SOUND_OBJECT level1_Speaker_006 = { 16383, 16383, 0, 16383, &level1_VAGBank.samples[6], 0, - &level1_meshCube + &level1_meshSphere }; SOUND_OBJECT level1_Speaker_007 = { @@ -11142,7 +11142,7 @@ SOUND_OBJECT level1_Speaker_007 = { 16383, 16383, 0, 16383, &level1_VAGBank.samples[7], 0, - &level1_meshCube + &level1_meshSphere }; SOUND_OBJECT level1_Speaker_008 = { @@ -11150,7 +11150,7 @@ SOUND_OBJECT level1_Speaker_008 = { 16383, 16383, 0, 16383, &level1_VAGBank.samples[8], 0, - &level1_meshCube + &level1_meshSphere }; SOUND_OBJECT level1_Speaker_009 = { @@ -11158,7 +11158,7 @@ SOUND_OBJECT level1_Speaker_009 = { 16383, 16383, 0, 16383, 0, &level1_XABank_0.samples[0], - &level1_meshCube + &level1_meshSphere }; LEVEL_SOUNDS level1_sounds = { diff --git a/src/main.c b/src/main.c index 0a335ff..54146b2 100644 --- a/src/main.c +++ b/src/main.c @@ -37,7 +37,7 @@ u_long overlaySize = 0; #include "../levels/level1.h" // Levels -u_char level = 0; +u_char level = 1; u_short levelWas = 0; u_short levelHasChanged = 0; // Overlay @@ -261,9 +261,7 @@ int main() { respawnMesh(&curLvl, curLvl.propPtr, &propStartRot, &propStartPos, propStartNode ); } // Spatialize Sound - // TODO : Use L/R to spatialize further - VECTOR screenPos; - screenPos = setSFXdist(&curLvl, &camera, camMode); + setSFXdist(&curLvl, &camera, camMode); // Spatial partitioning if (curLvl.curNode){ for ( int msh = 0; msh < curLvl.curNode->siblings->index; msh ++ ) { @@ -362,7 +360,7 @@ int main() { // Angle between camera and actor applyVector( dc_actorRot, (patan(dist, posToActor.vy) >> 4 ) - 256, - (patan(-posToActor.vx, -posToActor.vz) / 16) - 3076, + (patan(-posToActor.vx, -posToActor.vz) / 16) + 1024, 0, = ); @@ -389,8 +387,7 @@ int main() { FntPrint("CamAngle : %d\n", curCamAngle); FntPrint("XA: %x\n", curLvl.XA); FntPrint("Ofst: %d\n", curLvl.XA->banks[0]->offset); - FntPrint("Vol: %d %d", curLvl.levelSounds->sounds[0]->volumeL, curLvl.levelSounds->sounds[0]->volumeR ); - FntPrint("Screenpos: %d %d", screenPos.vx, screenPos.vy ); + FntPrint("Vol: %d %d\n", curLvl.levelSounds->sounds[0]->volumeL, curLvl.levelSounds->sounds[0]->volumeR ); FntFlush(-1); display( &disp[db], &draw[db], otdisc[db], primbuff[db], &nextpri, &db); diff --git a/src/sound.c b/src/sound.c index 478f1f3..9348367 100644 --- a/src/sound.c +++ b/src/sound.c @@ -98,37 +98,36 @@ void playSFX(SpuVoiceAttr * voiceAttributes, VAGsound * sound, int volumeL, int // Play voice SpuSetKey(SpuOn, sound->spu_channel); }; -VECTOR setSFXdist(LEVEL * level, CAMERA * camera, int camMode ){ - VECTOR output; - //long long phi = 0; +void setSFXdist(LEVEL * level, CAMERA * camera, int camMode ){ + VECTOR sndPos2D = {0}; if (level->levelSounds != 0){ - //~ for(int snd = 0; snd < level0_sounds.index; snd++){ for(int snd = 0; snd < level->levelSounds->index; snd++){ - // TODO : move in playSFX() - // update sound location if sound has a parent u_int r; - // If parent is actor, if (level->levelSounds->sounds[snd]->parent == level->actorPtr && camMode <= 1){ r = CAM_DIST_TO_ACT; + // update sound location if sound has a parent and it's not actor } else if ( level->levelSounds->sounds[snd]->parent != 0){ VECTOR dist; copyVector(&level->levelSounds->sounds[snd]->location, &level->levelSounds->sounds[snd]->parent->pos); // Get distance between sound source and camera - addVector2(camera->pos, &level->levelSounds->sounds[snd]->location, &dist); + dist.vx = -camera->pos->vx - level->levelSounds->sounds[snd]->location.vx; + dist.vz = -camera->pos->vz - level->levelSounds->sounds[snd]->location.vz; r = psqrt((dist.vx * dist.vx) + (dist.vz * dist.vz)); - // Get angle between sound source and camera - //phi = patan( level->levelSounds->sounds[snd]->location.vx, level->levelSounds->sounds[snd]->location.vz ); - //phi = ( phi >> 4 ); + // Get snd screen coordinates + // Range -1024 0 == screen left, 0 +1024 == screen right + worldToScreen(&level->levelSounds->sounds[snd]->location, &sndPos2D); } - level->levelSounds->sounds[snd]->volumeL = level->levelSounds->sounds[snd]->volumeR = (level->levelSounds->sounds[snd]->volume_max/r) * SND_NMALIZED > SND_MAX_VOL ? SND_MAX_VOL : - (level->levelSounds->sounds[snd]->volume_max/r) * SND_NMALIZED < 0 ? 0 : - (level->levelSounds->sounds[snd]->volume_max/r) * SND_NMALIZED; - //TODO : use screen coordinates - worldToScreen(&level->levelSounds->sounds[snd]->location, &output); + // Find volume base on dist + u_int volumeBase = (level->levelSounds->sounds[snd]->volume_max/r) * SND_NMALIZED > SND_MAX_VOL ? SND_MAX_VOL : + (level->levelSounds->sounds[snd]->volume_max/r) * SND_NMALIZED < 0 ? 0 : + (level->levelSounds->sounds[snd]->volume_max/r) * SND_NMALIZED; + // Avoid value of 0 + sndPos2D.vx = sndPos2D.vx == 0 || sndPos2D.vx == -0 ? 1 : sndPos2D.vx; + level->levelSounds->sounds[snd]->volumeL = volumeBase / ( (sndPos2D.vx > SND_DZ ? ( sndPos2D.vx - SND_DZ >> 7) + 1 : 1) ); + level->levelSounds->sounds[snd]->volumeR = volumeBase / ( (sndPos2D.vx < -SND_DZ ? ( ( -sndPos2D.vx - SND_DZ ) >> 7) + 1 : 1) ); } } - return output; }; void XAsetup(void){ u_char param[4]; diff --git a/src/space.c b/src/space.c index 1f23c46..cc98881 100644 --- a/src/space.c +++ b/src/space.c @@ -13,9 +13,9 @@ void worldToScreen( VECTOR * worldPos, VECTOR * screenPos ) { // Get world translation vectors from rot and add to screenPos vx, vy, vz applyVector(screenPos, curRot.t[0], curRot.t[1], curRot.t[2], +=); // Correct perspective - screenPos -> vx = screenPos -> vx * distToScreen / ( screenPos -> vz + 1 ) ; // Add 1 to avoid division by 0 - screenPos -> vy = screenPos -> vy * distToScreen / ( screenPos -> vz + 1 ) ; - screenPos -> vz = distToScreen ; + //~ screenPos -> vx = screenPos -> vx * distToScreen / ( screenPos -> vz + 1 ) ; // Add 1 to avoid division by 0 + //~ screenPos -> vy = screenPos -> vy * distToScreen / ( screenPos -> vz + 1 ) ; + //~ screenPos -> vz = distToScreen ; }; void screenToWorld( VECTOR * screenPos, VECTOR * worldPos ) { int distToScreen; // corresponds to FOV