audio rework
This commit is contained in:
@@ -13,28 +13,46 @@
|
||||
#include <renderer/3d/mesh/static/static_mesh.hpp>
|
||||
#include <renderer/3d/pipeline/static/stapip_options.hpp>
|
||||
#include <renderer/renderer.hpp>
|
||||
#include <engine.hpp>
|
||||
#include <pad/pad.hpp>
|
||||
#include <audio/audio.hpp>
|
||||
#include <time/timer.hpp>
|
||||
|
||||
using Tyra::Audio;
|
||||
using Tyra::Engine;
|
||||
using Tyra::Pad;
|
||||
using Tyra::Renderer;
|
||||
using Tyra::StaPipOptions;
|
||||
using Tyra::StaticMesh;
|
||||
using Tyra::TextureRepository;
|
||||
using Tyra::Timer;
|
||||
using Tyra::Vec4;
|
||||
|
||||
namespace Demo {
|
||||
|
||||
class Weapon {
|
||||
public:
|
||||
Weapon(TextureRepository* repo);
|
||||
Weapon(Engine* engine);
|
||||
~Weapon();
|
||||
|
||||
StaticMesh* mesh;
|
||||
StaPipOptions* options;
|
||||
|
||||
void update();
|
||||
// void debugPosition(Pad* pad);
|
||||
|
||||
private:
|
||||
bool isShootAnimation1, isShootAnimation2;
|
||||
Pad* pad;
|
||||
Audio* audio;
|
||||
Timer shootTimer;
|
||||
Vec4 initialPosition;
|
||||
u8 adpcmCurrentChannel;
|
||||
u8 adpcmChannelsCount;
|
||||
|
||||
audsrv_adpcm_t* shootAdpcm;
|
||||
|
||||
void allocateOptions();
|
||||
u8 getShootChannel();
|
||||
};
|
||||
|
||||
} // namespace Demo
|
||||
|
||||
@@ -19,31 +19,32 @@ using Tyra::ObjLoaderOptions;
|
||||
namespace Demo {
|
||||
|
||||
Enemy::Enemy(TextureRepository* repo) {
|
||||
ObjLoader loader;
|
||||
// ObjLoader loader;
|
||||
|
||||
ObjLoaderOptions objOptions;
|
||||
objOptions.animation.count = 4;
|
||||
objOptions.flipUVs = true;
|
||||
objOptions.scale = 25.0F;
|
||||
// ObjLoaderOptions objOptions;
|
||||
// objOptions.animation.count = 4;
|
||||
// objOptions.flipUVs = true;
|
||||
// objOptions.scale = 35.0F;
|
||||
|
||||
auto* bodyData = loader.load(
|
||||
FileUtils::fromCwd("game/models/soldier/soldier.obj"), objOptions);
|
||||
bodyData->normalsEnabled = false;
|
||||
bodyMesh = new DynamicMesh(*bodyData);
|
||||
// auto* bodyData = loader.load(
|
||||
// FileUtils::fromCwd("game/models/soldier/soldier.obj"), objOptions);
|
||||
// bodyData->normalsEnabled = false;
|
||||
// bodyMesh = new DynamicMesh(*bodyData);
|
||||
|
||||
delete bodyData;
|
||||
// delete bodyData;
|
||||
|
||||
bodyMesh->playAnimation(0, bodyMesh->frames.size() - 1);
|
||||
bodyMesh->setAnimSpeed(0.1F);
|
||||
// bodyMesh->playAnimation(0, bodyMesh->frames.size() - 1);
|
||||
// bodyMesh->setAnimSpeed(0.1F);
|
||||
|
||||
repo->addByMesh(bodyMesh, FileUtils::fromCwd("game/models/soldier/"), "png");
|
||||
// repo->addByMesh(bodyMesh, FileUtils::fromCwd("game/models/soldier/"),
|
||||
// "png");
|
||||
|
||||
bodyMesh->translation.translateY(-5.0F);
|
||||
// bodyMesh->translation.translateY(-5.0F);
|
||||
|
||||
allocateOptions();
|
||||
// allocateOptions();
|
||||
|
||||
pairs.push_back(new RendererDynamicPair{bodyMesh, options});
|
||||
// pairs.push_back(new RendererDynamicPair{gunMesh, options});
|
||||
// pairs.push_back(new RendererDynamicPair{bodyMesh, options});
|
||||
// // pairs.push_back(new RendererDynamicPair{gunMesh, options});
|
||||
}
|
||||
|
||||
Enemy::~Enemy() {
|
||||
@@ -55,7 +56,9 @@ Enemy::~Enemy() {
|
||||
}
|
||||
}
|
||||
|
||||
void Enemy::update(const Vec4& playerPosition) { bodyMesh->animate(); }
|
||||
void Enemy::update(const Vec4& playerPosition) {
|
||||
// bodyMesh->animate();
|
||||
}
|
||||
|
||||
void Enemy::allocateOptions() { options = new DynPipOptions(); }
|
||||
|
||||
|
||||
@@ -26,7 +26,7 @@ GameState::~GameState() {}
|
||||
void GameState::onStart() {
|
||||
TYRA_LOG("Game. RAM: ", engine->info.getAvailableRAM(), "MB");
|
||||
|
||||
engine->audio.stopSong();
|
||||
engine->audio.song.stop();
|
||||
|
||||
auto* repository = &engine->renderer.core.texture.repository;
|
||||
player = new Player(engine);
|
||||
@@ -62,7 +62,8 @@ void GameState::update() {
|
||||
engine->renderer.beginFrame(cameraInfo);
|
||||
|
||||
dbgObj->setPosition(*cameraInfo.looksAt);
|
||||
float terrainHeight = terrain->getHeightOffset(player->getPosition());
|
||||
float terrainHeight = 0.0F;
|
||||
// float terrainHeight = terrain->getHeightOffset(player->getPosition());
|
||||
player->update(terrainHeight);
|
||||
enemy->update(player->getPosition());
|
||||
|
||||
@@ -70,8 +71,8 @@ void GameState::update() {
|
||||
{
|
||||
renderer.add(skybox->pair);
|
||||
renderer.add(player->pair);
|
||||
renderer.add(enemy->pairs);
|
||||
renderer.add(terrain->pair);
|
||||
// renderer.add(enemy->pairs);
|
||||
// renderer.add(terrain->pair);
|
||||
renderer.add(dbgObj->pair);
|
||||
}
|
||||
renderer.render();
|
||||
|
||||
@@ -22,7 +22,7 @@ Camera::Camera(Pad* t_pad) : lookAt(0.0F), position(0.0F), pad(t_pad) {
|
||||
Camera::~Camera() {}
|
||||
|
||||
void Camera::update(const Vec4& playerPosition, const float& terrainHeight) {
|
||||
const float rotationOffset = 0.03F;
|
||||
const float rotationOffset = 0.045F;
|
||||
const float heightOffset = 0.5F;
|
||||
|
||||
const auto& rightJoy = pad->getRightJoyPad();
|
||||
|
||||
@@ -13,14 +13,12 @@
|
||||
namespace Demo {
|
||||
|
||||
Player::Player(Engine* engine)
|
||||
: position(0.0F),
|
||||
weapon(&engine->renderer.core.texture.repository),
|
||||
camera(&engine->pad) {
|
||||
: position(0.0F), weapon(engine), camera(&engine->pad) {
|
||||
pair = new RendererStaticPair{weapon.mesh, weapon.options};
|
||||
pad = &engine->pad;
|
||||
position = Vec4(3.0F, 50.0F, 0.0F);
|
||||
camera.lookAt = Vec4(0.0F, 0.0F, -30.0F);
|
||||
speed = 2.0F;
|
||||
speed = 3.5F;
|
||||
}
|
||||
|
||||
Player::~Player() { delete pair; }
|
||||
@@ -39,7 +37,7 @@ void Player::handlePlayerPosition(const float& terrainHeight) {
|
||||
normalizedCamera *= speed;
|
||||
|
||||
Vec4 nextPosition(position);
|
||||
nextPosition.y = terrainHeight;
|
||||
nextPosition.y = terrainHeight - 100.0F;
|
||||
|
||||
if (leftJoy.v <= 100) {
|
||||
nextPosition.x += normalizedCamera.x;
|
||||
|
||||
@@ -18,13 +18,16 @@ using Tyra::ObjLoaderOptions;
|
||||
|
||||
namespace Demo {
|
||||
|
||||
Weapon::Weapon(TextureRepository* repo) {
|
||||
Weapon::Weapon(Engine* engine) {
|
||||
ObjLoader loader;
|
||||
|
||||
ObjLoaderOptions objOptions;
|
||||
objOptions.flipUVs = true;
|
||||
objOptions.scale = .5F;
|
||||
|
||||
pad = &engine->pad;
|
||||
audio = &engine->audio;
|
||||
auto* repo = &engine->renderer.core.texture.repository;
|
||||
auto* data =
|
||||
loader.load(FileUtils::fromCwd("game/models/ak47/ak47.obj"), objOptions);
|
||||
data->normalsEnabled = false;
|
||||
@@ -42,10 +45,75 @@ Weapon::Weapon(TextureRepository* repo) {
|
||||
|
||||
repo->addByMesh(mesh, FileUtils::fromCwd("game/models/ak47/"), "png");
|
||||
|
||||
initialPosition = *mesh->getPosition();
|
||||
|
||||
allocateOptions();
|
||||
|
||||
shootAdpcm =
|
||||
audio->adpcm.load(FileUtils::fromCwd("game/models/ak47/ak47.adpcm"));
|
||||
|
||||
isShootAnimation1 = isShootAnimation2 = false;
|
||||
|
||||
adpcmChannelsCount = 8;
|
||||
adpcmCurrentChannel = 0;
|
||||
|
||||
const u8 shootVolume = 40;
|
||||
for (u8 i = 0; i < adpcmChannelsCount; i++) {
|
||||
audio->adpcm.setVolume(shootVolume, i);
|
||||
}
|
||||
}
|
||||
|
||||
void Weapon::update() {}
|
||||
Weapon::~Weapon() {
|
||||
delete mesh;
|
||||
delete options;
|
||||
delete shootAdpcm;
|
||||
}
|
||||
|
||||
u8 Weapon::getShootChannel() {
|
||||
auto result = adpcmCurrentChannel++;
|
||||
|
||||
if (adpcmCurrentChannel >= adpcmChannelsCount) {
|
||||
adpcmCurrentChannel = 0;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
void Weapon::update() {
|
||||
if (!isShootAnimation1 && !isShootAnimation2 && pad->getPressed().Cross) {
|
||||
shootTimer.prime();
|
||||
audio->adpcm.tryPlay(shootAdpcm, getShootChannel());
|
||||
isShootAnimation1 = true;
|
||||
}
|
||||
|
||||
auto* position = mesh->getPosition();
|
||||
|
||||
const float recoil = 0.5F;
|
||||
const float speed = 500;
|
||||
|
||||
if (isShootAnimation1) {
|
||||
position->z += recoil;
|
||||
position->y -= recoil / 4;
|
||||
if (shootTimer.getTimeDelta() > speed) {
|
||||
isShootAnimation1 = false;
|
||||
shootTimer.prime();
|
||||
isShootAnimation2 = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (isShootAnimation2) {
|
||||
position->z -= recoil / 2;
|
||||
position->y += recoil / 8;
|
||||
if (shootTimer.getTimeDelta() > speed * 2) {
|
||||
isShootAnimation2 = false;
|
||||
*position = initialPosition;
|
||||
if (pad->getPressed().Cross) {
|
||||
shootTimer.prime();
|
||||
audio->adpcm.tryPlay(shootAdpcm, getShootChannel());
|
||||
isShootAnimation1 = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// float tX = 0.0F;
|
||||
// float tY = -3.0F;
|
||||
@@ -100,11 +168,6 @@ void Weapon::update() {}
|
||||
// TYRA_LOG("tX: ", tX, " tY: ", tY, " tZ: ", tZ, " rY: ", rY, " rZ: ", rZ);
|
||||
// }
|
||||
|
||||
Weapon::~Weapon() {
|
||||
delete mesh;
|
||||
delete options;
|
||||
}
|
||||
|
||||
void Weapon::allocateOptions() {
|
||||
options = new StaPipOptions();
|
||||
options->textureMappingType = Tyra::TyraNearest;
|
||||
|
||||
@@ -18,29 +18,29 @@ using Tyra::ObjLoaderOptions;
|
||||
|
||||
namespace Demo {
|
||||
Terrain::Terrain(TextureRepository* repo)
|
||||
: heightmap(-5.0F, // Min height
|
||||
100.0F, // Max height
|
||||
Vec4(-196.6F, 0.0F, -412.0F, 1.0F), // Left up
|
||||
Vec4(286.0F, 0.0F, 443.3F, 1.0F) // Right down
|
||||
: heightmap(-5.0F, // Min height
|
||||
450.0F, // Max height
|
||||
Vec4(-784.6F, 0.0F, -1648.0F, 1.0F), // Left up
|
||||
Vec4(1144.0F, 0.0F, 1772.3F, 1.0F) // Right down
|
||||
) {
|
||||
ObjLoader loader;
|
||||
// ObjLoader loader;
|
||||
|
||||
ObjLoaderOptions objOptions;
|
||||
objOptions.flipUVs = true;
|
||||
objOptions.scale = 25.0F;
|
||||
// ObjLoaderOptions objOptions;
|
||||
// objOptions.flipUVs = true;
|
||||
// objOptions.scale = 100.0F;
|
||||
|
||||
auto* data = loader.load(
|
||||
FileUtils::fromCwd("game/models/terrain/terrain.obj"), objOptions);
|
||||
data->normalsEnabled = false;
|
||||
mesh = new StaticMesh(*data);
|
||||
// auto* data = loader.load(
|
||||
// FileUtils::fromCwd("game/models/terrain/terrain.obj"), objOptions);
|
||||
// data->normalsEnabled = false;
|
||||
// mesh = new StaticMesh(*data);
|
||||
|
||||
delete data;
|
||||
// delete data;
|
||||
|
||||
repo->addByMesh(mesh, FileUtils::fromCwd("game/models/terrain/"), "png");
|
||||
// repo->addByMesh(mesh, FileUtils::fromCwd("game/models/terrain/"), "png");
|
||||
|
||||
allocateOptions();
|
||||
// allocateOptions();
|
||||
|
||||
pair = new RendererStaticPair{mesh, options};
|
||||
// pair = new RendererStaticPair{mesh, options};
|
||||
}
|
||||
|
||||
float Terrain::getHeightOffset(const Vec4& playerPosition) {
|
||||
|
||||
@@ -32,10 +32,10 @@ IntroState::~IntroState() {}
|
||||
void IntroState::onStart() {
|
||||
TYRA_LOG("Intro. RAM: ", engine->info.getAvailableRAM(), "MB");
|
||||
|
||||
engine->audio.loadSong(FileUtils::fromCwd("intro/intro.wav"));
|
||||
engine->audio.setSongLoop(false);
|
||||
engine->audio.setSongVolume(80);
|
||||
engine->audio.playSong();
|
||||
engine->audio.song.load(FileUtils::fromCwd("intro/intro.wav"));
|
||||
engine->audio.song.inLoop = false;
|
||||
engine->audio.song.setVolume(80);
|
||||
engine->audio.song.play();
|
||||
|
||||
stateManager.add(new IntroPs2DevState(engine));
|
||||
stateManager.add(new IntroTyraState(engine));
|
||||
|
||||
Reference in New Issue
Block a user