Skip to content

Commit

Permalink
take listener by reference and add Functional wrapper
Browse files Browse the repository at this point in the history
  • Loading branch information
markaren committed Feb 29, 2024
1 parent 9c4e856 commit ef1b5c1
Show file tree
Hide file tree
Showing 6 changed files with 38 additions and 20 deletions.
20 changes: 17 additions & 3 deletions include/threepp/core/EventDispatcher.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
#ifndef THREEPP_EVENTDISPATCHER_HPP
#define THREEPP_EVENTDISPATCHER_HPP

#include <functional>
#include <memory>
#include <string>
#include <unordered_map>
Expand All @@ -24,14 +25,27 @@ namespace threepp {
virtual ~EventListener() = default;
};

struct FunctionalEventListener: EventListener {

FunctionalEventListener(std::function<void(Event)> listener)
: f_(std::move(listener)) {}

void onEvent(Event& event) override {
return f_(event);
}

private:
std::function<void(Event)> f_;
};

class EventDispatcher {

public:
void addEventListener(const std::string& type, EventListener* listener);
void addEventListener(const std::string& type, EventListener& listener);

bool hasEventListener(const std::string& type, const EventListener* listener);
bool hasEventListener(const std::string& type, const EventListener& listener);

void removeEventListener(const std::string& type, const EventListener* listener);
void removeEventListener(const std::string& type, const EventListener& listener);

void dispatchEvent(const std::string& type, void* target = nullptr);

Expand Down
16 changes: 10 additions & 6 deletions src/threepp/core/EventDispatcher.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -6,27 +6,31 @@
using namespace threepp;


void EventDispatcher::addEventListener(const std::string& type, EventListener* listener) {
void EventDispatcher::addEventListener(const std::string& type, EventListener& listener) {

listeners_[type].emplace_back(listener);
listeners_[type].emplace_back(&listener);
}

bool EventDispatcher::hasEventListener(const std::string& type, const EventListener* listener) {
bool EventDispatcher::hasEventListener(const std::string& type, const EventListener& listener) {

if (!listeners_.count(type)) return false;

auto& listenerArray = listeners_.at(type);
return std::find(listenerArray.begin(), listenerArray.end(), listener) != listenerArray.end();
return std::find_if(listenerArray.begin(), listenerArray.end(), [&](auto l) {
return l == &listener;
}) != listenerArray.end();
}

void EventDispatcher::removeEventListener(const std::string& type, const EventListener* listener) {
void EventDispatcher::removeEventListener(const std::string& type, const EventListener& listener) {

if (!listeners_.count(type)) return;

auto& listenerArray = listeners_.at(type);
if (listenerArray.empty()) return;

auto find = std::find(listenerArray.begin(), listenerArray.end(), listener);
auto find = std::find_if(listenerArray.begin(), listenerArray.end(), [&](auto l) {
return l == &listener;
});
if (find != listenerArray.end()) {
listenerArray.erase(find);
}
Expand Down
4 changes: 2 additions & 2 deletions src/threepp/renderers/GLRenderer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ struct GLRenderer::Impl {

auto material = static_cast<Material*>(event.target);

material->removeEventListener("dispose", this);
material->removeEventListener("dispose", *this);

scope_->deallocateMaterial(material);
}
Expand Down Expand Up @@ -609,7 +609,7 @@ struct GLRenderer::Impl {

// new material

material->addEventListener("dispose", &onMaterialDispose);
material->addEventListener("dispose", onMaterialDispose);
}

gl::GLProgram* program = nullptr;
Expand Down
4 changes: 2 additions & 2 deletions src/threepp/renderers/gl/GLGeometries.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ struct GLGeometries::Impl {
scope_->attributes_.remove(value.get());
}

geometry->removeEventListener("dispose", this);
geometry->removeEventListener("dispose", *this);

scope_->geometries_.erase(geometry);

Expand Down Expand Up @@ -84,7 +84,7 @@ struct GLGeometries::Impl {

if (geometries_.count(geometry) && geometries_.at(geometry)) return;

geometry->addEventListener("dispose", &onGeometryDispose_);
geometry->addEventListener("dispose", onGeometryDispose_);

geometries_[geometry] = true;

Expand Down
6 changes: 3 additions & 3 deletions src/threepp/renderers/gl/GLObjects.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ struct GLObjects::Impl {
void onEvent(Event& event) override {
auto instancedMesh = static_cast<InstancedMesh*>(event.target);

instancedMesh->removeEventListener("dispose", this);
instancedMesh->removeEventListener("dispose", *this);

scope->attributes_.remove(instancedMesh->instanceMatrix());

Expand Down Expand Up @@ -67,9 +67,9 @@ struct GLObjects::Impl {

if (auto instancedMesh = object->as<InstancedMesh>()) {

if (!object->hasEventListener("dispose", &onInstancedMeshDispose)) {
if (!object->hasEventListener("dispose", onInstancedMeshDispose)) {

object->addEventListener("dispose", &onInstancedMeshDispose);
object->addEventListener("dispose", onInstancedMeshDispose);
}

attributes_.update(instancedMesh->instanceMatrix(), GL_ARRAY_BUFFER);
Expand Down
8 changes: 4 additions & 4 deletions src/threepp/renderers/gl/GLTextures.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -206,7 +206,7 @@ void gl::GLTextures::initTexture(TextureProperties* textureProperties, Texture&

textureProperties->glInit = true;

texture.addEventListener("dispose", &onTextureDispose_);
texture.addEventListener("dispose", onTextureDispose_);

GLuint glTexture;
glGenTextures(1, &glTexture);
Expand Down Expand Up @@ -501,7 +501,7 @@ void gl::GLTextures::setupRenderTarget(GLRenderTarget* renderTarget) {
auto renderTargetProperties = properties->renderTargetProperties.get(renderTarget->uuid);
auto textureProperties = properties->textureProperties.get(texture->uuid);

renderTarget->addEventListener("dispose", &onRenderTargetDispose_);
renderTarget->addEventListener("dispose", onRenderTargetDispose_);

GLuint glTexture;
glGenTextures(1, &glTexture);
Expand Down Expand Up @@ -574,7 +574,7 @@ void gl::GLTextures::TextureEventListener::onEvent(Event& event) {

auto texture = static_cast<Texture*>(event.target);

texture->removeEventListener("dispose", this);
texture->removeEventListener("dispose", *this);

scope_->deallocateTexture(texture);

Expand All @@ -585,7 +585,7 @@ void gl::GLTextures::RenderTargetEventListener::onEvent(Event& event) {

auto renderTarget = static_cast<GLRenderTarget*>(event.target);

renderTarget->removeEventListener("dispose", this);
renderTarget->removeEventListener("dispose", *this);

scope_->deallocateRenderTarget(renderTarget);
}

0 comments on commit ef1b5c1

Please sign in to comment.