From 5648ba63b3f40a895b2414c905d82e43bfbccdcf Mon Sep 17 00:00:00 2001 From: Danny Robson Date: Thu, 11 Jun 2015 19:33:25 +1000 Subject: [PATCH] n/basis: add runtime switchable basis function --- Makefile.am | 6 ++-- noise/basis/runtime.cpp | 20 +++++++++++ noise/basis/runtime.hpp | 80 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 104 insertions(+), 2 deletions(-) create mode 100644 noise/basis/runtime.cpp create mode 100644 noise/basis/runtime.hpp diff --git a/Makefile.am b/Makefile.am index 5ce14be5..e2e7522f 100644 --- a/Makefile.am +++ b/Makefile.am @@ -146,10 +146,12 @@ UTIL_FILES = \ noise/basis/constant.cpp \ noise/basis/constant.hpp \ noise/basis/constant.ipp \ - noise/basis/value.hpp \ - noise/basis/value.ipp \ noise/basis/perlin.hpp \ noise/basis/perlin.ipp \ + noise/basis/runtime.cpp \ + noise/basis/runtime.hpp \ + noise/basis/value.hpp \ + noise/basis/value.ipp \ noise/basis/worley.hpp \ noise/basis/worley.ipp \ noise/fractal/base.hpp \ diff --git a/noise/basis/runtime.cpp b/noise/basis/runtime.cpp new file mode 100644 index 00000000..2e16eff8 --- /dev/null +++ b/noise/basis/runtime.cpp @@ -0,0 +1,20 @@ +/* + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Copyright 2012-2015 Danny Robson + */ + +#include "runtime.hpp" + + +template struct util::noise::basis::runtime; diff --git a/noise/basis/runtime.hpp b/noise/basis/runtime.hpp new file mode 100644 index 00000000..9b92d7d1 --- /dev/null +++ b/noise/basis/runtime.hpp @@ -0,0 +1,80 @@ +/* + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Copyright 2012-2015 Danny Robson + */ + + +#ifndef __UTIL_NOISE_BASIS_RUNTIME_HPP +#define __UTIL_NOISE_BASIS_RUNTIME_HPP + +#include "../basis.hpp" +#include "../../point.hpp" +#include "../../range.hpp" + +#include + +namespace util { namespace noise { namespace basis { + template + struct runtime { + public: + runtime (seed_t) {} + runtime (runtime&&) = default; + runtime (const runtime&) = delete; + runtime& operator= (const runtime&) = delete; + + // basis functions + T operator () (util::point<2,T> p) const { return (*m_child) (p); } + range bounds (void) const { return m_child->bounds (); } + + seed_t seed (void) const { return m_child->seed (); } + seed_t seed (seed_t) { return m_child->seed (); } + + private: + struct base { + virtual ~base () = default; + virtual T operator() (util::point<2,T>) const = 0; + virtual range bounds (void) const = 0; + virtual seed_t seed (void) const = 0; + virtual seed_t seed (seed_t) = 0; + }; + + template + struct child : public base { + child (seed_t _seed): data (_seed) { } + virtual T operator() (util::point<2,T> p) const override { return data (p); } + virtual range bounds (void) const override { return data.bounds (); } + virtual seed_t seed (void) const override { return data.seed (); } + virtual seed_t seed (seed_t _seed) override { return data.seed (_seed); } + + private: + B data; + }; + + std::unique_ptr m_child; + + public: + template + void + reset (seed_t _seed) + { + using basis_t = B; + using child_t = child; + + m_child.reset (new child_t (_seed)); + } + }; +} } } + +#endif +