From 72dd50e0d2f9274c462c576d2cb1539f74dea188 Mon Sep 17 00:00:00 2001 From: Joshua Moerman Date: Fri, 2 Sep 2011 22:16:46 +0200 Subject: [PATCH] Added interpolator(s) Added std::array (from tr1) More Groups --- J.xcodeproj/project.pbxproj | 37 +++++++++-- J/J.h | 4 ++ J/array.h | 18 ++++++ J/interpolator.h | 119 ++++++++++++++++++++++++++++++++++++ 4 files changed, 173 insertions(+), 5 deletions(-) create mode 100644 J/array.h create mode 100644 J/interpolator.h diff --git a/J.xcodeproj/project.pbxproj b/J.xcodeproj/project.pbxproj index f165691..a18e102 100644 --- a/J.xcodeproj/project.pbxproj +++ b/J.xcodeproj/project.pbxproj @@ -14,6 +14,8 @@ 425E9E02140A96C400A81A65 /* J.h in Headers */ = {isa = PBXBuildFile; fileRef = 4268136D140A321800CBF943 /* J.h */; settings = {ATTRIBUTES = (Public, ); }; }; 42681369140A321800CBF943 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 42681368140A321800CBF943 /* Foundation.framework */; }; 4268136F140A321800CBF943 /* J.mm in Sources */ = {isa = PBXBuildFile; fileRef = 4268136E140A321800CBF943 /* J.mm */; }; + 4283A45F14115AC400036A5D /* interpolator.h in Headers */ = {isa = PBXBuildFile; fileRef = 4283A45E14115AC300036A5D /* interpolator.h */; }; + 4283A4641411707700036A5D /* array.h in Headers */ = {isa = PBXBuildFile; fileRef = 4283A4631411707700036A5D /* array.h */; }; 42ED6A6B140A380000402F76 /* fbo.h in Headers */ = {isa = PBXBuildFile; fileRef = 42ED6A68140A380000402F76 /* fbo.h */; }; 42ED6A6C140A380000402F76 /* shader.h in Headers */ = {isa = PBXBuildFile; fileRef = 42ED6A69140A380000402F76 /* shader.h */; }; 42ED6A6D140A380000402F76 /* to_string.h in Headers */ = {isa = PBXBuildFile; fileRef = 42ED6A6A140A380000402F76 /* to_string.h */; }; @@ -29,6 +31,8 @@ 4268136C140A321800CBF943 /* J-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "J-Prefix.pch"; sourceTree = ""; }; 4268136D140A321800CBF943 /* J.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = J.h; sourceTree = ""; }; 4268136E140A321800CBF943 /* J.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = J.mm; sourceTree = ""; }; + 4283A45E14115AC300036A5D /* interpolator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = interpolator.h; sourceTree = ""; }; + 4283A4631411707700036A5D /* array.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = array.h; sourceTree = ""; }; 42ED6A68140A380000402F76 /* fbo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fbo.h; sourceTree = ""; }; 42ED6A69140A380000402F76 /* shader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = shader.h; sourceTree = ""; }; 42ED6A6A140A380000402F76 /* to_string.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = to_string.h; sourceTree = ""; }; @@ -51,6 +55,7 @@ isa = PBXGroup; children = ( 42ED6A6A140A380000402F76 /* to_string.h */, + 4283A4631411707700036A5D /* array.h */, ); name = std; path = J; @@ -87,11 +92,8 @@ 4268136A140A321800CBF943 /* J */ = { isa = PBXGroup; children = ( - 425E9DF1140A74DA00A81A65 /* basic.h */, - 425E9DF5140A774D00A81A65 /* basic.cpp */, - 42ED6A68140A380000402F76 /* fbo.h */, - 425E9DF8140A7EB400A81A65 /* fbo.mm */, - 42ED6A69140A380000402F76 /* shader.h */, + 4283A46114115AD400036A5D /* GL */, + 4283A46214116ECB00036A5D /* utils */, 4268136D140A321800CBF943 /* J.h */, 4268136E140A321800CBF943 /* J.mm */, ); @@ -107,6 +109,26 @@ path = J; sourceTree = ""; }; + 4283A46114115AD400036A5D /* GL */ = { + isa = PBXGroup; + children = ( + 425E9DF1140A74DA00A81A65 /* basic.h */, + 425E9DF5140A774D00A81A65 /* basic.cpp */, + 42ED6A68140A380000402F76 /* fbo.h */, + 425E9DF8140A7EB400A81A65 /* fbo.mm */, + 42ED6A69140A380000402F76 /* shader.h */, + ); + name = GL; + sourceTree = ""; + }; + 4283A46214116ECB00036A5D /* utils */ = { + isa = PBXGroup; + children = ( + 4283A45E14115AC300036A5D /* interpolator.h */, + ); + name = utils; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXHeadersBuildPhase section */ @@ -119,6 +141,8 @@ 42ED6A6C140A380000402F76 /* shader.h in Headers */, 42ED6A6D140A380000402F76 /* to_string.h in Headers */, 425E9DF2140A74DA00A81A65 /* basic.h in Headers */, + 4283A45F14115AC400036A5D /* interpolator.h in Headers */, + 4283A4641411707700036A5D /* array.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -225,6 +249,7 @@ isa = XCBuildConfiguration; buildSettings = { DSTROOT = /tmp/J.dst; + GCC_DEBUGGING_SYMBOLS = full; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "J/J-Prefix.pch"; OTHER_LDFLAGS = "-ObjC"; @@ -236,7 +261,9 @@ 42681374140A321800CBF943 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { + COPY_PHASE_STRIP = NO; DSTROOT = /tmp/J.dst; + GCC_DEBUGGING_SYMBOLS = full; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "J/J-Prefix.pch"; OTHER_LDFLAGS = "-ObjC"; diff --git a/J/J.h b/J/J.h index 72a178e..db9a282 100644 --- a/J/J.h +++ b/J/J.h @@ -8,6 +8,10 @@ #import +#import "to_string.h" +#import "array.h" + #import "shader.h" #import "fbo.h" +#import "interpolator.h" diff --git a/J/array.h b/J/array.h new file mode 100644 index 0000000..577458c --- /dev/null +++ b/J/array.h @@ -0,0 +1,18 @@ +// +// array.h +// J +// +// Created by Joshua Moerman on 9/2/11. +// Copyright 2011 Vadovas. All rights reserved. +// + +#ifndef J_array_h +#define J_array_h + +#include + +namespace std { + using tr1::array; +} + +#endif diff --git a/J/interpolator.h b/J/interpolator.h new file mode 100644 index 0000000..071cde9 --- /dev/null +++ b/J/interpolator.h @@ -0,0 +1,119 @@ +// +// interpolator.h +// J +// +// Created by Joshua Moerman on 9/2/11. +// Copyright 2011 Vadovas. All rights reserved. +// + +#ifndef J_interpolator_h +#define J_interpolator_h + +#include + +namespace J { + +namespace interpolators { + struct linear{ + template + T operator()(T x){ + return x; + } + }; + + struct cubic_in_out{ + template + T operator()(T x){ + return 3*x*x - 2*x*x*x; + } + }; + + struct quintic_in_out{ + template + T operator()(T x){ + return 6*x*x*x*x*x - 15*x*x*x*x + 10*x*x*x; + return x*x*x*(x*(x*6-15)+10); + } + }; + + struct cosine_in_out{ + template + T operator()(T x){ + return 0.5f - 0.5f*std::cos(x*M_PI); + } + }; +} + +template +class interpolator { + + std::tr1::function ease_function; + + size_t length; + size_t steps; + + T value; + T begin_value; + T end_value; + +public: + + interpolator(T begin_value_ = T(0), size_t length_ = 100) : + ease_function(interpolators::cubic_in_out()) + , length(length_) + , steps(0) + , value(begin_value_) + , begin_value(begin_value_) + , end_value(begin_value_) {} + + template + interpolator(T begin_value_, size_t length_, F ease_function_) : + ease_function(ease_function_) + , length(length_) + , steps(0) + , value(begin_value_) + , begin_value(begin_value_) + , end_value(begin_value_) {} + + operator T&(){ + return value; + } + + operator T const () const{ + return value; + } + + void set_value(T new_value){ + begin_value = value; + end_value = new_value; + steps = 0; + } + + void set_length(size_t new_length){ + T ratio = (T) steps / (T) length; + length = new_length; + steps = ratio*length; + } + + template + void set_ease_function(F new_ease_function){ + ease_function = new_ease_function; + } + + void interpolate(){ + if(steps >= length) return; + ++steps; + T ratio = (T) steps / (T) length; + ratio = ease_function(ratio); + value = (T(1) - ratio)*begin_value + ratio*end_value; + } + +}; + + struct foo{ + foo(int){} + }; + +} // namespace J + +#endif