diff --git a/examples/objects/sprite.cpp b/examples/objects/sprite.cpp index 3146983d..fdc6e84a 100644 --- a/examples/objects/sprite.cpp +++ b/examples/objects/sprite.cpp @@ -110,7 +110,7 @@ int main() { Sprite* lastPicked = nullptr; canvas.animate([&]() { if (lastPicked) { - lastPicked->material = material; + lastPicked->setMaterial(material); lastPicked->scale.set(1, 1, 1); } @@ -120,12 +120,12 @@ int main() { raycaster.setFromCamera(mouse, *camera); auto intersects = raycaster.intersectObjects(sprites->children, true); if (!intersects.empty()) { - auto& intersection = intersects.front(); + const auto& intersection = intersects.front(); helper->position.copy(intersection.point); helper->visible = true; lastPicked = intersection.object->as(); - lastPicked->material = pickMaterial; + lastPicked->setMaterial(pickMaterial); lastPicked->scale.set(1.2, 1.2, 1.2); } diff --git a/include/threepp/core/Object3D.hpp b/include/threepp/core/Object3D.hpp index 7f82d5f5..c2ead6a1 100644 --- a/include/threepp/core/Object3D.hpp +++ b/include/threepp/core/Object3D.hpp @@ -228,16 +228,6 @@ namespace threepp { return nullptr; } - virtual std::vector materials() { - - return {}; - } - - [[nodiscard]] virtual const Material* material() const { - - return nullptr; - } - template T* as() { diff --git a/include/threepp/helpers/AxesHelper.hpp b/include/threepp/helpers/AxesHelper.hpp index 40305ffc..5d20d4f2 100644 --- a/include/threepp/helpers/AxesHelper.hpp +++ b/include/threepp/helpers/AxesHelper.hpp @@ -11,8 +11,6 @@ namespace threepp { class AxesHelper: public LineSegments { public: - ~AxesHelper() override; - static std::shared_ptr create(float size); protected: diff --git a/include/threepp/helpers/GridHelper.hpp b/include/threepp/helpers/GridHelper.hpp index 51b6d3f6..ccfe7776 100644 --- a/include/threepp/helpers/GridHelper.hpp +++ b/include/threepp/helpers/GridHelper.hpp @@ -12,8 +12,6 @@ namespace threepp { class GridHelper: public LineSegments { public: - ~GridHelper() override; - static std::shared_ptr create( unsigned int size = 10, unsigned int divisions = 10, diff --git a/include/threepp/helpers/PointLightHelper.hpp b/include/threepp/helpers/PointLightHelper.hpp index 95b0337f..ac47e73b 100644 --- a/include/threepp/helpers/PointLightHelper.hpp +++ b/include/threepp/helpers/PointLightHelper.hpp @@ -3,7 +3,6 @@ #ifndef THREEPP_POINTLIGHTHELPER_HPP #define THREEPP_POINTLIGHTHELPER_HPP -#include "threepp/geometries/SphereGeometry.hpp" #include "threepp/objects/Mesh.hpp" #include @@ -22,7 +21,7 @@ namespace threepp { private: std::optional color; - PointLight& light; + PointLight* light; PointLightHelper(PointLight& light, float sphereSize, std::optional color); }; diff --git a/include/threepp/objects/Line.hpp b/include/threepp/objects/Line.hpp index f4fe22a4..cb99da1a 100644 --- a/include/threepp/objects/Line.hpp +++ b/include/threepp/objects/Line.hpp @@ -6,6 +6,7 @@ #include "threepp/core/BufferGeometry.hpp" #include "threepp/core/Object3D.hpp" #include "threepp/materials/Material.hpp" +#include "threepp/objects/ObjectWithMaterials.hpp" #include #include @@ -13,7 +14,7 @@ namespace threepp { - class Line: public Object3D { + class Line: public virtual Object3D, public ObjectWithMaterials { public: Line(std::shared_ptr geometry, std::shared_ptr material); @@ -24,10 +25,6 @@ namespace threepp { void setGeometry(const std::shared_ptr& geometry); - Material* material() override; - - std::vector materials() override; - virtual void computeLineDistances(); void raycast(const Raycaster& raycaster, std::vector& intersects) override; @@ -38,7 +35,6 @@ namespace threepp { protected: std::shared_ptr geometry_; - std::shared_ptr material_; }; }// namespace threepp diff --git a/include/threepp/objects/Mesh.hpp b/include/threepp/objects/Mesh.hpp index 25320295..a76586a3 100644 --- a/include/threepp/objects/Mesh.hpp +++ b/include/threepp/objects/Mesh.hpp @@ -6,16 +6,16 @@ #include "threepp/core/BufferGeometry.hpp" #include "threepp/core/Object3D.hpp" #include "threepp/materials/Material.hpp" +#include "threepp/objects/ObjectWithMaterials.hpp" #include "threepp/objects/ObjectWithMorphTargetInfluences.hpp" namespace threepp { // Class representing triangular polygon mesh based objects. - class Mesh: public Object3D, public ObjectWithMorphTargetInfluences { + class Mesh: public virtual Object3D, public ObjectWithMorphTargetInfluences, public ObjectWithMaterials { public: - explicit Mesh(std::shared_ptr geometry = nullptr, std::shared_ptr material = nullptr); Mesh(std::shared_ptr geometry, std::vector> materials); @@ -34,16 +34,6 @@ namespace threepp { void setGeometry(const std::shared_ptr& geometry); - Material* material() override; - - [[nodiscard]] std::vector materials() override; - - void setMaterial(const std::shared_ptr& material); - - void setMaterials(const std::vector>& materials); - - [[nodiscard]] size_t numMaterials() const; - void raycast(const Raycaster& raycaster, std::vector& intersects) override; std::shared_ptr clone(bool recursive = true) override; @@ -60,7 +50,6 @@ namespace threepp { protected: std::shared_ptr geometry_; - std::vector> materials_; }; }// namespace threepp diff --git a/include/threepp/objects/ObjectWithMaterials.hpp b/include/threepp/objects/ObjectWithMaterials.hpp new file mode 100644 index 00000000..7fc803f4 --- /dev/null +++ b/include/threepp/objects/ObjectWithMaterials.hpp @@ -0,0 +1,34 @@ + +#ifndef THREEPP_OBJECTWITHMATERIALS_HPP +#define THREEPP_OBJECTWITHMATERIALS_HPP + +#include "threepp/core/Object3D.hpp" +#include "threepp/materials/Material.hpp" + + +#include + +namespace threepp { + + class ObjectWithMaterials: public virtual Object3D { + + public: + Material* material() override; + + void setMaterial(const std::shared_ptr& material); + + std::vector materials(); + + void setMaterials(const std::vector>& materials); + + [[nodiscard]] size_t numMaterials() const; + + protected: + std::vector> materials_; + + explicit ObjectWithMaterials(std::vector> materials); + }; + +}// namespace threepp + +#endif//THREEPP_OBJECTWITHMATERIALS_HPP diff --git a/include/threepp/objects/ObjectWithMorphTargetInfluences.hpp b/include/threepp/objects/ObjectWithMorphTargetInfluences.hpp index 50ec359d..dc2f73a0 100644 --- a/include/threepp/objects/ObjectWithMorphTargetInfluences.hpp +++ b/include/threepp/objects/ObjectWithMorphTargetInfluences.hpp @@ -2,12 +2,15 @@ #ifndef THREEPP_OBJECTWITHMORPHTARGETINFLUENCES_HPP #define THREEPP_OBJECTWITHMORPHTARGETINFLUENCES_HPP +#include "threepp/core/Object3D.hpp" + #include namespace threepp { - struct ObjectWithMorphTargetInfluences { + class ObjectWithMorphTargetInfluences: public virtual Object3D { + public: std::vector& morphTargetInfluences() { if (copyMorphTargetInfluences_) { diff --git a/include/threepp/objects/Points.hpp b/include/threepp/objects/Points.hpp index ec444466..8f14ea05 100644 --- a/include/threepp/objects/Points.hpp +++ b/include/threepp/objects/Points.hpp @@ -6,11 +6,12 @@ #include "threepp/core/BufferGeometry.hpp" #include "threepp/core/Object3D.hpp" #include "threepp/materials/PointsMaterial.hpp" +#include "threepp/objects/ObjectWithMaterials.hpp" #include "threepp/objects/ObjectWithMorphTargetInfluences.hpp" namespace threepp { - class Points: public Object3D, public ObjectWithMorphTargetInfluences { + class Points: public virtual Object3D, public ObjectWithMorphTargetInfluences, public ObjectWithMaterials { public: Points(std::shared_ptr geometry, std::shared_ptr material); @@ -21,10 +22,6 @@ namespace threepp { void setGeometry(const std::shared_ptr& geometry); - Material* material() override; - - std::vector materials() override; - std::shared_ptr clone(bool recursive = true) override; void raycast(const Raycaster& raycaster, std::vector& intersects) override; @@ -35,7 +32,6 @@ namespace threepp { protected: std::shared_ptr geometry_; - std::shared_ptr material_; }; }// namespace threepp diff --git a/include/threepp/objects/Sprite.hpp b/include/threepp/objects/Sprite.hpp index 35e5aa51..7379ada7 100644 --- a/include/threepp/objects/Sprite.hpp +++ b/include/threepp/objects/Sprite.hpp @@ -13,7 +13,6 @@ namespace threepp { public: Vector2 center{0.5f, 0.5f}; - std::shared_ptr material; explicit Sprite(const std::shared_ptr& material); @@ -23,10 +22,15 @@ namespace threepp { BufferGeometry* geometry() override; - static std::shared_ptr create(const std::shared_ptr& material = SpriteMaterial::create()); + Material* material() override; + + void setMaterial(const std::shared_ptr& material); + + static std::shared_ptr create(const std::shared_ptr& material = nullptr); private: std::shared_ptr _geometry; + std::shared_ptr _material; }; }// namespace threepp diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 406622e6..05665a6f 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -150,6 +150,7 @@ set(publicHeaders "threepp/objects/LineSegments.hpp" "threepp/objects/LOD.hpp" "threepp/objects/Mesh.hpp" + "threepp/objects/ObjectWithMaterials.hpp" "threepp/objects/ObjectWithMorphTargetInfluences.hpp" "threepp/objects/ParticleSystem.hpp" "threepp/objects/Sky.hpp" @@ -371,6 +372,7 @@ set(sources "threepp/objects/LOD.cpp" "threepp/objects/InstancedMesh.cpp" "threepp/objects/Mesh.cpp" + "threepp/objects/ObjectWithMaterials.cpp" "threepp/objects/ParticleSystem.cpp" "threepp/objects/Points.cpp" "threepp/objects/Skeleton.cpp" diff --git a/src/threepp/helpers/AxesHelper.cpp b/src/threepp/helpers/AxesHelper.cpp index 0b8a8eab..a10050c6 100644 --- a/src/threepp/helpers/AxesHelper.cpp +++ b/src/threepp/helpers/AxesHelper.cpp @@ -20,16 +20,10 @@ AxesHelper::AxesHelper(float size): LineSegments(BufferGeometry::create(), LineB geometry_->setAttribute("position", FloatBufferAttribute::create(vertices, 3)); geometry_->setAttribute("color", FloatBufferAttribute::create(colors, 3)); - material_->vertexColors = true; + materials_.front()->vertexColors = true; } std::shared_ptr AxesHelper::create(float size) { return std::shared_ptr(new AxesHelper(size)); } - -AxesHelper::~AxesHelper() { - - this->geometry_->dispose(); - this->material_->dispose(); -} diff --git a/src/threepp/helpers/Box3Helper.cpp b/src/threepp/helpers/Box3Helper.cpp index b6ca5efc..e8a9c1a7 100644 --- a/src/threepp/helpers/Box3Helper.cpp +++ b/src/threepp/helpers/Box3Helper.cpp @@ -13,7 +13,7 @@ Box3Helper::Box3Helper(const Box3& box, const Color& color) std::vector positions{1, 1, 1, -1, 1, 1, -1, -1, 1, 1, -1, 1, 1, 1, -1, -1, 1, -1, -1, -1, -1, 1, -1, -1}; - auto lineMaterial = material_->as(); + auto lineMaterial = material()->as(); lineMaterial->color.copy(color); lineMaterial->toneMapped = false; diff --git a/src/threepp/helpers/BoxHelper.cpp b/src/threepp/helpers/BoxHelper.cpp index 177f3e57..31c31170 100644 --- a/src/threepp/helpers/BoxHelper.cpp +++ b/src/threepp/helpers/BoxHelper.cpp @@ -16,7 +16,7 @@ BoxHelper::BoxHelper(Object3D& object, const Color& color) geometry_->setIndex(indices); geometry_->setAttribute("position", FloatBufferAttribute::create(positions, 3)); - material_->setValues({{"color", color}, {"toneMapped", false}}); + material()->setValues({{"color", color}, {"toneMapped", false}}); this->matrixAutoUpdate = false; diff --git a/src/threepp/helpers/CameraHelper.cpp b/src/threepp/helpers/CameraHelper.cpp index 107e80b9..abd7df81 100644 --- a/src/threepp/helpers/CameraHelper.cpp +++ b/src/threepp/helpers/CameraHelper.cpp @@ -18,7 +18,7 @@ struct CameraHelper::Impl { explicit Impl(CameraHelper& scope, Camera& camera) : scope(scope), camera(camera) { - auto m = scope.material_->as(); + auto m = scope.material()->as(); m->toneMapped = false; m->vertexColors = true; m->color = 0xffffff; diff --git a/src/threepp/helpers/GridHelper.cpp b/src/threepp/helpers/GridHelper.cpp index ee63bfd9..8254bde1 100644 --- a/src/threepp/helpers/GridHelper.cpp +++ b/src/threepp/helpers/GridHelper.cpp @@ -37,25 +37,15 @@ GridHelper::GridHelper(unsigned int size, unsigned int divisions, const Color& c k += step; } - auto geometry = BufferGeometry::create(); - geometry->setAttribute("position", FloatBufferAttribute::create(vertices, 3)); - geometry->setAttribute("color", FloatBufferAttribute::create(colors, 3)); + geometry_->setAttribute("position", FloatBufferAttribute::create(vertices, 3)); + geometry_->setAttribute("color", FloatBufferAttribute::create(colors, 3)); - auto material = LineBasicMaterial::create(); - material->vertexColors = true; - material->toneMapped = false; - - material_ = material; - geometry_ = geometry; + auto m = material()->as(); + m->vertexColors = true; + m->toneMapped = false; } std::shared_ptr GridHelper::create(unsigned int size, unsigned int divisions, const Color& color1, const Color& color2) { return std::shared_ptr(new GridHelper(size, divisions, color1, color2)); } - -GridHelper::~GridHelper() { - - this->geometry_->dispose(); - this->material_->dispose(); -} diff --git a/src/threepp/helpers/HemisphereLightHelper.cpp b/src/threepp/helpers/HemisphereLightHelper.cpp index 5cab170b..8888f487 100644 --- a/src/threepp/helpers/HemisphereLightHelper.cpp +++ b/src/threepp/helpers/HemisphereLightHelper.cpp @@ -110,4 +110,4 @@ std::shared_ptr threepp::HemisphereLightHelper::create(He return std::shared_ptr(new HemisphereLightHelper(light, size, color)); } -threepp::HemisphereLightHelper::~HemisphereLightHelper() = default; +HemisphereLightHelper::~HemisphereLightHelper() = default; diff --git a/src/threepp/helpers/PlaneHelper.cpp b/src/threepp/helpers/PlaneHelper.cpp index 753bb131..529a9d8e 100644 --- a/src/threepp/helpers/PlaneHelper.cpp +++ b/src/threepp/helpers/PlaneHelper.cpp @@ -15,9 +15,9 @@ PlaneHelper::PlaneHelper(const Plane& plane, float size, const Color& color) geometry_->setAttribute("position", FloatBufferAttribute::create(positions, 3)); geometry_->computeBoundingSphere(); - auto material = dynamic_cast(material_.get()); - material->color.copy(color); - material->toneMapped = false; + auto _material = material()->as(); + _material->color.copy(color); + _material->toneMapped = false; std::vector positions2{1, 1, 1, -1, 1, 1, -1, -1, 1, 1, 1, 1, -1, -1, 1, 1, -1, 1}; diff --git a/src/threepp/helpers/PointLightHelper.cpp b/src/threepp/helpers/PointLightHelper.cpp index 919e919d..cd1e044a 100644 --- a/src/threepp/helpers/PointLightHelper.cpp +++ b/src/threepp/helpers/PointLightHelper.cpp @@ -1,6 +1,7 @@ #include "threepp/helpers/PointLightHelper.hpp" +#include "threepp/geometries/SphereGeometry.hpp" #include "threepp/lights/PointLight.hpp" #include "threepp/materials/MeshBasicMaterial.hpp" @@ -8,7 +9,7 @@ using namespace threepp; PointLightHelper::PointLightHelper(PointLight& light, float sphereSize, std::optional color) - : Mesh(nullptr, nullptr), light(light), color(color) { + : Mesh(nullptr, nullptr), light(&light), color(color) { geometry_ = SphereGeometry::create(sphereSize, 4, 2); @@ -18,9 +19,9 @@ PointLightHelper::PointLightHelper(PointLight& light, float sphereSize, std::opt material->toneMapped = false; this->materials_[0] = std::move(material); - this->light.updateMatrixWorld(); + this->light->updateMatrixWorld(); - this->matrix = this->light.matrixWorld; + this->matrix = this->light->matrixWorld; this->matrixAutoUpdate = false; update(); @@ -39,6 +40,6 @@ void PointLightHelper::update() { } else { - this->material()->as()->color.copy(this->light.color); + this->material()->as()->color.copy(this->light->color); } } diff --git a/src/threepp/helpers/PolarGridHelper.cpp b/src/threepp/helpers/PolarGridHelper.cpp index 5e5cc8b9..841054ed 100644 --- a/src/threepp/helpers/PolarGridHelper.cpp +++ b/src/threepp/helpers/PolarGridHelper.cpp @@ -70,7 +70,7 @@ PolarGridHelper::PolarGridHelper(float radius, unsigned int sectors, unsigned in geometry_->setAttribute("position", FloatBufferAttribute::create(vertices, 3)); geometry_->setAttribute("color", FloatBufferAttribute::create(colors, 3)); - material_->setValues({{"vertexColors", true}, {"toneMapped", false}}); + material()->setValues({{"vertexColors", true}, {"toneMapped", false}}); } diff --git a/src/threepp/helpers/SkeletonHelper.cpp b/src/threepp/helpers/SkeletonHelper.cpp index 6191d86f..9953b329 100644 --- a/src/threepp/helpers/SkeletonHelper.cpp +++ b/src/threepp/helpers/SkeletonHelper.cpp @@ -55,7 +55,7 @@ SkeletonHelper::SkeletonHelper(Object3D& object) geometry_->setAttribute("position", FloatBufferAttribute::create(vertices, 3)); geometry_->setAttribute("color", FloatBufferAttribute::create(colors, 3)); - auto m = material_->as(); + auto m = material()->as(); m->vertexColors = true; m->depthTest = false; m->depthWrite = false; diff --git a/src/threepp/objects/Line.cpp b/src/threepp/objects/Line.cpp index 3e9041e8..1daeadf5 100644 --- a/src/threepp/objects/Line.cpp +++ b/src/threepp/objects/Line.cpp @@ -20,7 +20,7 @@ namespace { Line::Line(std::shared_ptr geometry, std::shared_ptr material) : geometry_(geometry ? std::move(geometry) : BufferGeometry::create()), - material_(material ? std::move(material) : LineBasicMaterial::create()) {} + ObjectWithMaterials({material ? std::move(material) : LineBasicMaterial::create()}) {} std::string Line::type() const { @@ -36,18 +36,8 @@ void Line::setGeometry(const std::shared_ptr& geometry) { this->geometry_ = geometry; } -Material* Line::material() { - - return material_.get(); -} - -std::vector Line::materials() { - - return {material_.get()}; -} - std::shared_ptr Line::clone(bool recursive) { - auto clone = create(geometry_, material_); + auto clone = create(geometry_, materials_.front()); clone->copy(*this, recursive); return clone; diff --git a/src/threepp/objects/Mesh.cpp b/src/threepp/objects/Mesh.cpp index 46a61e76..1b494ea3 100644 --- a/src/threepp/objects/Mesh.cpp +++ b/src/threepp/objects/Mesh.cpp @@ -174,24 +174,14 @@ namespace { Mesh::Mesh(std::shared_ptr geometry, std::shared_ptr material) : geometry_(geometry ? std::move(geometry) : BufferGeometry::create()), - materials_{material ? std::move(material) : MeshBasicMaterial::create()} { -} + ObjectWithMaterials({material ? std::move(material) : MeshBasicMaterial::create()}) {} Mesh::Mesh(std::shared_ptr geometry, std::vector> materials) - : geometry_(std::move(geometry)), materials_{std::move(materials)} { + : geometry_(std::move(geometry)), ObjectWithMaterials{std::move(materials)} { } -Mesh::Mesh(Mesh&& other) noexcept: Object3D(std::move(other)) { +Mesh::Mesh(Mesh&& other) noexcept: Object3D(std::move(other)), ObjectWithMaterials(std::move(other)) { geometry_ = std::move(other.geometry_); - materials_ = std::move(other.materials_); -} - -std::vector Mesh::materials() { - - std::vector res(materials_.size()); - std::transform(materials_.begin(), materials_.end(), res.begin(), [](auto& m) { return m.get(); }); - - return res; } void Mesh::raycast(const Raycaster& raycaster, std::vector& intersects) { @@ -375,26 +365,6 @@ void Mesh::setGeometry(const std::shared_ptr& geometry) { geometry_ = geometry; } -Material* Mesh::material() { - - return materials_.front().get(); -} - -void Mesh::setMaterial(const std::shared_ptr& material) { - - setMaterials({material}); -} - -void Mesh::setMaterials(const std::vector>& materials) { - - materials_ = materials; -} - -size_t Mesh::numMaterials() const { - - return materials_.size(); -} - std::shared_ptr Mesh::create(std::shared_ptr geometry, std::shared_ptr material) { return std::make_shared(std::move(geometry), std::move(material)); diff --git a/src/threepp/objects/ObjectWithMaterials.cpp b/src/threepp/objects/ObjectWithMaterials.cpp new file mode 100644 index 00000000..9a6191cf --- /dev/null +++ b/src/threepp/objects/ObjectWithMaterials.cpp @@ -0,0 +1,38 @@ + +#include "threepp/objects/ObjectWithMaterials.hpp" + +#include + +using namespace threepp; + + +ObjectWithMaterials::ObjectWithMaterials(std::vector> materials) + : materials_(std::move(materials)) {} + + +Material* ObjectWithMaterials::material() { + + return materials_.front().get(); +} + +void ObjectWithMaterials::setMaterial(const std::shared_ptr& material) { + + setMaterials({material}); +} + +std::vector ObjectWithMaterials::materials() { + std::vector res(materials_.size()); + std::transform(materials_.begin(), materials_.end(), res.begin(), [](auto& m) { return m.get(); }); + + return res; +} + +void ObjectWithMaterials::setMaterials(const std::vector>& materials) { + + this->materials_ = materials; +} + +size_t ObjectWithMaterials::numMaterials() const { + + return materials_.size(); +} diff --git a/src/threepp/objects/Points.cpp b/src/threepp/objects/Points.cpp index 240e663c..4197b3f1 100644 --- a/src/threepp/objects/Points.cpp +++ b/src/threepp/objects/Points.cpp @@ -49,8 +49,7 @@ namespace { }// namespace Points::Points(std::shared_ptr geometry, std::shared_ptr material) - : geometry_(std::move(geometry)), material_(std::move(material)) { -} + : geometry_(std::move(geometry)), ObjectWithMaterials({std::move(material)}) {} std::string Points::type() const { @@ -66,18 +65,8 @@ void Points::setGeometry(const std::shared_ptr& geometry) { this->geometry_ = geometry; } -Material* Points::material() { - - return material_.get(); -} - -std::vector Points::materials() { - - return {material_.get()}; -} - std::shared_ptr Points::clone(bool recursive) { - auto clone = create(geometry_, material_); + auto clone = create(geometry_, materials_.front()); clone->copy(*this, recursive); return clone; diff --git a/src/threepp/objects/Sprite.cpp b/src/threepp/objects/Sprite.cpp index 2f56cd96..19cb610d 100644 --- a/src/threepp/objects/Sprite.cpp +++ b/src/threepp/objects/Sprite.cpp @@ -63,8 +63,8 @@ namespace { Sprite::Sprite(const std::shared_ptr& material) - : material(material), - _geometry(new BufferGeometry()) { + : _material(material ? material : SpriteMaterial::create()), + _geometry(BufferGeometry::create()) { std::vector float32Array{ -0.5f, -0.5f, 0.f, 0.f, 0.f, @@ -83,6 +83,16 @@ std::string Sprite::type() const { return "Sprite"; } +Material* Sprite::material() { + + return _material.get(); +} + +void Sprite::setMaterial(const std::shared_ptr& material) { + + this->_material = material; +} + BufferGeometry* Sprite::geometry() { return _geometry.get(); @@ -107,12 +117,12 @@ void Sprite::raycast(const Raycaster& raycaster, std::vector& inte _mvPosition.setFromMatrixPosition(this->modelViewMatrix); - if (raycaster.camera->is() && !this->material->sizeAttenuation) { + if (raycaster.camera->is() && !this->_material->sizeAttenuation) { _worldScale.multiplyScalar(-_mvPosition.z); } - float rotation = material->rotation; + float rotation = _material->rotation; std::optional> sincos; if (rotation != 0) { diff --git a/src/threepp/renderers/GLRenderer.cpp b/src/threepp/renderers/GLRenderer.cpp index cbf39b03..2fe97ce1 100644 --- a/src/threepp/renderers/GLRenderer.cpp +++ b/src/threepp/renderers/GLRenderer.cpp @@ -480,12 +480,12 @@ struct GLRenderer::Impl { .applyMatrix4(_projScreenMatrix); } - auto geometry = objects.update(object); - auto material = sprite->material; + const auto geometry = objects.update(object); + const auto material = sprite->material(); if (material->visible) { - currentRenderList->push(object, geometry, material.get(), groupOrder, _vector3.z, std::nullopt); + currentRenderList->push(object, geometry, material, groupOrder, _vector3.z, std::nullopt); } } @@ -511,7 +511,7 @@ struct GLRenderer::Impl { } auto geometry = objects.update(object); - const auto& materials = object->materials(); + const auto& materials = object->as()->materials(); if (materials.size() > 1) { diff --git a/src/threepp/renderers/gl/GLShadowMap.cpp b/src/threepp/renderers/gl/GLShadowMap.cpp index a2395051..7eebe2b9 100644 --- a/src/threepp/renderers/gl/GLShadowMap.cpp +++ b/src/threepp/renderers/gl/GLShadowMap.cpp @@ -213,7 +213,7 @@ struct GLShadowMap::Impl { object->modelViewMatrix.multiplyMatrices(shadowCamera->matrixWorldInverse, *object->matrixWorld); const auto geometry = _objects.update(object); - const auto material = object->materials(); + const auto material = object->as()->materials(); if (material.size() > 1) {