2023-07-21 16:42:29 +00:00
# pragma once
2025-04-23 14:26:33 +00:00
# include <JuceHeader.h>
2024-02-11 22:06:35 +00:00
# include "../obj/Camera.h"
2023-07-21 16:42:29 +00:00
2025-04-23 14:26:33 +00:00
class PerspectiveEffect : public osci : : EffectApplication {
2023-07-21 16:42:29 +00:00
public :
2025-04-24 09:47:03 +00:00
osci : : Point apply ( int index , osci : : Point input , const std : : vector < std : : atomic < double > > & values , double sampleRate ) override {
auto effectScale = values [ 0 ] . load ( ) ;
2025-08-15 06:21:19 +00:00
// Far plane clipping happens at about 1.2 deg for 100 far plane dist
double fovDegrees = juce : : jlimit ( 1.5 , 179.0 , values [ 1 ] . load ( ) ) ;
2025-08-14 08:51:36 +00:00
double fov = juce : : degreesToRadians ( fovDegrees ) ;
2023-07-21 16:42:29 +00:00
2025-08-15 06:21:19 +00:00
// Place camera such that field of view is tangent to unit sphere
2025-08-14 08:51:36 +00:00
Vec3 origin = Vec3 ( 0 , 0 , - 1.0f / std : : sin ( 0.5f * ( float ) fov ) ) ;
2025-04-24 09:47:03 +00:00
camera . setPosition ( origin ) ;
2025-08-15 06:21:19 +00:00
camera . setFov ( fov ) ;
2025-04-24 09:47:03 +00:00
Vec3 vec = Vec3 ( input . x , input . y , input . z ) ;
Vec3 projected = camera . project ( vec ) ;
return osci : : Point (
( 1 - effectScale ) * input . x + effectScale * projected . x ,
( 1 - effectScale ) * input . y + effectScale * projected . y ,
0
) ;
}
2023-10-19 11:20:24 +00:00
2025-08-10 19:45:06 +00:00
std : : shared_ptr < osci : : Effect > build ( ) const override {
auto eff = std : : make_shared < osci : : Effect > (
std : : make_shared < PerspectiveEffect > ( ) ,
std : : vector < osci : : EffectParameter * > {
new osci : : EffectParameter ( " Perspective " , " Controls the strength of the 3D perspective projection. " , " perspectiveStrength " , VERSION_HINT , 1.0 , 0.0 , 1.0 ) ,
2025-08-17 19:53:49 +00:00
new osci : : EffectParameter ( " Field of View " , " Controls the camera's field of view in degrees. A lower field of view makes the image look more flat, and a higher field of view makes the image look more 3D. " , " perspectiveFov " , VERSION_HINT , 50.0 , 5.0 , 130.0 ) ,
2025-08-10 19:45:06 +00:00
}
) ;
return eff ;
}
2023-07-21 16:42:29 +00:00
private :
2025-08-15 06:21:19 +00:00
2024-02-11 22:06:35 +00:00
Camera camera ;
2023-09-01 18:52:36 +00:00
} ;