Playing around with shaders for effects on the scene.
This commit is contained in:
parent
3519c73079
commit
071808a0f8
8 changed files with 68 additions and 4 deletions
|
@ -1,5 +1,7 @@
|
||||||
#include "animator.hpp"
|
#include "animator.hpp"
|
||||||
#include "constants.hpp"
|
#include "constants.hpp"
|
||||||
|
#include <SFML/Audio.hpp>
|
||||||
|
#include "dbc.hpp"
|
||||||
|
|
||||||
void Animator::step(sf::Sprite& sprite, int rect_x, int rect_y, int rect_w, int rect_h) {
|
void Animator::step(sf::Sprite& sprite, int rect_x, int rect_y, int rect_w, int rect_h) {
|
||||||
if(playing) {
|
if(playing) {
|
||||||
|
@ -15,4 +17,5 @@ void Animator::step(sf::Sprite& sprite, int rect_x, int rect_y, int rect_w, int
|
||||||
|
|
||||||
void Animator::play() {
|
void Animator::play() {
|
||||||
playing = true;
|
playing = true;
|
||||||
|
sound.play();
|
||||||
}
|
}
|
||||||
|
|
11
animator.hpp
11
animator.hpp
|
@ -1,14 +1,25 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
#include <SFML/Graphics/Sprite.hpp>
|
#include <SFML/Graphics/Sprite.hpp>
|
||||||
|
#include <SFML/Audio.hpp>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
struct Animator {
|
struct Animator {
|
||||||
int width = 0;
|
int width = 0;
|
||||||
int height = 0;
|
int height = 0;
|
||||||
int max_frames = 0;
|
int max_frames = 0;
|
||||||
|
sf::SoundBuffer buffer;
|
||||||
|
sf::Sound sound;
|
||||||
size_t count = 0;
|
size_t count = 0;
|
||||||
int frame = 0;
|
int frame = 0;
|
||||||
bool playing = false;
|
bool playing = false;
|
||||||
|
|
||||||
|
Animator(int w, int h, int max, std::string sound_file) :
|
||||||
|
width(w), height(h), max_frames(max),
|
||||||
|
buffer(sound_file),
|
||||||
|
sound(buffer)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
void step(sf::Sprite& sprite, int rect_x, int rect_y, int rect_w, int rect_h);
|
void step(sf::Sprite& sprite, int rect_x, int rect_y, int rect_w, int rect_h);
|
||||||
|
|
||||||
void play();
|
void play();
|
||||||
|
|
BIN
assets/monster-1.ogg
Normal file
BIN
assets/monster-1.ogg
Normal file
Binary file not shown.
9
main.cpp
9
main.cpp
|
@ -52,6 +52,7 @@ int main() {
|
||||||
Raycaster rayview(window, MAP, RAY_VIEW_WIDTH, RAY_VIEW_HEIGHT);
|
Raycaster rayview(window, MAP, RAY_VIEW_WIDTH, RAY_VIEW_HEIGHT);
|
||||||
rayview.set_position(RAY_VIEW_X, RAY_VIEW_Y);
|
rayview.set_position(RAY_VIEW_X, RAY_VIEW_Y);
|
||||||
rayview.position_camera(player_x, player_y);
|
rayview.position_camera(player_x, player_y);
|
||||||
|
rayview.init_shaders();
|
||||||
|
|
||||||
double moveSpeed = 0.1;
|
double moveSpeed = 0.1;
|
||||||
double rotSpeed = 0.1;
|
double rotSpeed = 0.1;
|
||||||
|
@ -95,6 +96,14 @@ int main() {
|
||||||
stats.reset();
|
stats.reset();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(sf::Keyboard::isKeyPressed(sf::Keyboard::Key::P)) {
|
||||||
|
if(rayview.$active_shader == nullptr) {
|
||||||
|
rayview.$active_shader = &rayview.$paused;
|
||||||
|
} else {
|
||||||
|
rayview.$active_shader = nullptr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if(sf::Mouse::isButtonPressed(sf::Mouse::Button::Left)) {
|
if(sf::Mouse::isButtonPressed(sf::Mouse::Button::Left)) {
|
||||||
rayview.$anim.play();
|
rayview.$anim.play();
|
||||||
rotation = -30.0f;
|
rotation = -30.0f;
|
||||||
|
|
|
@ -16,6 +16,11 @@ json = dependency('nlohmann_json')
|
||||||
opengl32 = cc.find_library('opengl32', required: true)
|
opengl32 = cc.find_library('opengl32', required: true)
|
||||||
winmm = cc.find_library('winmm', required: true)
|
winmm = cc.find_library('winmm', required: true)
|
||||||
gdi32 = cc.find_library('gdi32', required: true)
|
gdi32 = cc.find_library('gdi32', required: true)
|
||||||
|
flac = dependency('flac')
|
||||||
|
ogg = dependency('ogg')
|
||||||
|
vorbis = dependency('vorbis')
|
||||||
|
vorbisfile = dependency('vorbisfile')
|
||||||
|
vorbisenc = dependency('vorbisenc')
|
||||||
sfml_audio = dependency('sfml_audio')
|
sfml_audio = dependency('sfml_audio')
|
||||||
sfml_graphics = dependency('sfml_graphics')
|
sfml_graphics = dependency('sfml_graphics')
|
||||||
sfml_main = dependency('sfml_main')
|
sfml_main = dependency('sfml_main')
|
||||||
|
@ -29,6 +34,7 @@ endif
|
||||||
|
|
||||||
dependencies = [
|
dependencies = [
|
||||||
fmt, json, opengl32, freetype2,
|
fmt, json, opengl32, freetype2,
|
||||||
|
flac, ogg, vorbis, vorbisfile, vorbisenc,
|
||||||
winmm, gdi32, sfml_audio, sfml_graphics,
|
winmm, gdi32, sfml_audio, sfml_graphics,
|
||||||
sfml_main, sfml_network, sfml_system,
|
sfml_main, sfml_network, sfml_system,
|
||||||
sfml_window, tracy
|
sfml_window, tracy
|
||||||
|
|
|
@ -36,7 +36,8 @@ Raycaster::Raycaster(sf::RenderWindow& window, Matrix &map, int width, int heigh
|
||||||
$map(map),
|
$map(map),
|
||||||
spriteOrder(NUM_SPRITES),
|
spriteOrder(NUM_SPRITES),
|
||||||
spriteDistance(NUM_SPRITES),
|
spriteDistance(NUM_SPRITES),
|
||||||
ZBuffer(width)
|
ZBuffer(width),
|
||||||
|
$anim(256, 256, 10, "assets/monster-1.ogg")
|
||||||
{
|
{
|
||||||
$view_sprite.setPosition({0, 0});
|
$view_sprite.setPosition({0, 0});
|
||||||
$pixels = make_unique<RGBA[]>($width * $height);
|
$pixels = make_unique<RGBA[]>($width * $height);
|
||||||
|
@ -46,6 +47,13 @@ Raycaster::Raycaster(sf::RenderWindow& window, Matrix &map, int width, int heigh
|
||||||
$view_texture.setSmooth(false);
|
$view_texture.setSmooth(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Raycaster::init_shaders() {
|
||||||
|
bool good = $paused.loadFromFile("shaders/modal.frag", sf::Shader::Type::Fragment);
|
||||||
|
dbc::check(good, "shader could not be loaded");
|
||||||
|
$paused.setUniform("offsetFactor", sf::Glsl::Vec2{0.01f, 0.01f});
|
||||||
|
$paused.setUniform("darkness", 0.01f);
|
||||||
|
}
|
||||||
|
|
||||||
void Raycaster::set_position(int x, int y) {
|
void Raycaster::set_position(int x, int y) {
|
||||||
$view_sprite.setPosition({(float)x, (float)y});
|
$view_sprite.setPosition({(float)x, (float)y});
|
||||||
}
|
}
|
||||||
|
@ -58,7 +66,7 @@ void Raycaster::position_camera(float player_x, float player_y) {
|
||||||
|
|
||||||
void Raycaster::draw_pixel_buffer() {
|
void Raycaster::draw_pixel_buffer() {
|
||||||
$view_texture.update((uint8_t *)$pixels.get(), {(unsigned int)$width, (unsigned int)$height}, {0, 0});
|
$view_texture.update((uint8_t *)$pixels.get(), {(unsigned int)$width, (unsigned int)$height}, {0, 0});
|
||||||
$window.draw($view_sprite);
|
$window.draw($view_sprite, $active_shader);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Raycaster::clear() {
|
void Raycaster::clear() {
|
||||||
|
@ -152,7 +160,7 @@ void Raycaster::sprite_casting() {
|
||||||
$anim.step(*sf_sprite, texX, texY, texX_end - texX, textureHeight);
|
$anim.step(*sf_sprite, texX, texY, texX_end - texX, textureHeight);
|
||||||
sf_sprite->setPosition({x, y});
|
sf_sprite->setPosition({x, y});
|
||||||
|
|
||||||
$window.draw(*sf_sprite);
|
$window.draw(*sf_sprite, $active_shader);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -44,7 +44,9 @@ struct Raycaster {
|
||||||
std::vector<int> spriteOrder;
|
std::vector<int> spriteOrder;
|
||||||
std::vector<double> spriteDistance;
|
std::vector<double> spriteDistance;
|
||||||
std::vector<double> ZBuffer; // width
|
std::vector<double> ZBuffer; // width
|
||||||
Animator $anim{256, 256, 10, 0};
|
Animator $anim;
|
||||||
|
sf::Shader $paused;
|
||||||
|
sf::Shader* $active_shader = nullptr;
|
||||||
|
|
||||||
Raycaster(sf::RenderWindow& window, Matrix &map, int width, int height);
|
Raycaster(sf::RenderWindow& window, Matrix &map, int width, int height);
|
||||||
|
|
||||||
|
@ -63,6 +65,8 @@ struct Raycaster {
|
||||||
void position_camera(float player_x, float player_y);
|
void position_camera(float player_x, float player_y);
|
||||||
|
|
||||||
void set_position(int x, int y);
|
void set_position(int x, int y);
|
||||||
|
void init_shaders();
|
||||||
|
|
||||||
inline size_t pixcoord(int x, int y) {
|
inline size_t pixcoord(int x, int y) {
|
||||||
if(!(x >=0 && x < $width)) {
|
if(!(x >=0 && x < $width)) {
|
||||||
dbc::sentinel(fmt::format("pixcoord x={} but $width={}", x, $width));
|
dbc::sentinel(fmt::format("pixcoord x={} but $width={}", x, $width));
|
||||||
|
|
23
shaders/modal.frag
Normal file
23
shaders/modal.frag
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
uniform sampler2D source;
|
||||||
|
uniform sampler2D bloom;
|
||||||
|
uniform vec2 offsetFactor;
|
||||||
|
uniform float darkness;
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
vec2 textureCoordinates = gl_TexCoord[0].xy;
|
||||||
|
vec4 color = vec4(0.0);
|
||||||
|
color += texture2D(source, textureCoordinates - 4.0 * offsetFactor) * 0.0162162162;
|
||||||
|
color += texture2D(source, textureCoordinates - 3.0 * offsetFactor) * 0.0540540541;
|
||||||
|
color += texture2D(source, textureCoordinates - 2.0 * offsetFactor) * 0.1216216216;
|
||||||
|
color += texture2D(source, textureCoordinates - offsetFactor) * 0.1945945946;
|
||||||
|
color += texture2D(source, textureCoordinates) * 0.2270270270;
|
||||||
|
color += texture2D(source, textureCoordinates + offsetFactor) * 0.1945945946;
|
||||||
|
color += texture2D(source, textureCoordinates + 2.0 * offsetFactor) * 0.1216216216;
|
||||||
|
color += texture2D(source, textureCoordinates + 3.0 * offsetFactor) * 0.0540540541;
|
||||||
|
color += texture2D(source, textureCoordinates + 4.0 * offsetFactor) * 0.0162162162;
|
||||||
|
|
||||||
|
vec4 sourceFragment = texture2D(source, gl_TexCoord[0].xy);
|
||||||
|
vec4 bloomFragment = texture2D(bloom, gl_TexCoord[0].xy);
|
||||||
|
gl_FragColor = color + sourceFragment - bloomFragment - darkness;
|
||||||
|
}
|
Loading…
Add table
Add a link
Reference in a new issue