partway through some documentation and bug fixing
This commit is contained in:
@@ -137,19 +137,24 @@ public:
|
|||||||
bool create_texture_atlas(sf::Texture *t, sf::Vector2i tile_dim);
|
bool create_texture_atlas(sf::Texture *t, sf::Vector2i tile_dim);
|
||||||
|
|
||||||
// Check to make sure that the buffers have been initiated and set them as kernel args
|
// Check to make sure that the buffers have been initiated and set them as kernel args
|
||||||
bool validate() ;
|
bool validate();
|
||||||
|
|
||||||
// Aquires the GL objects, runs the kernel, releases back the GL objects
|
// Aquires the GL objects, runs the kernel, releases back the GL objects
|
||||||
bool compute() ;
|
bool compute();
|
||||||
|
|
||||||
// Take the viewport sprite and draw it to the screen
|
// Take the viewport sprite and draw it to the screen
|
||||||
void draw(sf::RenderWindow* window) ;
|
void draw(sf::RenderWindow* window);
|
||||||
|
|
||||||
// Load the saved device config from a file
|
// Load the saved device config from a file
|
||||||
bool load_config();
|
bool load_config();
|
||||||
|
|
||||||
// Save the chosen device config to a file
|
// Save the chosen device config to a file
|
||||||
void save_config();
|
void save_config();
|
||||||
|
|
||||||
|
// Set a
|
||||||
|
void
|
||||||
|
|
||||||
|
|
||||||
// ================================== DEBUG =======================================
|
// ================================== DEBUG =======================================
|
||||||
|
|
||||||
// Re compile the kernel and revalidate the args
|
// Re compile the kernel and revalidate the args
|
||||||
@@ -282,6 +287,7 @@ private:
|
|||||||
// Containers holding the kernels and buffers
|
// Containers holding the kernels and buffers
|
||||||
std::map<std::string, cl_kernel> kernel_map;
|
std::map<std::string, cl_kernel> kernel_map;
|
||||||
std::map<std::string, cl_mem> buffer_map;
|
std::map<std::string, cl_mem> buffer_map;
|
||||||
|
std::vector<std::pair<std::string, unsigned int>> settings_index_map;
|
||||||
std::unordered_map<std::string, std::pair<sf::Sprite, std::unique_ptr<sf::Texture>>> image_map;
|
std::unordered_map<std::string, std::pair<sf::Sprite, std::unique_ptr<sf::Texture>>> image_map;
|
||||||
|
|
||||||
// Hardware caster holds and renders its own textures
|
// Hardware caster holds and renders its own textures
|
||||||
|
|||||||
@@ -6,28 +6,46 @@
|
|||||||
#include <cmath>
|
#include <cmath>
|
||||||
#include "Gui.h"
|
#include "Gui.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* Camera
|
||||||
|
*
|
||||||
|
* Camera provides a convenient way to create 3d vectors and positions which represent a camera. It provides physics
|
||||||
|
* to move the camera around in 3d space as well as impulse and friction control to alter its movement characteristics
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
class Camera : public VrEventSubscriber, private Gui{
|
class Camera : public VrEventSubscriber, private Gui{
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
enum DIRECTION { FORWARD, REARWARD, LEFT, RIGHT, UP, DOWN };
|
enum DIRECTION { FORWARD, REARWARD, LEFT, RIGHT, UP, DOWN };
|
||||||
|
|
||||||
Camera();
|
Camera();
|
||||||
|
// TODO: Remove dependency on getting a window ptr. Instead provide window interface to get and set mouse position
|
||||||
Camera(sf::Vector3f position, sf::Vector2f direction, sf::RenderWindow *window);
|
Camera(sf::Vector3f position, sf::Vector2f direction, sf::RenderWindow *window);
|
||||||
~Camera();
|
~Camera();
|
||||||
|
|
||||||
int set_position(sf::Vector3f position);
|
int set_position(sf::Vector3f position);
|
||||||
|
|
||||||
|
// Apply an incoming impule to the velocity vector
|
||||||
int add_static_impulse(sf::Vector3f impulse);
|
int add_static_impulse(sf::Vector3f impulse);
|
||||||
|
|
||||||
|
// Apply an impulse in one of the 6 relative directions with a certain magnitude
|
||||||
int add_relative_impulse(DIRECTION direction, float speed);
|
int add_relative_impulse(DIRECTION direction, float speed);
|
||||||
|
|
||||||
int slew_camera(sf::Vector2f input);
|
int slew_camera(sf::Vector2f input);
|
||||||
void set_camera(sf::Vector2f input);
|
void set_camera_direction(sf::Vector2f input);
|
||||||
void set_camera(sf::Vector3f input);
|
void set_camera_direction(sf::Vector3f input);
|
||||||
|
|
||||||
int update(double delta_time);
|
int update(double delta_time);
|
||||||
|
|
||||||
void look_at_center();
|
void look_at_center();
|
||||||
|
|
||||||
|
// TODO: Raw ptr's SHARED_PTR with CL, bad idea
|
||||||
sf::Vector2f* get_direction_pointer();
|
sf::Vector2f* get_direction_pointer();
|
||||||
sf::Vector3f* get_position_pointer();
|
sf::Vector3f* get_position_pointer();
|
||||||
sf::Vector3f* get_movement_pointer();
|
sf::Vector3f* get_movement_pointer();
|
||||||
|
|||||||
@@ -3,6 +3,19 @@
|
|||||||
#include <Logger.h>
|
#include <Logger.h>
|
||||||
#include <list>
|
#include <list>
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* GUI
|
||||||
|
*
|
||||||
|
* Any class that wants to have an interactive GUI rendered to the window may
|
||||||
|
* inherit GUI and override the render_gui() and update_gui() methods
|
||||||
|
*
|
||||||
|
* ImGui operations must be completely wrapped in Begins and Ends
|
||||||
|
*
|
||||||
|
* You may enable and disable rendering by setting the 'rendering' flag to true or false
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
class Gui {
|
class Gui {
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|||||||
@@ -7,6 +7,22 @@
|
|||||||
#include "Gui.h"
|
#include "Gui.h"
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* Input
|
||||||
|
*
|
||||||
|
* For each frame the Application must call
|
||||||
|
*
|
||||||
|
* consume_sf_events(*window)
|
||||||
|
* handle_held_keys()
|
||||||
|
* dispatch_events()
|
||||||
|
*
|
||||||
|
* which will pull all the events from the sfml event queue, transpose them over
|
||||||
|
* to vr:events, compare to the last frame and create held key events for keys held
|
||||||
|
* for longer than one frame, and finally dispatch the events to the relevent VrEventListener's
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
class Input : public VrEventPublisher, private Gui{
|
class Input : public VrEventPublisher, private Gui{
|
||||||
public:
|
public:
|
||||||
@@ -14,9 +30,6 @@ public:
|
|||||||
Input();
|
Input();
|
||||||
~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_sf_events(sf::RenderWindow *window);
|
void consume_sf_events(sf::RenderWindow *window);
|
||||||
void consume_vr_events();
|
void consume_vr_events();
|
||||||
|
|
||||||
@@ -33,7 +46,8 @@ private:
|
|||||||
|
|
||||||
std::vector<sf::Keyboard::Key> held_keys;
|
std::vector<sf::Keyboard::Key> held_keys;
|
||||||
std::vector<sf::Mouse::Button> held_mouse_buttons;
|
std::vector<sf::Mouse::Button> held_mouse_buttons;
|
||||||
|
|
||||||
|
// TODO: What the hell was I using these for?
|
||||||
std::vector<bool> keyboard_flags;
|
std::vector<bool> keyboard_flags;
|
||||||
std::vector<bool> mouse_flags;
|
std::vector<bool> mouse_flags;
|
||||||
|
|
||||||
|
|||||||
@@ -4,6 +4,17 @@
|
|||||||
#include "Pub_Sub.h"
|
#include "Pub_Sub.h"
|
||||||
#include <list>
|
#include <list>
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* NetworkInput
|
||||||
|
*
|
||||||
|
* Prototype network joystick, listens to clients connecting to a certain port and reads
|
||||||
|
* packets pertaining to, in the case of the lights, xyz movement. This could in theory
|
||||||
|
* provide a very generic way to listen to network input and generate events from received
|
||||||
|
* packets.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
struct CustomPacket {
|
struct CustomPacket {
|
||||||
|
|
||||||
char data[1024];
|
char data[1024];
|
||||||
|
|||||||
@@ -9,19 +9,24 @@ class VrEventPublisher;
|
|||||||
|
|
||||||
class VrEventSubscriber {
|
class VrEventSubscriber {
|
||||||
public:
|
public:
|
||||||
virtual ~VrEventSubscriber() {};
|
virtual ~VrEventSubscriber();
|
||||||
virtual void recieve_event(VrEventPublisher* publisher, std::unique_ptr<vr::Event> event) = 0;
|
virtual void recieve_event(VrEventPublisher* publisher, std::unique_ptr<vr::Event> event) = 0;
|
||||||
void subscribe_to_publisher(VrEventPublisher* publisher, vr::Event::EventType type);
|
void subscribe_to_publisher(VrEventPublisher* publisher, vr::Event::EventType type);
|
||||||
void subscribe_to_publisher(VrEventPublisher* publisher, std::vector<vr::Event::EventType> type);
|
void subscribe_to_publisher(VrEventPublisher* publisher, std::vector<vr::Event::EventType> type);
|
||||||
|
void unsubscribe(VrEventPublisher* publisher, vr::Event::EventType type);
|
||||||
protected:
|
protected:
|
||||||
std::vector<vr::Event::EventType> subscribed_event_types;
|
|
||||||
|
// When we destroy a subscriber we need to be able to notify the publishers
|
||||||
|
// We have to keep track of every EventType because of the way EventTypes
|
||||||
|
// are mapped to subscribers in the publisher
|
||||||
|
std::map<VrEventPublisher*, std::vector<vr::Event::EventType>> subscriptions;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
class VrEventPublisher {
|
class VrEventPublisher {
|
||||||
public:
|
public:
|
||||||
|
|
||||||
virtual ~VrEventPublisher() {};
|
virtual ~VrEventPublisher();
|
||||||
virtual void subscribe(VrEventSubscriber *subscriber, vr::Event::EventType type);
|
virtual void subscribe(VrEventSubscriber *subscriber, vr::Event::EventType type);
|
||||||
virtual void subscribe(VrEventSubscriber *subscriber, std::vector<vr::Event::EventType> type);
|
virtual void subscribe(VrEventSubscriber *subscriber, std::vector<vr::Event::EventType> type);
|
||||||
virtual void unsubscribe(VrEventSubscriber *s, vr::Event::EventType c);
|
virtual void unsubscribe(VrEventSubscriber *s, vr::Event::EventType c);
|
||||||
|
|||||||
@@ -30,22 +30,22 @@ bool Application::init_clcaster() {
|
|||||||
abort();
|
abort();
|
||||||
|
|
||||||
map = std::make_shared<Map>(MAP_X);
|
map = std::make_shared<Map>(MAP_X);
|
||||||
sf::Image bitmap = map->GenerateHeightBitmap(sf::Vector3i(MAP_X, MAP_Y, MAP_Z));
|
|
||||||
|
// TODO: Implement this
|
||||||
|
sf::Image bitmap = map->GenerateHeightBitmap(sf::Vector3i(MAP_X, MAP_Y, MAP_Z));
|
||||||
map->ApplyHeightmap(bitmap);
|
map->ApplyHeightmap(bitmap);
|
||||||
|
|
||||||
map->octree.CastRayOctree(sf::Vector2f(1.57f, 0.0001f), sf::Vector3f(0.5f, 0.5f, 0.5f));
|
//map->octree.CastRayOctree(sf::Vector2f(1.57f, 0.0001f), sf::Vector3f(0.5f, 0.5f, 0.5f));
|
||||||
|
|
||||||
|
// TODO: Consolidate this to one call
|
||||||
raycaster->assign_octree(map);
|
raycaster->assign_octree(map);
|
||||||
raycaster->assign_map(map);
|
raycaster->assign_map(map);
|
||||||
|
|
||||||
// Create a new camera with (starting position, direction)
|
|
||||||
camera = std::make_shared<Camera>(
|
camera = std::make_shared<Camera>(
|
||||||
sf::Vector3f(3.5f, 3.5f, 3.5f),
|
sf::Vector3f(3.5f, 3.5f, 3.5f), // Starting position
|
||||||
sf::Vector2f(1.57f, 0.0f),
|
sf::Vector2f(1.57f, 0.0f), // Direction
|
||||||
window.get()
|
window.get()
|
||||||
);
|
);
|
||||||
|
|
||||||
// *link* the camera to the GPU
|
|
||||||
raycaster->assign_camera(camera);
|
raycaster->assign_camera(camera);
|
||||||
|
|
||||||
// Generate and send the viewport to the GPU. Also creates the viewport texture
|
// Generate and send the viewport to the GPU. Also creates the viewport texture
|
||||||
@@ -63,7 +63,6 @@ bool Application::init_clcaster() {
|
|||||||
light_handle = light_controller->create_light(prototype);
|
light_handle = light_controller->create_light(prototype);
|
||||||
|
|
||||||
// Load in the spritesheet texture
|
// Load in the spritesheet texture
|
||||||
|
|
||||||
if (!spritesheet.loadFromFile("../assets/textures/minecraft_tiles.png"))
|
if (!spritesheet.loadFromFile("../assets/textures/minecraft_tiles.png"))
|
||||||
Logger::log("Failed to load spritesheet from file", Logger::LogLevel::WARN);
|
Logger::log("Failed to load spritesheet from file", Logger::LogLevel::WARN);
|
||||||
raycaster->create_texture_atlas(&spritesheet, sf::Vector2i(16, 16));
|
raycaster->create_texture_atlas(&spritesheet, sf::Vector2i(16, 16));
|
||||||
|
|||||||
@@ -8,11 +8,10 @@ CLCaster::~CLCaster() {
|
|||||||
//release_camera();
|
//release_camera();
|
||||||
//release_octree();
|
//release_octree();
|
||||||
//clReleaseKernel(kernel_map.at("raycaster"));
|
//clReleaseKernel(kernel_map.at("raycaster"));
|
||||||
// clReleaseProgram()
|
//clReleaseProgram()
|
||||||
//release_viewport();
|
//release_viewport();
|
||||||
|
|
||||||
delete[] viewport_matrix;
|
delete[] viewport_matrix;
|
||||||
delete[] viewport_image;
|
|
||||||
delete[] viewport_image;
|
delete[] viewport_image;
|
||||||
|
|
||||||
camera.reset();
|
camera.reset();
|
||||||
@@ -720,13 +719,19 @@ bool CLCaster::compile_kernel(std::string kernel_source, bool is_path, std::stri
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Try and build the program
|
|
||||||
// "-cl-finite-math-only -cl-fast-relaxed-math -cl-unsafe-math-optimizations"
|
std::stringstream build_string_stream;
|
||||||
|
|
||||||
// need a ref to the oct dimensions
|
// walk the settings index's and add them to the defines
|
||||||
//std::string oct_dimensions = std::to_string(map->getDimensions().x);
|
for (auto i: settings_index_map){
|
||||||
|
build_string_stream << " -D" << i.first << "=" << std::to_string(i.second);
|
||||||
std::string build_string = "-DOCTDIM=" + std::to_string(Application::MAP_X) + " -cl-finite-math-only -cl-fast-relaxed-math -cl-unsafe-math-optimizations";
|
}
|
||||||
|
|
||||||
|
build_string_stream << "-DOCTDIM=" << std::to_string(Application::MAP_X);
|
||||||
|
build_string_stream << " -cl-finite-math-only -cl-fast-relaxed-math -cl-unsafe-math-optimizations";
|
||||||
|
|
||||||
|
std::string build_string = build_string_stream.str();
|
||||||
|
|
||||||
error = clBuildProgram(program, 1, &device_id, build_string.c_str(), NULL, NULL);
|
error = clBuildProgram(program, 1, &device_id, build_string.c_str(), NULL, NULL);
|
||||||
|
|
||||||
// Check to see if it error'd out
|
// Check to see if it error'd out
|
||||||
|
|||||||
@@ -65,11 +65,11 @@ int Camera::slew_camera(sf::Vector2f input) {
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Camera::set_camera(sf::Vector2f input) {
|
void Camera::set_camera_direction(sf::Vector2f input) {
|
||||||
direction = input;
|
direction = input;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Camera::set_camera(sf::Vector3f input) {
|
void Camera::set_camera_direction(sf::Vector3f input) {
|
||||||
direction = CartToNormalizedSphere(input);
|
direction = CartToNormalizedSphere(input);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -101,10 +101,10 @@ void Camera::recieve_event(VrEventPublisher* publisher, std::unique_ptr<vr::Even
|
|||||||
auto held_event = static_cast<vr::KeyHeld*>(event.get());
|
auto held_event = static_cast<vr::KeyHeld*>(event.get());
|
||||||
|
|
||||||
if (held_event->code == sf::Keyboard::LShift) {
|
if (held_event->code == sf::Keyboard::LShift) {
|
||||||
default_impulse = 0.01f;
|
setSpeed(0.01f);
|
||||||
}
|
}
|
||||||
else if (held_event->code == sf::Keyboard::RShift) {
|
else if (held_event->code == sf::Keyboard::RShift) {
|
||||||
default_impulse = 1.0f;
|
setSpeed(0.3f);
|
||||||
}
|
}
|
||||||
else if (held_event->code == sf::Keyboard::C) {
|
else if (held_event->code == sf::Keyboard::C) {
|
||||||
look_at_center();
|
look_at_center();
|
||||||
@@ -151,7 +151,6 @@ void Camera::recieve_event(VrEventPublisher* publisher, std::unique_ptr<vr::Even
|
|||||||
|
|
||||||
vr::MouseMoved *mouse_event = static_cast<vr::MouseMoved*>(event.get());
|
vr::MouseMoved *mouse_event = static_cast<vr::MouseMoved*>(event.get());
|
||||||
|
|
||||||
//deltas = fixed - sf::Mouse::getPosition();
|
|
||||||
deltas = fixed - sf::Vector2i(mouse_event->x, mouse_event->y);
|
deltas = fixed - sf::Vector2i(mouse_event->x, mouse_event->y);
|
||||||
if (deltas != sf::Vector2i(0, 0) && mouse_enabled == true) {
|
if (deltas != sf::Vector2i(0, 0) && mouse_enabled == true) {
|
||||||
|
|
||||||
@@ -271,7 +270,7 @@ sf::Vector2f Camera::get_direction() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void Camera::setSpeed(float speed) {
|
void Camera::setSpeed(float speed) {
|
||||||
default_impulse = speed;;
|
default_impulse = speed;
|
||||||
}
|
}
|
||||||
|
|
||||||
float Camera::getSpeed() {
|
float Camera::getSpeed() {
|
||||||
|
|||||||
@@ -147,7 +147,6 @@ void Input::render_gui() {
|
|||||||
|
|
||||||
for (int i = 0; i < 3; i++) {
|
for (int i = 0; i < 3; i++) {
|
||||||
|
|
||||||
|
|
||||||
float offset = ImGui::GetColumnWidth(i);
|
float offset = ImGui::GetColumnWidth(i);
|
||||||
|
|
||||||
draw_list->AddLine(ImVec2(p.x + 0 + offset * i, p.y + 50), ImVec2(p.x + 100 + offset * i, p.y + 50), col32, 1.0);
|
draw_list->AddLine(ImVec2(p.x + 0 + offset * i, p.y + 50), ImVec2(p.x + 100 + offset * i, p.y + 50), col32, 1.0);
|
||||||
@@ -284,8 +283,7 @@ void Input::transpose_sf_events(std::list<sf::Event> sf_event_queue) {
|
|||||||
break;
|
break;
|
||||||
};
|
};
|
||||||
default: {
|
default: {
|
||||||
std::cout << "Event not recognized";
|
Logger::log("Event not recognized", Logger::LogLevel::WARN);
|
||||||
abort();
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,14 +3,53 @@
|
|||||||
#include "Pub_Sub.h"
|
#include "Pub_Sub.h"
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Subscriber
|
||||||
|
*/
|
||||||
|
|
||||||
|
VrEventSubscriber::~VrEventSubscriber() {
|
||||||
|
|
||||||
|
// Cycles through the publishers we're subscribed to
|
||||||
|
for (auto const& publisher : subscriptions) {
|
||||||
|
|
||||||
|
// And one by one remove the EventTypes we're subscribed to
|
||||||
|
for (auto event_type: publisher.second) {
|
||||||
|
publisher.first->unsubscribe(this, event_type);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void VrEventSubscriber::subscribe_to_publisher(VrEventPublisher* publisher, vr::Event::EventType type) {
|
void VrEventSubscriber::subscribe_to_publisher(VrEventPublisher* publisher, vr::Event::EventType type) {
|
||||||
|
|
||||||
publisher->subscribe(this, type);
|
publisher->subscribe(this, type);
|
||||||
|
|
||||||
|
subscriptions[publisher].push_back(type);
|
||||||
}
|
}
|
||||||
|
|
||||||
void VrEventSubscriber::subscribe_to_publisher(VrEventPublisher* publisher, std::vector<vr::Event::EventType> type) {
|
void VrEventSubscriber::subscribe_to_publisher(VrEventPublisher* publisher, std::vector<vr::Event::EventType> type) {
|
||||||
|
|
||||||
publisher->subscribe(this, type);
|
publisher->subscribe(this, type);
|
||||||
|
|
||||||
|
subscriptions[publisher].insert(subscriptions[publisher].end(), type.begin(), type.end());
|
||||||
|
}
|
||||||
|
|
||||||
|
void VrEventSubscriber::unsubscribe(VrEventPublisher* publisher, vr::Event::EventType type){
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Publisher
|
||||||
|
*/
|
||||||
|
VrEventPublisher::~VrEventPublisher() {
|
||||||
|
|
||||||
|
// Cycle through the subscribers that are listening to us
|
||||||
|
for (auto const& subscriber_bucket : subscribers) {
|
||||||
|
|
||||||
|
// And one by one remove the
|
||||||
|
for (auto subscriber: subscriber_bucket.second){
|
||||||
|
subscriber.
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void VrEventPublisher::subscribe(VrEventSubscriber *subscriber, vr::Event::EventType type) {
|
void VrEventPublisher::subscribe(VrEventSubscriber *subscriber, vr::Event::EventType type) {
|
||||||
@@ -42,3 +81,4 @@ void VrEventPublisher::notify_subscribers(std::unique_ptr<vr::Event> event) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user