Working on a messaging system for sf events
This commit is contained in:
@@ -2,8 +2,9 @@
|
|||||||
#include <SFML/System/Vector3.hpp>
|
#include <SFML/System/Vector3.hpp>
|
||||||
#include <SFML/System/Vector2.hpp>
|
#include <SFML/System/Vector2.hpp>
|
||||||
#include "util.hpp"
|
#include "util.hpp"
|
||||||
|
#include "Pub_Sub.hpp"
|
||||||
|
|
||||||
class Camera {
|
class Camera : public SfEventSubscriber{
|
||||||
public:
|
public:
|
||||||
|
|
||||||
enum DIRECTION { FORWARD, REARWARD, LEFT, RIGHT, UP, DOWN };
|
enum DIRECTION { FORWARD, REARWARD, LEFT, RIGHT, UP, DOWN };
|
||||||
@@ -33,6 +34,9 @@ public:
|
|||||||
sf::Vector3f get_position();
|
sf::Vector3f get_position();
|
||||||
sf::Vector2f get_direction();
|
sf::Vector2f get_direction();
|
||||||
|
|
||||||
|
|
||||||
|
virtual void update(SfEventPublisher* p, sf::Event e) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
float friction_coefficient = 0.1f;
|
float friction_coefficient = 0.1f;
|
||||||
|
|||||||
30
include/Input.h
Normal file
30
include/Input.h
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
#pragma once
|
||||||
|
#include <SFML/Graphics.hpp>
|
||||||
|
#include <list>
|
||||||
|
#include "Pub_Sub.hpp"
|
||||||
|
|
||||||
|
|
||||||
|
class Input : public SfEventPublisher {
|
||||||
|
public:
|
||||||
|
|
||||||
|
Input();
|
||||||
|
~Input();
|
||||||
|
|
||||||
|
// Keep track of keys that are not released
|
||||||
|
// Keep track of mouse up and downs in conjunction with dragging
|
||||||
|
// Keep track of joystick buttons
|
||||||
|
|
||||||
|
void consume_events(sf::RenderWindow *window);
|
||||||
|
void set_flags();
|
||||||
|
void dispatch_events();
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::vector<sf::Keyboard::Key> held_keys;
|
||||||
|
std::vector<sf::Mouse::Button> held_mouse_buttons;
|
||||||
|
|
||||||
|
std::vector<bool> keyboard_flags;
|
||||||
|
std::vector<bool> mouse_flags;
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::list<sf::Event> event_queue;
|
||||||
|
};
|
||||||
133
include/Pub_Sub.hpp
Normal file
133
include/Pub_Sub.hpp
Normal file
@@ -0,0 +1,133 @@
|
|||||||
|
#pragma once
|
||||||
|
#include <SFML/Graphics.hpp>
|
||||||
|
|
||||||
|
|
||||||
|
class SfEventPublisher;
|
||||||
|
|
||||||
|
class SfEventSubscriber {
|
||||||
|
public:
|
||||||
|
virtual ~SfEventSubscriber() {};
|
||||||
|
virtual void update(SfEventPublisher* p, sf::Event e) = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
class SfEventPublisher {
|
||||||
|
public:
|
||||||
|
|
||||||
|
// Allows the subscription to classes of events
|
||||||
|
enum Event_Class {
|
||||||
|
JoystickButtonEvent,
|
||||||
|
JoystickConnectEvent,
|
||||||
|
JoystickMoveEvent,
|
||||||
|
KeyEvent,
|
||||||
|
MouseButtonEvent,
|
||||||
|
MouseMoveEvent,
|
||||||
|
MouseWheelEvent,
|
||||||
|
MouseWheelScrollEvent,
|
||||||
|
SensorEvent,
|
||||||
|
SizeEvent,
|
||||||
|
TextEvent,
|
||||||
|
TouchEvent,
|
||||||
|
WindowEvent
|
||||||
|
};
|
||||||
|
|
||||||
|
virtual ~SfEventPublisher() {};
|
||||||
|
virtual void subscribe(SfEventSubscriber *s, Event_Class c) {
|
||||||
|
subscribers[c].push_back(s);
|
||||||
|
};
|
||||||
|
virtual void unsubscribe(SfEventSubscriber *s, Event_Class c) {
|
||||||
|
std::remove(subscribers[c].begin(), subscribers[c].end(), s);
|
||||||
|
};
|
||||||
|
virtual void notify(sf::Event e) {
|
||||||
|
|
||||||
|
// I don't quite like that some event classes contained multiple types of events:
|
||||||
|
// KeyPressed, and KeyReleased under KeyEvent for example.
|
||||||
|
// While others are not represented by classes:
|
||||||
|
// Closed, LostFocus, and GainedFocus have no representing class.
|
||||||
|
// So, we'll add another "class", WindowEvent which contains those previously mentioned,
|
||||||
|
// and use those new identifiers to group our events
|
||||||
|
|
||||||
|
// This will also make it a bit easier when subscribing to certain events
|
||||||
|
|
||||||
|
Event_Class event_class;
|
||||||
|
|
||||||
|
if (e.type == sf::Event::Closed ||
|
||||||
|
e.type == sf::Event::LostFocus ||
|
||||||
|
e.type == sf::Event::GainedFocus ){
|
||||||
|
|
||||||
|
event_class = Event_Class::WindowEvent;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Preserve a little of sfml's default behavior and separate resized event
|
||||||
|
else if (e.type == sf::Event::Resized) {
|
||||||
|
event_class = Event_Class::SizeEvent;
|
||||||
|
}
|
||||||
|
|
||||||
|
else if (e.type == sf::Event::TextEntered) {
|
||||||
|
event_class = Event_Class::TextEvent;
|
||||||
|
}
|
||||||
|
|
||||||
|
else if (e.type == sf::Event::KeyPressed ||
|
||||||
|
e.type == sf::Event::KeyReleased ){
|
||||||
|
|
||||||
|
event_class = Event_Class::KeyEvent;
|
||||||
|
}
|
||||||
|
|
||||||
|
else if (e.type == sf::Event::MouseWheelMoved ||
|
||||||
|
e.type == sf::Event::MouseWheelScrolled ){
|
||||||
|
|
||||||
|
event_class = Event_Class::MouseWheelScrollEvent;
|
||||||
|
}
|
||||||
|
|
||||||
|
else if (e.type == sf::Event::MouseButtonPressed ||
|
||||||
|
e.type == sf::Event::MouseButtonReleased ){
|
||||||
|
|
||||||
|
event_class = Event_Class::MouseButtonEvent;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Is this a good idea, mixing events that contain data, and don't contain data?
|
||||||
|
else if (e.type == sf::Event::MouseMoved ||
|
||||||
|
e.type == sf::Event::MouseEntered ||
|
||||||
|
e.type == sf::Event::MouseLeft ){
|
||||||
|
|
||||||
|
event_class = Event_Class::MouseMoveEvent;
|
||||||
|
}
|
||||||
|
|
||||||
|
else if (e.type == sf::Event::JoystickButtonPressed ||
|
||||||
|
e.type == sf::Event::JoystickButtonReleased ){
|
||||||
|
|
||||||
|
event_class = Event_Class::JoystickButtonEvent;
|
||||||
|
}
|
||||||
|
|
||||||
|
else if (e.type == sf::Event::JoystickMoved) {
|
||||||
|
event_class = Event_Class::JoystickMoveEvent;
|
||||||
|
}
|
||||||
|
|
||||||
|
else if (e.type == sf::Event::JoystickConnected ||
|
||||||
|
e.type == sf::Event::JoystickDisconnected ){
|
||||||
|
|
||||||
|
event_class = Event_Class::JoystickConnectEvent;
|
||||||
|
}
|
||||||
|
|
||||||
|
else if (e.type == sf::Event::TouchBegan ||
|
||||||
|
e.type == sf::Event::TouchEnded ||
|
||||||
|
e.type == sf::Event::TouchMoved ){
|
||||||
|
|
||||||
|
event_class = Event_Class::TouchEvent;
|
||||||
|
}
|
||||||
|
|
||||||
|
else if (e.type == sf::Event::SensorChanged) {
|
||||||
|
event_class = Event_Class::SensorEvent;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
std::vector<SfEventSubscriber*> *event_type_bucket = &subscribers[event_class];
|
||||||
|
|
||||||
|
for (auto s : *event_type_bucket) {
|
||||||
|
s->update(this, e);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
private:
|
||||||
|
std::map<Event_Class, std::vector<SfEventSubscriber*>> subscribers;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
@@ -1,13 +1,12 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
#include <SFML/Graphics.hpp>
|
#include <SFML/Graphics.hpp>
|
||||||
#include <iostream>
|
#include "Vector4.hpp"
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
|
#include <bitset>
|
||||||
|
#include <iostream>
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
#include "Vector4.hpp"
|
|
||||||
#include <bitset>
|
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <math.h>
|
|
||||||
#include <iterator>
|
#include <iterator>
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -99,12 +99,13 @@ __kernel void raycaster(
|
|||||||
global int* seed_memory
|
global int* seed_memory
|
||||||
){
|
){
|
||||||
|
|
||||||
|
// Get and set the random seed from seed memory
|
||||||
int global_id = get_global_id(1) * get_global_size(0) + get_global_id(0);
|
int global_id = get_global_id(0);
|
||||||
int seed = seed_memory[global_id];
|
int seed = seed_memory[global_id];
|
||||||
int random_number = rand(&seed);
|
int random_number = rand(&seed);
|
||||||
seed_memory[global_id] = seed;
|
seed_memory[global_id] = seed;
|
||||||
|
|
||||||
|
|
||||||
size_t id = get_global_id(0);
|
size_t id = get_global_id(0);
|
||||||
int2 pixel = {id % (*resolution).x, id / (*resolution).x};
|
int2 pixel = {id % (*resolution).x, id / (*resolution).x};
|
||||||
float3 ray_dir = projection_matrix[pixel.x + (*resolution).x * pixel.y];
|
float3 ray_dir = projection_matrix[pixel.x + (*resolution).x * pixel.y];
|
||||||
|
|||||||
@@ -86,19 +86,15 @@ int Camera::update(double delta_time) {
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Camera::look_at_center() {
|
void Camera::update(SfEventPublisher* p, sf::Event e)
|
||||||
//std::cout << "X:" << position.x << std::endl;
|
{
|
||||||
//std::cout << "Y:" << position.y << std::endl;
|
|
||||||
//std::cout << "Z:" << position.z << std::endl;
|
|
||||||
|
|
||||||
//std::cout << "dx:" << direction.x << std::endl;
|
}
|
||||||
//std::cout << "dy:" << direction.y << std::endl;
|
|
||||||
|
void Camera::look_at_center() {
|
||||||
|
|
||||||
direction = CartToNormalizedSphere(sf::Vector3f(75, 75, 75) - position);
|
direction = CartToNormalizedSphere(sf::Vector3f(75, 75, 75) - position);
|
||||||
|
|
||||||
//std::cout << "dx:" << direction.x << std::endl;
|
|
||||||
//std::cout << "dy:" << direction.y << std::endl;
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
43
src/Input.cpp
Normal file
43
src/Input.cpp
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
#include "Input.h"
|
||||||
|
|
||||||
|
|
||||||
|
Input::Input() :
|
||||||
|
keyboard_flags(sf::Keyboard::Key::KeyCount, false),
|
||||||
|
mouse_flags(sf::Mouse::Button::ButtonCount, false)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
Input::~Input()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void Input::consume_events(sf::RenderWindow *window) {
|
||||||
|
|
||||||
|
sf::Event e;
|
||||||
|
while (window->pollEvent(e)) {
|
||||||
|
event_queue.push_back(e);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void Input::set_flags() {
|
||||||
|
|
||||||
|
for (auto e: event_queue) {
|
||||||
|
if (e.type == sf::Event::KeyPressed) {
|
||||||
|
held_keys.push_back(e.key.code);
|
||||||
|
}
|
||||||
|
else if (e.type == sf::Event::KeyReleased) {
|
||||||
|
std::remove(held_keys.begin(), held_keys.end(), e.key.code);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Input::dispatch_events() {
|
||||||
|
|
||||||
|
while (event_queue.size() != 0) {
|
||||||
|
notify(event_queue.front());
|
||||||
|
event_queue.pop_front();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -131,11 +131,11 @@ sf::Color Ray::Cast() {
|
|||||||
|
|
||||||
switch (voxel_data) {
|
switch (voxel_data) {
|
||||||
case 5:
|
case 5:
|
||||||
return sf::Color(255, 120, 255, alpha);
|
return sf::Color(255, 120, 255, static_cast<int>(alpha));
|
||||||
case 6:
|
case 6:
|
||||||
return sf::Color(150, 80, 220, alpha);
|
return sf::Color(150, 80, 220, static_cast<int>(alpha));
|
||||||
default:
|
default:
|
||||||
return sf::Color(150, 80, 220, alpha);
|
return sf::Color(150, 80, 220, static_cast<int>(alpha));
|
||||||
}
|
}
|
||||||
|
|
||||||
dist++;
|
dist++;
|
||||||
|
|||||||
@@ -328,7 +328,7 @@ sf::Color Software_Caster::global_light(sf::Color in, sf::Vector3i mask) {
|
|||||||
|
|
||||||
sf::Vector3f mask_f(mask);
|
sf::Vector3f mask_f(mask);
|
||||||
|
|
||||||
in.a = in.a + acos(
|
in.a = in.a + (int)acos(
|
||||||
DotProduct(
|
DotProduct(
|
||||||
Normalize(lights.at(0).direction_cartesian),
|
Normalize(lights.at(0).direction_cartesian),
|
||||||
Normalize(mask_f)
|
Normalize(mask_f)
|
||||||
|
|||||||
32
src/main.cpp
32
src/main.cpp
@@ -5,6 +5,9 @@
|
|||||||
|
|
||||||
#elif defined _WIN32
|
#elif defined _WIN32
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
|
|
||||||
|
// As if hardware is ever going to move away from 1.2
|
||||||
|
#define CL_USE_DEPRECATED_OPENCL_1_2_APIS
|
||||||
#include <CL/cl.h>
|
#include <CL/cl.h>
|
||||||
#include <CL/opencl.h>
|
#include <CL/opencl.h>
|
||||||
|
|
||||||
@@ -32,6 +35,7 @@
|
|||||||
#include "Vector4.hpp"
|
#include "Vector4.hpp"
|
||||||
#include <Camera.h>
|
#include <Camera.h>
|
||||||
#include "Software_Caster.h"
|
#include "Software_Caster.h"
|
||||||
|
#include "Input.h"
|
||||||
|
|
||||||
|
|
||||||
const int WINDOW_X = 1920;
|
const int WINDOW_X = 1920;
|
||||||
@@ -79,20 +83,14 @@ int main() {
|
|||||||
t.create_program();
|
t.create_program();
|
||||||
t.create_buffers();
|
t.create_buffers();
|
||||||
|
|
||||||
// Initialize the raycaster hardware, compat, or software
|
|
||||||
RayCaster *rc = new Hardware_Caster();
|
RayCaster *rc = new Hardware_Caster();
|
||||||
//RayCaster *rc = new Software_Caster();
|
|
||||||
if (rc->init() != 1) {
|
if (rc->init() != 1) {
|
||||||
delete rc;
|
abort();
|
||||||
// rc = new Hardware_Caster_Compat();
|
|
||||||
// if (rc->init() != 0) {
|
|
||||||
// delete rc;
|
|
||||||
// rc = new Software_Caster();
|
|
||||||
// }
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set up the raycaster
|
// Set up the raycaster
|
||||||
|
|
||||||
std::cout << "map...";
|
std::cout << "map...";
|
||||||
sf::Vector3i map_dim(MAP_X, MAP_Y, MAP_Z);
|
sf::Vector3i map_dim(MAP_X, MAP_Y, MAP_Z);
|
||||||
Old_Map* map = new Old_Map(map_dim);
|
Old_Map* map = new Old_Map(map_dim);
|
||||||
@@ -147,8 +145,15 @@ int main() {
|
|||||||
bool mouse_enabled = true;
|
bool mouse_enabled = true;
|
||||||
bool reset = false;
|
bool reset = false;
|
||||||
|
|
||||||
|
|
||||||
|
Input input_handler;
|
||||||
|
input_handler.subscribe(camera, SfEventPublisher::Event_Class::KeyEvent);
|
||||||
|
window.setKeyRepeatEnabled(false);
|
||||||
|
|
||||||
while (window.isOpen()) {
|
while (window.isOpen()) {
|
||||||
|
|
||||||
|
input_handler.consume_events(&window);
|
||||||
|
input_handler.set_flags();
|
||||||
// Poll for events from the user
|
// Poll for events from the user
|
||||||
sf::Event event;
|
sf::Event event;
|
||||||
while (window.pollEvent(event)) {
|
while (window.pollEvent(event)) {
|
||||||
@@ -156,6 +161,15 @@ int main() {
|
|||||||
if (event.type == sf::Event::Closed)
|
if (event.type == sf::Event::Closed)
|
||||||
window.close();
|
window.close();
|
||||||
|
|
||||||
|
if (event.type == sf::Event::KeyPressed) {
|
||||||
|
std::cout << event.key.code << std::endl;
|
||||||
|
}
|
||||||
|
if (event.type == sf::Event::KeyReleased) {
|
||||||
|
std::cout << event.key.code << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if (event.type == sf::Event::KeyPressed) {
|
if (event.type == sf::Event::KeyPressed) {
|
||||||
if (event.key.code == sf::Keyboard::M) {
|
if (event.key.code == sf::Keyboard::M) {
|
||||||
if (mouse_enabled)
|
if (mouse_enabled)
|
||||||
|
|||||||
Reference in New Issue
Block a user