2014-07-08 03:11:14 -04:00
# include "FractoriumPch.h"
# include "GLWidget.h"
# include "Fractorium.h"
2018-03-28 00:32:10 -04:00
# ifdef USE_GLSL
2018-04-10 21:52:43 -04:00
static const char * vertexShaderSource =
" attribute vec4 posattr; \n "
" uniform mat4 matrix; \n "
" uniform float ps; \n "
" void main() { \n "
" gl_Position = matrix * posattr; \n "
" gl_PointSize = ps; \n "
" } \n " ;
static const char * fragmentShaderSource =
" uniform vec4 mycolor; \n "
" void main() { \n "
" gl_FragColor = mycolor; \n "
" } \n " ;
static const char * quadVertexShaderSource =
" attribute vec4 posattr; \n "
" uniform mat4 matrix; \n "
" varying vec4 texcoord; \n "
" void main() { \n "
" gl_Position = matrix * posattr; \n "
" texcoord = posattr; \n "
" } \n " ;
static const char * quadFragmentShaderSource =
" uniform sampler2D quadtex; \n "
" varying vec4 texcoord; \n "
" void main() { \n "
" gl_FragColor = texture2D(quadtex, texcoord.st); \n "
" } \n " ;
2018-03-28 00:32:10 -04:00
# endif
2014-07-08 03:11:14 -04:00
/// <summary>
/// Constructor which passes parent widget to the base and initializes OpenGL profile.
/// This will need to change in the future to implement all drawing as shader programs.
/// </summary>
2014-12-11 00:50:15 -05:00
/// <param name="p">The parent widget</param>
GLWidget : : GLWidget ( QWidget * p )
2015-01-01 10:17:05 -05:00
: QOpenGLWidget ( p )
2014-07-08 03:11:14 -04:00
{
2018-04-04 21:54:32 -04:00
/*
2018-04-10 21:52:43 -04:00
auto qsf = this - > format ( ) ;
qDebug ( ) < < " Version: " < < qsf . majorVersion ( ) < < ' , ' < < qsf . minorVersion ( ) ;
qDebug ( ) < < " Profile: " < < qsf . profile ( ) ;
qDebug ( ) < < " Depth buffer size: " < < qsf . depthBufferSize ( ) ;
qDebug ( ) < < " Swap behavior: " < < qsf . swapBehavior ( ) ;
qDebug ( ) < < " Swap interval: " < < qsf . swapInterval ( ) ;
//QSurfaceFormat qsf;
//QSurfaceFormat::FormatOptions fo;
//fo.
//qsf.setDepthBufferSize(24);
//qsf.setSwapInterval(1);//Vsync.
//qsf.setSwapBehavior(QSurfaceFormat::DoubleBuffer);
# ifndef USE_GLSL
qsf . setVersion ( 2 , 0 ) ;
qsf . setProfile ( QSurfaceFormat : : CompatibilityProfile ) ;
# else
qsf . setVersion ( 3 , 3 ) ;
//qsf.setProfile(QSurfaceFormat::CoreProfile);
# endif
setFormat ( qsf ) ;
*/
/*
QSurfaceFormat fmt ;
fmt . setDepthBufferSize ( 24 ) ;
// Request OpenGL 3.3 compatibility or OpenGL ES 3.0.
if ( QOpenGLContext : : openGLModuleType ( ) = = QOpenGLContext : : LibGL )
{
qDebug ( " Requesting 3.3 compatibility context " ) ;
fmt . setVersion ( 3 , 3 ) ;
fmt . setProfile ( QSurfaceFormat : : CoreProfile ) ;
}
else
{
qDebug ( " Requesting 3.0 context " ) ;
fmt . setVersion ( 3 , 0 ) ;
}
setFormat ( fmt ) ;
2018-04-04 21:54:32 -04:00
*/
2018-04-29 01:28:05 -04:00
//auto qsf = this->format();
//qDebug() << "Constructor*****************\nVersion: " << qsf.majorVersion() << ',' << qsf.minorVersion();
//qDebug() << "Profile: " << qsf.profile();
//qDebug() << "Depth buffer size: " << qsf.depthBufferSize();
//qDebug() << "Swap behavior: " << qsf.swapBehavior();
//qDebug() << "Swap interval: " << qsf.swapInterval();
2014-07-08 03:11:14 -04:00
}
/// <summary>
/// Empty destructor.
/// </summary>
GLWidget : : ~ GLWidget ( )
{
}
2015-01-02 18:11:36 -05:00
/// <summary>
/// A manual initialization that must be called immediately after the main window is shown
/// and the virtual initializeGL() is called.
/// </summary>
void GLWidget : : InitGL ( )
{
if ( ! m_Init )
{
2018-04-29 01:28:05 -04:00
//auto qsf = this->format();
//qDebug() << "InitGL*****************\nVersion: " << qsf.majorVersion() << ',' << qsf.minorVersion();
//qDebug() << "Profile: " << qsf.profile();
//qDebug() << "Depth buffer size: " << qsf.depthBufferSize();
//qDebug() << "Swap behavior: " << qsf.swapBehavior();
//qDebug() << "Swap interval: " << qsf.swapInterval();
--User changes
-Support 4k monitors, and in general, properly scale any monitor that is not HD.
-Allow for a spatial filter of radius zero, which means do not use a spatial filter.
-Add new variations: concentric, cpow3, helicoid, helix, rand_cubes, sphereblur.
-Use a new method for computing elliptic which is more precise. Developed by Discord user Claude.
-Remove the 8 variation per xform limitation on the GPU.
-Allow for loading the last flame file on startup, rather than randoms.
-Use two different default quality values in the interactive renderer, one each for CPU and GPU.
-Creating linked xforms was using non-standard behavior. Make it match Apo and also support creating multiple linked xforms at once.
--Bug fixes
-No variations in an xform used to have the same behavior as a single linear variation with weight 1. While sensible, this breaks backward compatibility. No variations now sets the output point to zeroes.
-Prevent crashing the program when adjusting a value on the main window while a final render is in progress.
-The xaos table was inverted.
--Code changes
-Convert projects to Visual Studio 2017.
-Change bad vals from +- 1e10 to +-1e20.
-Reintroduce the symmetry tag in xforms for legacy support in programs that do not use color_speed.
-Compiler will not let us use default values in templated member functions anymore.
2017-11-26 20:27:00 -05:00
int w = std : : ceil ( m_Fractorium - > ui . GLParentScrollArea - > width ( ) * devicePixelRatioF ( ) ) ;
int h = std : : ceil ( m_Fractorium - > ui . GLParentScrollArea - > height ( ) * devicePixelRatioF ( ) ) ;
2015-01-02 18:11:36 -05:00
SetDimensions ( w , h ) ;
--User changes
-Support 4k monitors, and in general, properly scale any monitor that is not HD.
-Allow for a spatial filter of radius zero, which means do not use a spatial filter.
-Add new variations: concentric, cpow3, helicoid, helix, rand_cubes, sphereblur.
-Use a new method for computing elliptic which is more precise. Developed by Discord user Claude.
-Remove the 8 variation per xform limitation on the GPU.
-Allow for loading the last flame file on startup, rather than randoms.
-Use two different default quality values in the interactive renderer, one each for CPU and GPU.
-Creating linked xforms was using non-standard behavior. Make it match Apo and also support creating multiple linked xforms at once.
--Bug fixes
-No variations in an xform used to have the same behavior as a single linear variation with weight 1. While sensible, this breaks backward compatibility. No variations now sets the output point to zeroes.
-Prevent crashing the program when adjusting a value on the main window while a final render is in progress.
-The xaos table was inverted.
--Code changes
-Convert projects to Visual Studio 2017.
-Change bad vals from +- 1e10 to +-1e20.
-Reintroduce the symmetry tag in xforms for legacy support in programs that do not use color_speed.
-Compiler will not let us use default values in templated member functions anymore.
2017-11-26 20:27:00 -05:00
//Start with either a flock of random embers, or the last flame from the previous run.
//Can't do this until now because the window wasn't maximized yet, so the sizes would have been off.
bool b = m_Fractorium - > m_Settings - > LoadLast ( ) ;
if ( b )
{
auto path = GetDefaultUserPath ( ) ;
QDir dir ( path ) ;
QString filename = path + " /lastonshutdown.flame " ;
if ( dir . exists ( filename ) )
{
QStringList ql ;
ql < < filename ;
m_Fractorium - > m_Controller - > OpenAndPrepFiles ( ql , false ) ;
}
else
b = false ;
}
if ( ! b )
{
m_Fractorium - > m_WidthSpin - > setValue ( w ) ;
m_Fractorium - > m_HeightSpin - > setValue ( h ) ;
--User changes
-No longer constrain pitch, yaw or depth spinners to -180 - 180.
--Bug fixes
-Properly set color index on padded xforms.
-Adding a padding final xform included a linear variation with a weight of zero to not appear empty. Made it have a weight of 1.
-Always write animate tag on final xform when saving to Xml.
-Motion was being applied to the wrong flame in SheepTools::Edge(), so apply it to the correct one.
-Prevent divide by zero when normalizing variation weights.
-Was accidentally adding the placeholder value of -9999 for motion_offset to varation weights and parameters when applying motion. Set to zero if no value present.
-Clamp flame rotation values to -180 - 180 when reading a flame from Xml.
-Events were not properly wired for user changes in the random rotations per blend controls in the sequencer.
-Fix major UI bugs with sequencer min/max random controls which made it nearly impossible to hand type values.
-Values from rotations per blend and rotations per blend max were not being saved to file between program runs.
-Checking animate for an xform was not applied to all flames even if Apply All was checked.
-Changing interpolation type, temporal filter width, temporal type, and affine interpolation type were not actually saving to the flame when changed.
-Grid on the main window was not being drawn at the right scale initially due to some OpenGL initialization occurring in the wrong order.
-Severe bugs in sequence generation code:
--Improperly detected padding xforms.
--When looking for specific variations during xform aligning, only presence was detected, when it should have been presence plus a weight greater than zero.
--When adding specific variations during xform aligning, must first remove any variations of that type.
--Two variables were unsigned when they should have been signed. This prevented large blocks of code from ever executing.
--When interpolating affines, an EPS that was too small was used, causing affine values to interpolate incorrectly. Instead use 1e-10 to ensure results equal to flam3.
--Code changes
-Modify FractoriumEmberController::UpdateXform() to pass the selected xform index as well as the absolute index to func().
2018-06-13 00:20:15 -04:00
m_Fractorium - > OnActionNewFlock ( false ) ; //This must come after the previous two lines because it uses the values of the spinners.
--User changes
-Support 4k monitors, and in general, properly scale any monitor that is not HD.
-Allow for a spatial filter of radius zero, which means do not use a spatial filter.
-Add new variations: concentric, cpow3, helicoid, helix, rand_cubes, sphereblur.
-Use a new method for computing elliptic which is more precise. Developed by Discord user Claude.
-Remove the 8 variation per xform limitation on the GPU.
-Allow for loading the last flame file on startup, rather than randoms.
-Use two different default quality values in the interactive renderer, one each for CPU and GPU.
-Creating linked xforms was using non-standard behavior. Make it match Apo and also support creating multiple linked xforms at once.
--Bug fixes
-No variations in an xform used to have the same behavior as a single linear variation with weight 1. While sensible, this breaks backward compatibility. No variations now sets the output point to zeroes.
-Prevent crashing the program when adjusting a value on the main window while a final render is in progress.
-The xaos table was inverted.
--Code changes
-Convert projects to Visual Studio 2017.
-Change bad vals from +- 1e10 to +-1e20.
-Reintroduce the symmetry tag in xforms for legacy support in programs that do not use color_speed.
-Compiler will not let us use default values in templated member functions anymore.
2017-11-26 20:27:00 -05:00
}
2015-01-02 18:11:36 -05:00
m_Fractorium - > m_Controller - > DelayedStartRenderTimer ( ) ;
m_Init = true ;
2018-04-29 01:28:05 -04:00
/*
2019-06-11 22:25:21 -04:00
auto clinfo = OpenCLInfo : : DefInstance ( ) ;
auto & platforms = clinfo - > Platforms ( ) ;
auto & alldevices = clinfo - > Devices ( ) ;
std : : vector < std : : string > strs ;
auto cdc = wglGetCurrentDC ( ) ;
auto cc = wglGetCurrentContext ( ) ;
ostringstream os ;
strs . push_back ( os . str ( ) ) ; os . str ( " " ) ; os < < " GLWidget::InitGL(): " ;
strs . push_back ( os . str ( ) ) ; os . str ( " " ) ; os < < " \n Current DC: " < < cdc ;
strs . push_back ( os . str ( ) ) ; os . str ( " " ) ; os < < " \n Current Context: " < < cc ;
for ( int platform = 0 ; platform < platforms . size ( ) ; platform + + )
{
2018-04-29 01:28:05 -04:00
cl_context_properties props [ ] =
{
CL_GL_CONTEXT_KHR , ( cl_context_properties ) wglGetCurrentContext ( ) ,
CL_WGL_HDC_KHR , ( cl_context_properties ) wglGetCurrentDC ( ) ,
CL_CONTEXT_PLATFORM , reinterpret_cast < cl_context_properties > ( ( platforms [ platform ] ) ( ) ) ,
0
} ;
// Find CL capable devices in the current GL context
//wglMakeCurrent(wglGetCurrentDC(), wglGetCurrentContext());
: : wglMakeCurrent ( wglGetCurrentDC ( ) , wglGetCurrentContext ( ) ) ;
size_t sizedev ;
cl_device_id devices [ 32 ] ;
clGetGLContextInfoKHR_fn clGetGLContextInfo = ( clGetGLContextInfoKHR_fn ) clGetExtensionFunctionAddressForPlatform ( platforms [ platform ] ( ) , " clGetGLContextInfoKHR " ) ;
clGetGLContextInfo ( props , CL_DEVICES_FOR_GL_CONTEXT_KHR , 32 * sizeof ( cl_device_id ) , devices , & sizedev ) ;
sizedev = ( cl_uint ) ( sizedev / sizeof ( cl_device_id ) ) ;
for ( int i = 0 ; i < sizedev ; i + + )
{
std : : string s ;
size_t pi , di ;
auto dd = clinfo - > DeviceFromId ( devices [ i ] , pi , di ) ;
if ( dd )
{
auto & dev = * dd ;
auto & plat = platforms [ pi ] ;
strs . push_back ( os . str ( ) ) ; os . str ( " " ) ; os < < " \n Platform[ " < < pi < < " ], device[ " < < di < < " ] is GL capable. " ;
strs . push_back ( os . str ( ) ) ; os . str ( " " ) ; os < < " \n Platform profile: " < < plat . getInfo < CL_PLATFORM_PROFILE > ( nullptr ) . c_str ( ) < < endl ;
strs . push_back ( os . str ( ) ) ; os . str ( " " ) ; os < < " \n Platform version: " < < plat . getInfo < CL_PLATFORM_VERSION > ( nullptr ) . c_str ( ) < < endl ;
strs . push_back ( os . str ( ) ) ; os . str ( " " ) ; os < < " \n Platform name: " < < plat . getInfo < CL_PLATFORM_NAME > ( nullptr ) . c_str ( ) < < endl ;
strs . push_back ( os . str ( ) ) ; os . str ( " " ) ; os < < " \n Platform vendor: " < < plat . getInfo < CL_PLATFORM_VENDOR > ( nullptr ) . c_str ( ) < < endl ;
strs . push_back ( os . str ( ) ) ; os . str ( " " ) ; os < < " \n Platform extensions: " < < plat . getInfo < CL_PLATFORM_EXTENSIONS > ( nullptr ) . c_str ( ) < < endl ;
strs . push_back ( os . str ( ) ) ; os . str ( " " ) ; os < < " \n Vendor: " < < dev . getInfo < CL_DEVICE_VENDOR > ( nullptr ) . c_str ( ) < < endl ;
strs . push_back ( os . str ( ) ) ; os . str ( " " ) ; os < < " \n Device: " < < dev . getInfo < CL_DEVICE_NAME > ( nullptr ) . c_str ( ) < < endl ;
strs . push_back ( os . str ( ) ) ; os . str ( " " ) ; os < < " \n Driver version: " < < dev . getInfo < CL_DRIVER_VERSION > ( nullptr ) . c_str ( ) < < endl ;
strs . push_back ( os . str ( ) ) ; os . str ( " " ) ; os < < " \n Device profile: " < < dev . getInfo < CL_DEVICE_PROFILE > ( nullptr ) . c_str ( ) < < endl ;
strs . push_back ( os . str ( ) ) ; os . str ( " " ) ; os < < " \n Device version: " < < dev . getInfo < CL_DEVICE_VERSION > ( nullptr ) . c_str ( ) < < endl ;
strs . push_back ( os . str ( ) ) ; os . str ( " " ) ; os < < " \n Device extensions: " < < dev . getInfo < CL_DEVICE_EXTENSIONS > ( nullptr ) . c_str ( ) < < endl ;
strs . push_back ( os . str ( ) ) ; os . str ( " " ) ; os < < " \n Device OpenCL C version: " < < dev . getInfo < CL_DEVICE_OPENCL_C_VERSION > ( nullptr ) . c_str ( ) < < endl ;
}
}
2019-06-11 22:25:21 -04:00
}
2018-04-29 01:28:05 -04:00
2019-06-11 22:25:21 -04:00
m_Fractorium - > ErrorReportToQTextEdit ( strs , m_Fractorium - > ui . InfoRenderingTextEdit ) ;
2018-04-29 01:28:05 -04:00
*/
2015-01-02 18:11:36 -05:00
}
}
2014-07-08 03:11:14 -04:00
/// <summary>
/// Draw the final rendered image as a texture on a quad that is the same size as the window.
/// Different action is taken based on whether a CPU or OpenCL renderer is used.
/// For CPU, the output image buffer must be copied to OpenGL every time it's drawn.
/// For OpenCL, the output image and the texture are the same thing, so no copying is necessary
/// and all image memory remains on the card.
/// </summary>
void GLWidget : : DrawQuad ( )
{
2018-03-28 00:32:10 -04:00
# ifndef USE_GLSL
2014-07-08 03:11:14 -04:00
glEnable ( GL_TEXTURE_2D ) ;
2016-02-12 00:38:21 -05:00
auto renderer = m_Fractorium - > m_Controller - > Renderer ( ) ;
auto finalImage = m_Fractorium - > m_Controller - > FinalImage ( ) ;
2014-07-08 03:11:14 -04:00
//Ensure all allocation has taken place first.
if ( m_OutputTexID ! = 0 & & finalImage & & ! finalImage - > empty ( ) )
{
glBindTexture ( GL_TEXTURE_2D , m_OutputTexID ) ; //The texture to draw to.
--User changes
-Support 4k monitors, and in general, properly scale any monitor that is not HD.
-Allow for a spatial filter of radius zero, which means do not use a spatial filter.
-Add new variations: concentric, cpow3, helicoid, helix, rand_cubes, sphereblur.
-Use a new method for computing elliptic which is more precise. Developed by Discord user Claude.
-Remove the 8 variation per xform limitation on the GPU.
-Allow for loading the last flame file on startup, rather than randoms.
-Use two different default quality values in the interactive renderer, one each for CPU and GPU.
-Creating linked xforms was using non-standard behavior. Make it match Apo and also support creating multiple linked xforms at once.
--Bug fixes
-No variations in an xform used to have the same behavior as a single linear variation with weight 1. While sensible, this breaks backward compatibility. No variations now sets the output point to zeroes.
-Prevent crashing the program when adjusting a value on the main window while a final render is in progress.
-The xaos table was inverted.
--Code changes
-Convert projects to Visual Studio 2017.
-Change bad vals from +- 1e10 to +-1e20.
-Reintroduce the symmetry tag in xforms for legacy support in programs that do not use color_speed.
-Compiler will not let us use default values in templated member functions anymore.
2017-11-26 20:27:00 -05:00
auto scaledW = std : : ceil ( width ( ) * devicePixelRatioF ( ) ) ;
auto scaledH = std : : ceil ( height ( ) * devicePixelRatioF ( ) ) ;
2016-01-04 19:50:15 -05:00
2014-07-08 03:11:14 -04:00
//Only draw if the dimensions match exactly.
--User changes
-Support 4k monitors, and in general, properly scale any monitor that is not HD.
-Allow for a spatial filter of radius zero, which means do not use a spatial filter.
-Add new variations: concentric, cpow3, helicoid, helix, rand_cubes, sphereblur.
-Use a new method for computing elliptic which is more precise. Developed by Discord user Claude.
-Remove the 8 variation per xform limitation on the GPU.
-Allow for loading the last flame file on startup, rather than randoms.
-Use two different default quality values in the interactive renderer, one each for CPU and GPU.
-Creating linked xforms was using non-standard behavior. Make it match Apo and also support creating multiple linked xforms at once.
--Bug fixes
-No variations in an xform used to have the same behavior as a single linear variation with weight 1. While sensible, this breaks backward compatibility. No variations now sets the output point to zeroes.
-Prevent crashing the program when adjusting a value on the main window while a final render is in progress.
-The xaos table was inverted.
--Code changes
-Convert projects to Visual Studio 2017.
-Change bad vals from +- 1e10 to +-1e20.
-Reintroduce the symmetry tag in xforms for legacy support in programs that do not use color_speed.
-Compiler will not let us use default values in templated member functions anymore.
2017-11-26 20:27:00 -05:00
if ( m_TexWidth = = m_Fractorium - > m_Controller - > FinalRasW ( ) & &
m_TexHeight = = m_Fractorium - > m_Controller - > FinalRasH ( ) & &
( ( m_TexWidth * m_TexHeight ) = = GLint ( finalImage - > size ( ) ) ) )
2014-07-08 03:11:14 -04:00
{
glMatrixMode ( GL_PROJECTION ) ;
glPushMatrix ( ) ;
glLoadIdentity ( ) ;
glOrtho ( 0 , 1 , 1 , 0 , - 1 , 1 ) ;
glMatrixMode ( GL_MODELVIEW ) ;
glPushMatrix ( ) ;
glLoadIdentity ( ) ;
//Copy data from CPU to OpenGL if using a CPU renderer. This is not needed when using OpenCL.
2016-01-04 19:50:15 -05:00
if ( renderer - > RendererType ( ) = = eRendererType : : CPU_RENDERER )
2017-07-22 16:43:35 -04:00
glTexSubImage2D ( GL_TEXTURE_2D , 0 , 0 , 0 , m_TexWidth , m_TexHeight , GL_RGBA , GL_FLOAT , finalImage - > data ( ) ) ;
2014-07-08 03:11:14 -04:00
glBegin ( GL_QUADS ) ; //This will need to be converted to a shader at some point in the future.
glTexCoord2f ( 0.0 , 0.0 ) ; glVertex2f ( 0.0 , 0.0 ) ;
glTexCoord2f ( 0.0 , 1.0 ) ; glVertex2f ( 0.0 , 1.0 ) ;
glTexCoord2f ( 1.0 , 1.0 ) ; glVertex2f ( 1.0 , 1.0 ) ;
glTexCoord2f ( 1.0 , 0.0 ) ; glVertex2f ( 1.0 , 0.0 ) ;
glEnd ( ) ;
glMatrixMode ( GL_PROJECTION ) ;
glPopMatrix ( ) ;
glMatrixMode ( GL_MODELVIEW ) ;
glPopMatrix ( ) ;
}
glBindTexture ( GL_TEXTURE_2D , 0 ) ; //Stop using this texture.
}
glDisable ( GL_TEXTURE_2D ) ;
2018-03-28 00:32:10 -04:00
# else
this - > glEnable ( GL_TEXTURE_2D ) ;
this - > glActiveTexture ( GL_TEXTURE0 ) ;
auto renderer = m_Fractorium - > m_Controller - > Renderer ( ) ;
//Ensure all allocation has taken place first.
2018-04-29 01:28:05 -04:00
if ( m_OutputTexID ! = 0 )
2018-03-28 00:32:10 -04:00
{
glBindTexture ( GL_TEXTURE_2D , m_OutputTexID ) ; //The texture to draw to.
auto scaledW = std : : ceil ( width ( ) * devicePixelRatioF ( ) ) ;
auto scaledH = std : : ceil ( height ( ) * devicePixelRatioF ( ) ) ;
//Only draw if the dimensions match exactly.
2018-04-29 01:28:05 -04:00
if ( m_TexWidth = = m_Fractorium - > m_Controller - > FinalRasW ( ) & & m_TexHeight = = m_Fractorium - > m_Controller - > FinalRasH ( ) )
2018-03-28 00:32:10 -04:00
{
//Copy data from CPU to OpenGL if using a CPU renderer. This is not needed when using OpenCL.
2018-04-29 01:28:05 -04:00
if ( renderer - > RendererType ( ) = = eRendererType : : CPU_RENDERER | | ! renderer - > Shared ( ) )
{
auto finalImage = m_Fractorium - > m_Controller - > FinalImage ( ) ;
if ( finalImage & & //Make absolutely sure all image dimensions match when copying host side buffer to GL texture.
! finalImage - > empty ( ) & &
( ( m_TexWidth * m_TexHeight ) = = GLint ( finalImage - > size ( ) ) ) & &
( finalImage - > size ( ) = = renderer - > FinalDimensions ( ) ) )
this - > glTexSubImage2D ( GL_TEXTURE_2D , 0 , 0 , 0 , m_TexWidth , m_TexHeight , GL_RGBA , GL_FLOAT , finalImage - > data ( ) ) ;
}
2018-03-28 00:32:10 -04:00
m_QuadProgram - > bind ( ) ;
this - > glVertexAttribPointer ( m_TexturePosAttr , 2 , GL_FLOAT , GL_FALSE , 0 , m_TexVerts . data ( ) ) ;
this - > glEnableVertexAttribArray ( 0 ) ;
this - > glDrawArrays ( GL_TRIANGLE_STRIP , 0 , 5 ) ;
this - > glDisableVertexAttribArray ( 0 ) ;
m_QuadProgram - > release ( ) ;
}
}
this - > glBindTexture ( GL_TEXTURE_2D , 0 ) ; //Stop using this texture.
this - > glDisable ( GL_TEXTURE_2D ) ;
# endif
2014-07-08 03:11:14 -04:00
}
/// <summary>
/// Set drag and drag modifier states to nothing.
/// </summary>
void GLEmberControllerBase : : ClearDrag ( )
{
m_DragModifier = 0 ;
2016-01-04 19:50:15 -05:00
m_DragState = eDragState : : DragNone ;
2014-07-08 03:11:14 -04:00
}
/// <summary>
/// Wrapper around Allocate() call on the GL widget.
/// </summary>
bool GLEmberControllerBase : : Allocate ( bool force ) { return m_GL - > Allocate ( force ) ; }
2016-01-04 19:50:15 -05:00
/// <summary>
/// Helpers to set/get/clear which keys are pressed while dragging.
/// </summary>
/// <returns>bool</returns>
2016-02-12 00:38:21 -05:00
bool GLEmberControllerBase : : GetAlt ( ) { return ( m_DragModifier & et ( eDragModifier : : DragModAlt ) ) = = et ( eDragModifier : : DragModAlt ) ; }
bool GLEmberControllerBase : : GetShift ( ) { return ( m_DragModifier & et ( eDragModifier : : DragModShift ) ) = = et ( eDragModifier : : DragModShift ) ; }
bool GLEmberControllerBase : : GetControl ( ) { return ( m_DragModifier & et ( eDragModifier : : DragModControl ) ) = = et ( eDragModifier : : DragModControl ) ; }
void GLEmberControllerBase : : SetAlt ( ) { m_DragModifier | = et ( eDragModifier : : DragModAlt ) ; }
void GLEmberControllerBase : : SetShift ( ) { m_DragModifier | = et ( eDragModifier : : DragModShift ) ; }
void GLEmberControllerBase : : SetControl ( ) { m_DragModifier | = et ( eDragModifier : : DragModControl ) ; }
void GLEmberControllerBase : : ClearAlt ( ) { m_DragModifier & = ~ et ( eDragModifier : : DragModAlt ) ; }
void GLEmberControllerBase : : ClearShift ( ) { m_DragModifier & = ~ et ( eDragModifier : : DragModShift ) ; }
2016-01-04 19:50:15 -05:00
void GLEmberControllerBase : : ClearControl ( ) { m_DragModifier & = ~ et ( eDragModifier : : DragModControl ) ; }
2014-07-08 03:11:14 -04:00
/// <summary>
/// Clear the OpenGL output window to be the background color of the current ember.
/// Both buffers must be cleared, else artifacts will show up.
/// </summary>
template < typename T >
void GLEmberController < T > : : ClearWindow ( )
{
2019-06-11 22:25:21 -04:00
auto ember = m_FractoriumEmberController - > CurrentEmber ( ) ;
2014-10-14 11:53:15 -04:00
m_GL - > makeCurrent ( ) ;
2014-07-08 03:11:14 -04:00
m_GL - > glClearColor ( ember - > m_Background . r , ember - > m_Background . g , ember - > m_Background . b , 1.0 ) ;
--User changes
-Add a palette editor.
-Add support for reading .ugr/.gradient/.gradients palette files.
-Allow toggling on spinners whose minimum value is not zero.
-Allow toggling display of image, affines and grid.
-Add new variations: cylinder2, circlesplit, tile_log, truchet_fill, waves2_radial.
--Bug fixes
-cpow2 was wrong.
-Palettes with rapid changes in color would produce slightly different outputs from Apo/Chaotica. This was due to a long standing bug from flam3.
-Use exec() on Apple and show() on all other OSes for dialog boxes.
-Trying to render a sequence with no frames would crash.
-Selecting multiple xforms and rotating them would produce the wrong rotation.
-Better handling when parsing flames using different encoding, such as unicode and UTF-8.
-Switching between SP/DP didn't reselect the selected flame in the Library tab.
--Code changes
-Make all types concerning palettes be floats, including PaletteTableWidgetItem.
-PaletteTableWidgetItem is no longer templated because all palettes are float.
-Include the source colors for user created gradients.
-Change parallel_for() calls to work with very old versions of TBB which are lingering on some systems.
-Split conditional out of accumulation loop on the CPU for better performance.
-Vectorize summing when doing density filter for better performance.
-Make all usage of palettes be of type float, double is pointless.
-Allow palettes to reside in multiple folders, while ensuring only one of each name is added.
-Refactor some palette path searching code.
-Make ReadFile() throw and catch an exception if the file operation fails.
-A little extra safety in foci and foci3D with a call to Zeps().
-Cast to (real_t) in the OpenCL string for the w variation, which was having trouble compiling on Mac.
-Fixing missing comma between paths in InitPaletteList().
-Move Xml and PaletteList classes into cpp to shorten build times when working on them.
-Remove default param values for IterOpenCLKernelCreator<T>::SharedDataIndexDefines in cpp file.
-Change more NULL to nullptr.
2017-02-26 03:02:21 -05:00
m_GL - > glClear ( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ) ;
2014-07-08 03:11:14 -04:00
}
/// <summary>
/// Set the currently selected xform.
/// The currently selected xform is drawn with a circle around it, with all others only showing their axes.
/// </summary>
/// <param name="xform">The xform.</param>
template < typename T >
void GLEmberController < T > : : SetSelectedXform ( Xform < T > * xform )
{
//By doing this check, it prevents triggering unnecessary events when selecting an xform on this window with the mouse,
//which will set the combo box on the main window, which will trigger this call. However, if the xform has been selected
2018-09-15 06:11:12 -04:00
//here with the mouse, the window has already been repainted, so there's no need to do it again.
if ( m_SelectedXform ! = xform )
2014-07-08 03:11:14 -04:00
{
m_SelectedXform = xform ;
if ( m_GL - > m_Init )
2015-01-01 10:17:05 -05:00
//m_GL->update();
2014-07-08 03:11:14 -04:00
m_GL - > repaint ( ) ; //Force immediate redraw with repaint() instead of update().
}
}
/// <summary>
/// Setters for main window pointers.
/// </summary>
void GLWidget : : SetMainWindow ( Fractorium * f ) { m_Fractorium = f ; }
/// <summary>
/// Getters for OpenGL state.
/// </summary>
bool GLWidget : : Init ( ) { return m_Init ; }
bool GLWidget : : Drawing ( ) { return m_Drawing ; }
2014-10-14 11:53:15 -04:00
GLint GLWidget : : MaxTexSize ( ) { return m_MaxTexSize ; }
2014-07-08 03:11:14 -04:00
GLuint GLWidget : : OutputTexID ( ) { return m_OutputTexID ; }
2018-08-10 21:06:04 -04:00
GLint GLWidget : : TexWidth ( ) { return m_TexWidth ; }
GLint GLWidget : : TexHeight ( ) { return m_TexHeight ; }
2014-07-08 03:11:14 -04:00
/// <summary>
/// Initialize OpenGL, called once at startup after the main window constructor finishes.
2014-10-14 11:53:15 -04:00
/// Although it seems an awkward place to put some of this setup code, the dimensions of the
/// main window and its widgets are not fully initialized before this is called.
2014-07-08 03:11:14 -04:00
/// Once this is done, the render timer is started after a short delay.
/// Rendering is then clear to begin.
/// </summary>
void GLWidget : : initializeGL ( )
{
2018-03-28 00:32:10 -04:00
# ifdef USE_GLSL
2018-04-29 01:28:05 -04:00
//auto qsf = this->format();
//qDebug() << "initializeGL*****************\nVersion: " << qsf.majorVersion() << ',' << qsf.minorVersion();
//qDebug() << "Profile: " << qsf.profile();
//qDebug() << "Depth buffer size: " << qsf.depthBufferSize();
//qDebug() << "Swap behavior: " << qsf.swapBehavior();
//qDebug() << "Swap interval: " << qsf.swapInterval();
2018-03-28 00:32:10 -04:00
if ( ! m_Init & & m_Fractorium )
{
2018-04-04 21:54:32 -04:00
this - > initializeOpenGLFunctions ( ) ;
2018-03-28 00:32:10 -04:00
if ( ! m_Program )
{
m_Program = new QOpenGLShaderProgram ( this ) ;
if ( ! m_Program - > addShaderFromSourceCode ( QOpenGLShader : : Vertex , vertexShaderSource ) )
{
2018-04-04 21:54:32 -04:00
QMessageBox : : critical ( m_Fractorium , " Shader Error " , " Error compiling affine vertex source: " + m_Program - > log ( ) ) ;
2018-03-28 00:32:10 -04:00
QApplication : : exit ( 1 ) ;
}
if ( ! m_Program - > addShaderFromSourceCode ( QOpenGLShader : : Fragment , fragmentShaderSource ) )
{
2018-04-04 21:54:32 -04:00
QMessageBox : : critical ( m_Fractorium , " Shader Error " , " Error compiling affine fragment source: " + m_Program - > log ( ) ) ;
2018-03-28 00:32:10 -04:00
QApplication : : exit ( 1 ) ;
}
if ( ! m_Program - > link ( ) )
{
2018-04-04 21:54:32 -04:00
QMessageBox : : critical ( m_Fractorium , " Shader Error " , " Error linking affine source: " + m_Program - > log ( ) ) ;
2018-03-28 00:32:10 -04:00
QApplication : : exit ( 1 ) ;
}
m_PosAttr = m_Program - > attributeLocation ( " posattr " ) ;
m_ColAttr = m_Program - > uniformLocation ( " mycolor " ) ;
2018-04-10 21:52:43 -04:00
m_PointSizeUniform = m_Program - > uniformLocation ( " ps " ) ;
2018-03-28 00:32:10 -04:00
m_MatrixUniform = m_Program - > uniformLocation ( " matrix " ) ;
}
if ( ! m_QuadProgram )
{
m_QuadProgram = new QOpenGLShaderProgram ( this ) ;
if ( ! m_QuadProgram - > addShaderFromSourceCode ( QOpenGLShader : : Vertex , quadVertexShaderSource ) )
{
2018-04-04 21:54:32 -04:00
QMessageBox : : critical ( m_Fractorium , " Shader Error " , " Error compiling image texture vertex source: " + m_QuadProgram - > log ( ) ) ;
2018-03-28 00:32:10 -04:00
QApplication : : exit ( 1 ) ;
}
if ( ! m_QuadProgram - > addShaderFromSourceCode ( QOpenGLShader : : Fragment , quadFragmentShaderSource ) )
{
2018-04-04 21:54:32 -04:00
QMessageBox : : critical ( m_Fractorium , " Shader Error " , " Error compiling image texture fragment source: " + m_QuadProgram - > log ( ) ) ;
2018-03-28 00:32:10 -04:00
QApplication : : exit ( 1 ) ;
}
if ( ! m_QuadProgram - > link ( ) )
{
2018-04-04 21:54:32 -04:00
QMessageBox : : critical ( m_Fractorium , " Shader Error " , " Error linking image texture source: " + m_QuadProgram - > log ( ) ) ;
2018-03-28 00:32:10 -04:00
QApplication : : exit ( 1 ) ;
}
m_TexturePosAttr = m_QuadProgram - > attributeLocation ( " posattr " ) ;
m_TextureUniform = m_QuadProgram - > uniformLocation ( " quadtex " ) ;
m_TextureMatrixUniform = m_QuadProgram - > uniformLocation ( " matrix " ) ;
m_TextureProjMatrix . ortho ( 0 , 1 , 1 , 0 , - 1 , 1 ) ;
m_QuadProgram - > bind ( ) ;
m_QuadProgram - > setUniformValue ( m_TextureUniform , 0 ) ;
m_QuadProgram - > setUniformValue ( m_TextureMatrixUniform , m_TextureProjMatrix ) ;
m_QuadProgram - > release ( ) ;
}
# else
2014-07-08 03:11:14 -04:00
if ( ! m_Init & & initializeOpenGLFunctions ( ) & & m_Fractorium )
{
2018-03-28 00:32:10 -04:00
# endif
2018-04-10 21:52:43 -04:00
//cout << "GL Version: " << (char *) glGetString(GL_VERSION) << endl;
//cout << "GLSL version: " << (char *) glGetString(GL_SHADING_LANGUAGE_VERSION) << endl;
2018-03-28 00:32:10 -04:00
this - > glClearColor ( 0.0 , 0.0 , 0.0 , 1.0 ) ;
this - > glDisable ( GL_DEPTH_TEST ) ; //This will remain disabled for the duration of the program.
this - > glEnable ( GL_TEXTURE_2D ) ;
2018-04-10 21:52:43 -04:00
this - > glEnable ( GL_PROGRAM_POINT_SIZE ) ;
2018-03-28 00:32:10 -04:00
this - > glGetIntegerv ( GL_MAX_TEXTURE_SIZE , & m_MaxTexSize ) ;
this - > glDisable ( GL_TEXTURE_2D ) ;
2018-09-15 06:11:12 -04:00
m_Fractorium - > m_WidthSpin - > setMaximum ( m_MaxTexSize ) ;
2014-10-14 11:53:15 -04:00
m_Fractorium - > m_HeightSpin - > setMaximum ( m_MaxTexSize ) ;
2014-07-08 03:11:14 -04:00
}
}
/// <summary>
/// The main drawing/update function.
/// First the quad will be drawn, then the remaining affine circles.
/// </summary>
void GLWidget : : paintGL ( )
{
2018-04-10 21:52:43 -04:00
/*
2019-06-11 22:25:21 -04:00
auto qsf = this - > format ( ) ;
qDebug ( ) < < " paintGL***************** \n Version: " < < qsf . majorVersion ( ) < < ' , ' < < qsf . minorVersion ( ) ;
qDebug ( ) < < " Profile: " < < qsf . profile ( ) ;
qDebug ( ) < < " Depth buffer size: " < < qsf . depthBufferSize ( ) ;
qDebug ( ) < < " Swap behavior: " < < qsf . swapBehavior ( ) ;
qDebug ( ) < < " Swap interval: " < < qsf . swapInterval ( ) ;
2018-04-10 21:52:43 -04:00
*/
2016-02-02 20:51:58 -05:00
auto controller = m_Fractorium - > m_Controller . get ( ) ;
2014-07-08 03:11:14 -04:00
//Ensure there is a renderer and that it's supposed to be drawing, signified by the running timer.
2018-09-15 06:11:12 -04:00
if ( controller & & controller - > Renderer ( ) /* && controller->ProcessState() != eProcessState::NONE*/ ) //Need a way to determine if at leat one successful render has happened.
2014-07-08 03:11:14 -04:00
{
2016-02-12 00:38:21 -05:00
auto renderer = controller - > Renderer ( ) ;
2018-09-15 06:11:12 -04:00
float unitX = std : : abs ( renderer - > UpperRightX ( false ) - renderer - > LowerLeftX ( false ) ) / 2.0f ;
float unitY = std : : abs ( renderer - > UpperRightY ( false ) - renderer - > LowerLeftY ( false ) ) / 2.0f ;
if ( unitX > 100000 | | unitY > 100000 ) //Need a better way to do this.//TODO
{
qDebug ( ) < < unitX < < " " < < unitY ;
//return;
}
2014-07-08 03:11:14 -04:00
m_Drawing = true ;
--User changes
-Add a palette editor.
-Add support for reading .ugr/.gradient/.gradients palette files.
-Allow toggling on spinners whose minimum value is not zero.
-Allow toggling display of image, affines and grid.
-Add new variations: cylinder2, circlesplit, tile_log, truchet_fill, waves2_radial.
--Bug fixes
-cpow2 was wrong.
-Palettes with rapid changes in color would produce slightly different outputs from Apo/Chaotica. This was due to a long standing bug from flam3.
-Use exec() on Apple and show() on all other OSes for dialog boxes.
-Trying to render a sequence with no frames would crash.
-Selecting multiple xforms and rotating them would produce the wrong rotation.
-Better handling when parsing flames using different encoding, such as unicode and UTF-8.
-Switching between SP/DP didn't reselect the selected flame in the Library tab.
--Code changes
-Make all types concerning palettes be floats, including PaletteTableWidgetItem.
-PaletteTableWidgetItem is no longer templated because all palettes are float.
-Include the source colors for user created gradients.
-Change parallel_for() calls to work with very old versions of TBB which are lingering on some systems.
-Split conditional out of accumulation loop on the CPU for better performance.
-Vectorize summing when doing density filter for better performance.
-Make all usage of palettes be of type float, double is pointless.
-Allow palettes to reside in multiple folders, while ensuring only one of each name is added.
-Refactor some palette path searching code.
-Make ReadFile() throw and catch an exception if the file operation fails.
-A little extra safety in foci and foci3D with a call to Zeps().
-Cast to (real_t) in the OpenCL string for the w variation, which was having trouble compiling on Mac.
-Fixing missing comma between paths in InitPaletteList().
-Move Xml and PaletteList classes into cpp to shorten build times when working on them.
-Remove default param values for IterOpenCLKernelCreator<T>::SharedDataIndexDefines in cpp file.
-Change more NULL to nullptr.
2017-02-26 03:02:21 -05:00
if ( m_Fractorium - > DrawImage ( ) )
{
GLController ( ) - > DrawImage ( ) ;
}
else
{
glClearColor ( 0.0 , 0.0 , 0.0 , 1.0 ) ;
glClear ( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ) ;
}
2014-07-08 03:11:14 -04:00
//Affine drawing.
2020-01-25 18:50:53 -05:00
bool pre = m_Fractorium - > DrawPreAffines ( ) ;
bool post = m_Fractorium - > DrawPostAffines ( ) ;
2018-03-28 00:32:10 -04:00
this - > glEnable ( GL_BLEND ) ;
this - > glEnable ( GL_LINE_SMOOTH ) ;
this - > glEnable ( GL_POINT_SMOOTH ) ;
2017-12-13 18:32:50 -05:00
# if defined (__APPLE__) || defined(MACOSX)
2018-03-28 00:32:10 -04:00
this - > glBlendFuncSeparate ( GL_SRC_ALPHA , GL_ONE_MINUS_SRC_ALPHA , GL_ONE , GL_ONE_MINUS_SRC_COLOR ) ;
2017-12-13 18:32:50 -05:00
# else
2018-03-28 00:32:10 -04:00
this - > glBlendFuncSeparate ( GL_SRC_ALPHA , GL_ONE_MINUS_SRC_ALPHA , GL_ONE , GL_ZERO ) ;
2017-12-13 18:32:50 -05:00
# endif
2018-03-28 00:32:10 -04:00
# ifndef USE_GLSL
this - > glMatrixMode ( GL_PROJECTION ) ;
this - > glPushMatrix ( ) ;
this - > glLoadIdentity ( ) ;
this - > glOrtho ( - unitX , unitX , - unitY , unitY , - 1 , 1 ) ; //Projection matrix: OpenGL camera is always centered, just move the ember internally inside the renderer.
this - > glMatrixMode ( GL_MODELVIEW ) ;
this - > glPushMatrix ( ) ;
this - > glLoadIdentity ( ) ;
2014-07-08 03:11:14 -04:00
controller - > GLController ( ) - > DrawAffines ( pre , post ) ;
2018-03-28 00:32:10 -04:00
this - > glMatrixMode ( GL_PROJECTION ) ;
this - > glPopMatrix ( ) ;
this - > glMatrixMode ( GL_MODELVIEW ) ;
this - > glPopMatrix ( ) ;
# else
m_Program - > bind ( ) ;
m_ProjMatrix . setToIdentity ( ) ;
2020-01-19 01:29:08 -05:00
m_ProjMatrix . ortho ( - unitX , unitX , - unitY , unitY , - 1 , 1 ) ; //Projection matrix: OpenGL camera is always centered, just move the ember internally inside the renderer.
2018-03-28 00:32:10 -04:00
m_ModelViewMatrix . setToIdentity ( ) ;
//this->DrawUnitSquare();
controller - > GLController ( ) - > DrawAffines ( pre , post ) ;
m_Program - > release ( ) ;
# endif
this - > glDisable ( GL_BLEND ) ;
this - > glDisable ( GL_LINE_SMOOTH ) ;
this - > glDisable ( GL_POINT_SMOOTH ) ;
2014-07-08 03:11:14 -04:00
m_Drawing = false ;
}
}
/// <summary>
/// Draw the image on the quad.
/// </summary>
template < typename T >
void GLEmberController < T > : : DrawImage ( )
{
2016-02-02 20:51:58 -05:00
auto renderer = m_FractoriumEmberController - > Renderer ( ) ;
auto ember = m_FractoriumEmberController - > CurrentEmber ( ) ;
2014-07-08 03:11:14 -04:00
m_GL - > glClearColor ( ember - > m_Background . r , ember - > m_Background . g , ember - > m_Background . b , 1.0 ) ;
--User changes
-Add a palette editor.
-Add support for reading .ugr/.gradient/.gradients palette files.
-Allow toggling on spinners whose minimum value is not zero.
-Allow toggling display of image, affines and grid.
-Add new variations: cylinder2, circlesplit, tile_log, truchet_fill, waves2_radial.
--Bug fixes
-cpow2 was wrong.
-Palettes with rapid changes in color would produce slightly different outputs from Apo/Chaotica. This was due to a long standing bug from flam3.
-Use exec() on Apple and show() on all other OSes for dialog boxes.
-Trying to render a sequence with no frames would crash.
-Selecting multiple xforms and rotating them would produce the wrong rotation.
-Better handling when parsing flames using different encoding, such as unicode and UTF-8.
-Switching between SP/DP didn't reselect the selected flame in the Library tab.
--Code changes
-Make all types concerning palettes be floats, including PaletteTableWidgetItem.
-PaletteTableWidgetItem is no longer templated because all palettes are float.
-Include the source colors for user created gradients.
-Change parallel_for() calls to work with very old versions of TBB which are lingering on some systems.
-Split conditional out of accumulation loop on the CPU for better performance.
-Vectorize summing when doing density filter for better performance.
-Make all usage of palettes be of type float, double is pointless.
-Allow palettes to reside in multiple folders, while ensuring only one of each name is added.
-Refactor some palette path searching code.
-Make ReadFile() throw and catch an exception if the file operation fails.
-A little extra safety in foci and foci3D with a call to Zeps().
-Cast to (real_t) in the OpenCL string for the w variation, which was having trouble compiling on Mac.
-Fixing missing comma between paths in InitPaletteList().
-Move Xml and PaletteList classes into cpp to shorten build times when working on them.
-Remove default param values for IterOpenCLKernelCreator<T>::SharedDataIndexDefines in cpp file.
-Change more NULL to nullptr.
2017-02-26 03:02:21 -05:00
m_GL - > glClear ( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ) ;
2014-07-08 03:11:14 -04:00
renderer - > EnterFinalAccum ( ) ; //Lock, may not be necessary, but just in case.
renderer - > EnterResize ( ) ;
2016-01-04 19:50:15 -05:00
2014-10-14 11:53:15 -04:00
if ( SizesMatch ( ) ) //Ensure all sizes are correct. If not, do nothing.
2014-07-08 03:11:14 -04:00
{
2018-04-29 01:28:05 -04:00
m_GL - > DrawQuad ( ) ; //Output image is drawn here.
2014-07-08 03:11:14 -04:00
}
2016-01-04 19:50:15 -05:00
2014-07-08 03:11:14 -04:00
renderer - > LeaveResize ( ) ; //Unlock, may not be necessary.
renderer - > LeaveFinalAccum ( ) ;
}
/// <summary>
/// Draw the affine circles.
/// </summary>
/// <param name="pre">True to draw pre affines, else don't.</param>
/// <param name="post">True to draw post affines, else don't.</param>
template < typename T >
void GLEmberController < T > : : DrawAffines ( bool pre , bool post )
{
2017-03-04 10:46:28 -05:00
QueryVMP ( ) ; //Resolves to float or double specialization function depending on T.
2018-08-10 21:06:04 -04:00
if ( ! m_Fractorium - > DrawXforms ( ) )
--User changes
-Add a palette editor.
-Add support for reading .ugr/.gradient/.gradients palette files.
-Allow toggling on spinners whose minimum value is not zero.
-Allow toggling display of image, affines and grid.
-Add new variations: cylinder2, circlesplit, tile_log, truchet_fill, waves2_radial.
--Bug fixes
-cpow2 was wrong.
-Palettes with rapid changes in color would produce slightly different outputs from Apo/Chaotica. This was due to a long standing bug from flam3.
-Use exec() on Apple and show() on all other OSes for dialog boxes.
-Trying to render a sequence with no frames would crash.
-Selecting multiple xforms and rotating them would produce the wrong rotation.
-Better handling when parsing flames using different encoding, such as unicode and UTF-8.
-Switching between SP/DP didn't reselect the selected flame in the Library tab.
--Code changes
-Make all types concerning palettes be floats, including PaletteTableWidgetItem.
-PaletteTableWidgetItem is no longer templated because all palettes are float.
-Include the source colors for user created gradients.
-Change parallel_for() calls to work with very old versions of TBB which are lingering on some systems.
-Split conditional out of accumulation loop on the CPU for better performance.
-Vectorize summing when doing density filter for better performance.
-Make all usage of palettes be of type float, double is pointless.
-Allow palettes to reside in multiple folders, while ensuring only one of each name is added.
-Refactor some palette path searching code.
-Make ReadFile() throw and catch an exception if the file operation fails.
-A little extra safety in foci and foci3D with a call to Zeps().
-Cast to (real_t) in the OpenCL string for the w variation, which was having trouble compiling on Mac.
-Fixing missing comma between paths in InitPaletteList().
-Move Xml and PaletteList classes into cpp to shorten build times when working on them.
-Remove default param values for IterOpenCLKernelCreator<T>::SharedDataIndexDefines in cpp file.
-Change more NULL to nullptr.
2017-02-26 03:02:21 -05:00
return ;
2016-02-02 20:51:58 -05:00
auto ember = m_FractoriumEmberController - > CurrentEmber ( ) ;
2016-01-04 19:50:15 -05:00
bool dragging = m_DragState = = eDragState : : DragDragging ;
2017-07-27 00:25:44 -04:00
bool forceFinal = m_Fractorium - > HaveFinal ( ) ;
2014-07-08 03:11:14 -04:00
2018-08-10 21:06:04 -04:00
if ( m_DragState = = eDragState : : DragRotateScale )
{
auto dprf = m_GL - > devicePixelRatioF ( ) ;
auto world = ScrolledCenter ( true ) ;
m_GL - > glLineWidth ( 1.0f * dprf ) ;
GLfloat vertices [ ] =
{
GLfloat ( m_MouseWorldPos . x ) , GLfloat ( m_MouseWorldPos . y ) , //Mouse position while dragging with right button down...
GLfloat ( world . x ) , GLfloat ( world . y ) //...to center.
} ;
QVector4D col ( 0.0f , 1.0f , 1.0f , 1.0f ) ;
m_GL - > DrawPointOrLine ( col , vertices , 2 , GL_LINES ) ;
}
2014-07-08 03:11:14 -04:00
//Draw grid if control key is pressed.
--User changes
-Add a palette editor.
-Add support for reading .ugr/.gradient/.gradients palette files.
-Allow toggling on spinners whose minimum value is not zero.
-Allow toggling display of image, affines and grid.
-Add new variations: cylinder2, circlesplit, tile_log, truchet_fill, waves2_radial.
--Bug fixes
-cpow2 was wrong.
-Palettes with rapid changes in color would produce slightly different outputs from Apo/Chaotica. This was due to a long standing bug from flam3.
-Use exec() on Apple and show() on all other OSes for dialog boxes.
-Trying to render a sequence with no frames would crash.
-Selecting multiple xforms and rotating them would produce the wrong rotation.
-Better handling when parsing flames using different encoding, such as unicode and UTF-8.
-Switching between SP/DP didn't reselect the selected flame in the Library tab.
--Code changes
-Make all types concerning palettes be floats, including PaletteTableWidgetItem.
-PaletteTableWidgetItem is no longer templated because all palettes are float.
-Include the source colors for user created gradients.
-Change parallel_for() calls to work with very old versions of TBB which are lingering on some systems.
-Split conditional out of accumulation loop on the CPU for better performance.
-Vectorize summing when doing density filter for better performance.
-Make all usage of palettes be of type float, double is pointless.
-Allow palettes to reside in multiple folders, while ensuring only one of each name is added.
-Refactor some palette path searching code.
-Make ReadFile() throw and catch an exception if the file operation fails.
-A little extra safety in foci and foci3D with a call to Zeps().
-Cast to (real_t) in the OpenCL string for the w variation, which was having trouble compiling on Mac.
-Fixing missing comma between paths in InitPaletteList().
-Move Xml and PaletteList classes into cpp to shorten build times when working on them.
-Remove default param values for IterOpenCLKernelCreator<T>::SharedDataIndexDefines in cpp file.
-Change more NULL to nullptr.
2017-02-26 03:02:21 -05:00
if ( ( m_GL - > hasFocus ( ) & & GetControl ( ) ) | | m_Fractorium - > DrawGrid ( ) )
DrawGrid ( ) ;
2014-07-26 15:03:51 -04:00
2014-07-08 03:11:14 -04:00
//When dragging, only draw the selected xform's affine and hide all others.
2014-07-26 15:03:51 -04:00
if ( ! m_Fractorium - > m_Settings - > ShowAllXforms ( ) & & dragging )
2014-07-08 03:11:14 -04:00
{
if ( m_SelectedXform )
2018-09-15 06:11:12 -04:00
DrawAffine ( m_SelectedXform , m_AffineType = = eAffineType : : AffinePre , true , false ) ;
2014-07-08 03:11:14 -04:00
}
2014-07-26 15:03:51 -04:00
else //Show all while dragging, or not dragging just hovering/mouse move.
2014-07-08 03:11:14 -04:00
{
if ( pre & & m_Fractorium - > DrawAllPre ( ) ) //Draw all pre affine if specified.
{
2017-05-31 22:50:05 -04:00
size_t i = 0 ;
2019-06-21 20:51:20 -04:00
bool any = false ;
while ( auto xform = ember - > GetTotalXform ( i , forceFinal ) )
if ( m_Fractorium - > IsXformSelected ( i + + ) )
{
any = true ;
break ;
}
i = 0 ;
2017-05-31 22:50:05 -04:00
2017-07-27 00:25:44 -04:00
while ( auto xform = ember - > GetTotalXform ( i , forceFinal ) )
2014-07-08 03:11:14 -04:00
{
2019-06-21 20:51:20 -04:00
bool selected = m_Fractorium - > IsXformSelected ( i + + ) | | ( ! any & & m_SelectedXform = = xform ) ;
2018-09-15 06:11:12 -04:00
DrawAffine ( xform , true , selected , ! dragging & & ( m_HoverXform = = xform ) ) ;
2014-07-08 03:11:14 -04:00
}
}
2018-09-15 06:11:12 -04:00
else if ( pre & & m_Fractorium - > DrawSelectedPre ( ) ) //Only draw selected pre affine, and if none are selected, draw current. All are considered "selected", so circles are drawn around them.
2014-07-08 03:11:14 -04:00
{
2018-09-15 06:11:12 -04:00
size_t i = 0 ;
bool any = false ;
while ( auto xform = ember - > GetTotalXform ( i , forceFinal ) )
{
if ( m_Fractorium - > IsXformSelected ( i + + ) )
{
DrawAffine ( xform , true , true , ! dragging & & ( m_HoverXform = = xform ) ) ;
any = true ;
}
}
if ( ! any )
DrawAffine ( m_FractoriumEmberController - > CurrentXform ( ) , true , true , ! dragging & & ( m_HoverXform = = m_FractoriumEmberController - > CurrentXform ( ) ) ) ;
}
2014-07-08 03:11:14 -04:00
if ( post & & m_Fractorium - > DrawAllPost ( ) ) //Draw all post affine if specified.
{
2017-05-31 22:50:05 -04:00
size_t i = 0 ;
2019-06-21 20:51:20 -04:00
bool any = false ;
while ( auto xform = ember - > GetTotalXform ( i , forceFinal ) )
if ( m_Fractorium - > IsXformSelected ( i + + ) )
{
any = true ;
break ;
}
i = 0 ;
2017-05-31 22:50:05 -04:00
2017-07-27 00:25:44 -04:00
while ( auto xform = ember - > GetTotalXform ( i , forceFinal ) )
2014-07-08 03:11:14 -04:00
{
2019-06-21 20:51:20 -04:00
bool selected = m_Fractorium - > IsXformSelected ( i + + ) | | ( ! any & & m_SelectedXform = = xform ) ;
2018-09-15 06:11:12 -04:00
DrawAffine ( xform , false , selected , ! dragging & & ( m_HoverXform = = xform ) ) ;
2014-07-08 03:11:14 -04:00
}
}
2018-09-15 06:11:12 -04:00
else if ( post & & m_Fractorium - > DrawSelectedPost ( ) ) //Only draw selected post, and if none are selected, draw current. All are considered "selected", so circles are drawn around them.
2014-07-08 03:11:14 -04:00
{
2018-09-15 06:11:12 -04:00
size_t i = 0 ;
bool any = false ;
while ( auto xform = ember - > GetTotalXform ( i , forceFinal ) )
{
if ( m_Fractorium - > IsXformSelected ( i + + ) )
{
DrawAffine ( xform , false , true , ! dragging & & ( m_HoverXform = = xform ) ) ;
any = true ;
}
}
if ( ! any )
DrawAffine ( m_FractoriumEmberController - > CurrentXform ( ) , false , true , ! dragging & & ( m_HoverXform = = m_FractoriumEmberController - > CurrentXform ( ) ) ) ;
}
2014-07-26 15:03:51 -04:00
}
2014-07-08 03:11:14 -04:00
2014-07-26 15:03:51 -04:00
if ( dragging ) //Draw large yellow dot on select or drag.
{
2018-03-28 00:32:10 -04:00
# ifndef USE_GLSL
2014-07-26 15:03:51 -04:00
m_GL - > glBegin ( GL_POINTS ) ;
m_GL - > glColor4f ( 1.0f , 1.0f , 0.5f , 1.0f ) ;
m_GL - > glVertex2f ( m_DragHandlePos . x , m_DragHandlePos . y ) ;
m_GL - > glEnd ( ) ;
2018-03-28 00:32:10 -04:00
# else
GLfloat vertices [ ] = //Should these be of type T?//TODO
{
2018-03-29 19:10:22 -04:00
GLfloat ( m_DragHandlePos . x ) , GLfloat ( m_DragHandlePos . y )
2018-03-28 00:32:10 -04:00
} ;
QVector4D col ( 1.0f , 1.0f , 0.5f , 1.0f ) ;
2018-07-31 00:39:41 -04:00
m_GL - > DrawPointOrLine ( col , vertices , 1 , GL_POINTS , false , 6.0f ) ;
2018-03-28 00:32:10 -04:00
# endif
2014-07-26 15:03:51 -04:00
}
2016-12-05 22:04:33 -05:00
else if ( m_DragState = = eDragState : : DragSelect )
{
--User changes
-Support 4k monitors, and in general, properly scale any monitor that is not HD.
-Allow for a spatial filter of radius zero, which means do not use a spatial filter.
-Add new variations: concentric, cpow3, helicoid, helix, rand_cubes, sphereblur.
-Use a new method for computing elliptic which is more precise. Developed by Discord user Claude.
-Remove the 8 variation per xform limitation on the GPU.
-Allow for loading the last flame file on startup, rather than randoms.
-Use two different default quality values in the interactive renderer, one each for CPU and GPU.
-Creating linked xforms was using non-standard behavior. Make it match Apo and also support creating multiple linked xforms at once.
--Bug fixes
-No variations in an xform used to have the same behavior as a single linear variation with weight 1. While sensible, this breaks backward compatibility. No variations now sets the output point to zeroes.
-Prevent crashing the program when adjusting a value on the main window while a final render is in progress.
-The xaos table was inverted.
--Code changes
-Convert projects to Visual Studio 2017.
-Change bad vals from +- 1e10 to +-1e20.
-Reintroduce the symmetry tag in xforms for legacy support in programs that do not use color_speed.
-Compiler will not let us use default values in templated member functions anymore.
2017-11-26 20:27:00 -05:00
m_GL - > glLineWidth ( 2.0f * m_GL - > devicePixelRatioF ( ) ) ;
2018-03-28 00:32:10 -04:00
# ifndef USE_GLSL
2016-12-05 22:04:33 -05:00
m_GL - > glBegin ( GL_LINES ) ;
m_GL - > glColor4f ( 0.0f , 0.0f , 1.0f , 1.0f ) ;
m_GL - > glVertex2f ( m_MouseDownWorldPos . x , m_MouseDownWorldPos . y ) ; //UL->UR
m_GL - > glVertex2f ( m_MouseWorldPos . x , m_MouseDownWorldPos . y ) ;
m_GL - > glVertex2f ( m_MouseDownWorldPos . x , m_MouseWorldPos . y ) ; //LL->LR
m_GL - > glVertex2f ( m_MouseWorldPos . x , m_MouseWorldPos . y ) ;
m_GL - > glVertex2f ( m_MouseDownWorldPos . x , m_MouseDownWorldPos . y ) ; //UL->LL
m_GL - > glVertex2f ( m_MouseDownWorldPos . x , m_MouseWorldPos . y ) ;
m_GL - > glVertex2f ( m_MouseWorldPos . x , m_MouseDownWorldPos . y ) ; //UR->LR
m_GL - > glVertex2f ( m_MouseWorldPos . x , m_MouseWorldPos . y ) ;
m_GL - > glEnd ( ) ;
2018-03-28 00:32:10 -04:00
# else
GLfloat vertices [ ] = //Should these be of type T?//TODO
{
2018-03-29 19:10:22 -04:00
GLfloat ( m_MouseDownWorldPos . x ) , GLfloat ( m_MouseDownWorldPos . y ) , //UL->UR
GLfloat ( m_MouseWorldPos . x ) , GLfloat ( m_MouseDownWorldPos . y ) ,
GLfloat ( m_MouseDownWorldPos . x ) , GLfloat ( m_MouseWorldPos . y ) , //LL->LR
GLfloat ( m_MouseWorldPos . x ) , GLfloat ( m_MouseWorldPos . y ) ,
GLfloat ( m_MouseDownWorldPos . x ) , GLfloat ( m_MouseDownWorldPos . y ) , //UL->LL
GLfloat ( m_MouseDownWorldPos . x ) , GLfloat ( m_MouseWorldPos . y ) ,
GLfloat ( m_MouseWorldPos . x ) , GLfloat ( m_MouseDownWorldPos . y ) , //UR->LR
GLfloat ( m_MouseWorldPos . x ) , GLfloat ( m_MouseWorldPos . y )
2018-03-28 00:32:10 -04:00
} ;
QVector4D col ( 0.0f , 0.0f , 1.0f , 1.0f ) ;
m_GL - > DrawPointOrLine ( col , vertices , 8 , GL_LINES ) ;
# endif
--User changes
-Support 4k monitors, and in general, properly scale any monitor that is not HD.
-Allow for a spatial filter of radius zero, which means do not use a spatial filter.
-Add new variations: concentric, cpow3, helicoid, helix, rand_cubes, sphereblur.
-Use a new method for computing elliptic which is more precise. Developed by Discord user Claude.
-Remove the 8 variation per xform limitation on the GPU.
-Allow for loading the last flame file on startup, rather than randoms.
-Use two different default quality values in the interactive renderer, one each for CPU and GPU.
-Creating linked xforms was using non-standard behavior. Make it match Apo and also support creating multiple linked xforms at once.
--Bug fixes
-No variations in an xform used to have the same behavior as a single linear variation with weight 1. While sensible, this breaks backward compatibility. No variations now sets the output point to zeroes.
-Prevent crashing the program when adjusting a value on the main window while a final render is in progress.
-The xaos table was inverted.
--Code changes
-Convert projects to Visual Studio 2017.
-Change bad vals from +- 1e10 to +-1e20.
-Reintroduce the symmetry tag in xforms for legacy support in programs that do not use color_speed.
-Compiler will not let us use default values in templated member functions anymore.
2017-11-26 20:27:00 -05:00
m_GL - > glLineWidth ( 1.0f * m_GL - > devicePixelRatioF ( ) ) ;
2016-12-05 22:04:33 -05:00
}
2016-01-04 19:50:15 -05:00
else if ( m_HoverType ! = eHoverType : : HoverNone & & m_HoverXform = = m_SelectedXform ) //Draw large turquoise dot on hover if they are hovering over the selected xform.
2014-07-26 15:03:51 -04:00
{
2018-03-28 00:32:10 -04:00
# ifndef USE_GLSL
2014-07-26 15:03:51 -04:00
m_GL - > glBegin ( GL_POINTS ) ;
m_GL - > glColor4f ( 0.5f , 1.0f , 1.0f , 1.0f ) ;
m_GL - > glVertex2f ( m_HoverHandlePos . x , m_HoverHandlePos . y ) ;
m_GL - > glEnd ( ) ;
2018-03-28 00:32:10 -04:00
# else
GLfloat vertices [ ] = //Should these be of type T?//TODO
{
2018-03-29 19:10:22 -04:00
GLfloat ( m_HoverHandlePos . x ) , GLfloat ( m_HoverHandlePos . y )
2018-03-28 00:32:10 -04:00
} ;
QVector4D col ( 0.5f , 1.0f , 1.0f , 1.0f ) ;
2018-07-31 00:39:41 -04:00
m_GL - > DrawPointOrLine ( col , vertices , 1 , GL_POINTS , false , 6.0f ) ;
2018-03-28 00:32:10 -04:00
# endif
2014-07-08 03:11:14 -04:00
}
}
/// <summary>
/// Set drag modifiers based on key press.
/// </summary>
/// <param name="e">The event</param>
2014-12-11 00:50:15 -05:00
bool GLEmberControllerBase : : KeyPress_ ( QKeyEvent * e )
2014-07-08 03:11:14 -04:00
{
if ( e - > key ( ) = = Qt : : Key_Control )
{
2016-01-04 19:50:15 -05:00
SetControl ( ) ;
2014-07-08 03:11:14 -04:00
return true ;
2019-06-11 22:25:21 -04:00
}
2014-07-08 03:11:14 -04:00
return false ;
}
/// <summary>
--User changes
-Add a palette editor.
-Add support for reading .ugr/.gradient/.gradients palette files.
-Allow toggling on spinners whose minimum value is not zero.
-Allow toggling display of image, affines and grid.
-Add new variations: cylinder2, circlesplit, tile_log, truchet_fill, waves2_radial.
--Bug fixes
-cpow2 was wrong.
-Palettes with rapid changes in color would produce slightly different outputs from Apo/Chaotica. This was due to a long standing bug from flam3.
-Use exec() on Apple and show() on all other OSes for dialog boxes.
-Trying to render a sequence with no frames would crash.
-Selecting multiple xforms and rotating them would produce the wrong rotation.
-Better handling when parsing flames using different encoding, such as unicode and UTF-8.
-Switching between SP/DP didn't reselect the selected flame in the Library tab.
--Code changes
-Make all types concerning palettes be floats, including PaletteTableWidgetItem.
-PaletteTableWidgetItem is no longer templated because all palettes are float.
-Include the source colors for user created gradients.
-Change parallel_for() calls to work with very old versions of TBB which are lingering on some systems.
-Split conditional out of accumulation loop on the CPU for better performance.
-Vectorize summing when doing density filter for better performance.
-Make all usage of palettes be of type float, double is pointless.
-Allow palettes to reside in multiple folders, while ensuring only one of each name is added.
-Refactor some palette path searching code.
-Make ReadFile() throw and catch an exception if the file operation fails.
-A little extra safety in foci and foci3D with a call to Zeps().
-Cast to (real_t) in the OpenCL string for the w variation, which was having trouble compiling on Mac.
-Fixing missing comma between paths in InitPaletteList().
-Move Xml and PaletteList classes into cpp to shorten build times when working on them.
-Remove default param values for IterOpenCLKernelCreator<T>::SharedDataIndexDefines in cpp file.
-Change more NULL to nullptr.
2017-02-26 03:02:21 -05:00
/// Call controller KeyPress().
2014-07-08 03:11:14 -04:00
/// </summary>
/// <param name="e">The event</param>
void GLWidget : : keyPressEvent ( QKeyEvent * e )
{
2014-12-11 00:50:15 -05:00
if ( ! GLController ( ) | | ! GLController ( ) - > KeyPress_ ( e ) )
2015-01-01 10:17:05 -05:00
QOpenGLWidget : : keyPressEvent ( e ) ;
2014-07-08 03:11:14 -04:00
update ( ) ;
}
/// <summary>
/// Set drag modifiers based on key release.
/// </summary>
/// <param name="e">The event</param>
2014-12-11 00:50:15 -05:00
bool GLEmberControllerBase : : KeyRelease_ ( QKeyEvent * e )
2014-07-08 03:11:14 -04:00
{
if ( e - > key ( ) = = Qt : : Key_Control )
{
2019-06-11 22:25:21 -04:00
ClearControl ( ) ;
2014-07-08 03:11:14 -04:00
return true ;
}
return false ;
}
/// <summary>
2014-12-11 00:50:15 -05:00
/// Call controller KeyRelease_().
2014-07-08 03:11:14 -04:00
/// </summary>
/// <param name="e">The event</param>
void GLWidget : : keyReleaseEvent ( QKeyEvent * e )
2016-01-04 19:50:15 -05:00
{
2014-12-11 00:50:15 -05:00
if ( ! GLController ( ) | | ! GLController ( ) - > KeyRelease_ ( e ) )
2015-01-01 10:17:05 -05:00
QOpenGLWidget : : keyReleaseEvent ( e ) ;
2014-07-08 03:11:14 -04:00
update ( ) ;
}
/// <summary>
/// Determine if the mouse click was over an affine circle
/// and set the appropriate selection information to be used
/// on subsequent mouse move events.
/// If nothing was selected, then reset the selection and drag states.
/// </summary>
/// <param name="e">The event</param>
template < typename T >
void GLEmberController < T > : : MousePress ( QMouseEvent * e )
{
--User changes
-Support 4k monitors, and in general, properly scale any monitor that is not HD.
-Allow for a spatial filter of radius zero, which means do not use a spatial filter.
-Add new variations: concentric, cpow3, helicoid, helix, rand_cubes, sphereblur.
-Use a new method for computing elliptic which is more precise. Developed by Discord user Claude.
-Remove the 8 variation per xform limitation on the GPU.
-Allow for loading the last flame file on startup, rather than randoms.
-Use two different default quality values in the interactive renderer, one each for CPU and GPU.
-Creating linked xforms was using non-standard behavior. Make it match Apo and also support creating multiple linked xforms at once.
--Bug fixes
-No variations in an xform used to have the same behavior as a single linear variation with weight 1. While sensible, this breaks backward compatibility. No variations now sets the output point to zeroes.
-Prevent crashing the program when adjusting a value on the main window while a final render is in progress.
-The xaos table was inverted.
--Code changes
-Convert projects to Visual Studio 2017.
-Change bad vals from +- 1e10 to +-1e20.
-Reintroduce the symmetry tag in xforms for legacy support in programs that do not use color_speed.
-Compiler will not let us use default values in templated member functions anymore.
2017-11-26 20:27:00 -05:00
v3T mouseFlipped ( e - > x ( ) * m_GL - > devicePixelRatioF ( ) , m_Viewport [ 3 ] - e - > y ( ) * m_GL - > devicePixelRatioF ( ) , 0 ) ; //Must flip y because in OpenGL, 0,0 is bottom left, but in windows, it's top left.
2016-02-02 20:51:58 -05:00
auto ember = m_FractoriumEmberController - > CurrentEmber ( ) ;
auto renderer = m_FractoriumEmberController - > Renderer ( ) ;
2014-07-08 03:11:14 -04:00
//Ensure everything has been initialized.
if ( ! renderer )
return ;
--User changes
-Support 4k monitors, and in general, properly scale any monitor that is not HD.
-Allow for a spatial filter of radius zero, which means do not use a spatial filter.
-Add new variations: concentric, cpow3, helicoid, helix, rand_cubes, sphereblur.
-Use a new method for computing elliptic which is more precise. Developed by Discord user Claude.
-Remove the 8 variation per xform limitation on the GPU.
-Allow for loading the last flame file on startup, rather than randoms.
-Use two different default quality values in the interactive renderer, one each for CPU and GPU.
-Creating linked xforms was using non-standard behavior. Make it match Apo and also support creating multiple linked xforms at once.
--Bug fixes
-No variations in an xform used to have the same behavior as a single linear variation with weight 1. While sensible, this breaks backward compatibility. No variations now sets the output point to zeroes.
-Prevent crashing the program when adjusting a value on the main window while a final render is in progress.
-The xaos table was inverted.
--Code changes
-Convert projects to Visual Studio 2017.
-Change bad vals from +- 1e10 to +-1e20.
-Reintroduce the symmetry tag in xforms for legacy support in programs that do not use color_speed.
-Compiler will not let us use default values in templated member functions anymore.
2017-11-26 20:27:00 -05:00
m_MouseDownPos = glm : : ivec2 ( e - > x ( ) * m_GL - > devicePixelRatioF ( ) , e - > y ( ) * m_GL - > devicePixelRatioF ( ) ) ; //Capture the raster coordinates of where the mouse was clicked.
2014-07-08 03:11:14 -04:00
m_MouseWorldPos = WindowToWorld ( mouseFlipped , false ) ; //Capture the world cartesian coordinates of where the mouse is.
m_BoundsDown . w = renderer - > LowerLeftX ( false ) ; //Need to capture these because they'll be changing if scaling.
m_BoundsDown . x = renderer - > LowerLeftY ( false ) ;
m_BoundsDown . y = renderer - > UpperRightX ( false ) ;
m_BoundsDown . z = renderer - > UpperRightY ( false ) ;
2016-02-12 00:38:21 -05:00
auto mod = e - > modifiers ( ) ;
2016-01-04 19:50:15 -05:00
2014-07-08 03:11:14 -04:00
if ( mod . testFlag ( Qt : : ShiftModifier ) )
2016-01-04 19:50:15 -05:00
SetShift ( ) ;
2016-05-02 19:54:56 -04:00
if ( mod . testFlag ( Qt : : AltModifier ) )
2016-01-04 19:50:15 -05:00
SetAlt ( ) ;
if ( m_DragState = = eDragState : : DragNone ) //Only take action if the user wasn't already dragging.
2014-07-08 03:11:14 -04:00
{
m_MouseDownWorldPos = m_MouseWorldPos ; //Set the mouse down position to the current position.
if ( e - > button ( ) & Qt : : LeftButton )
{
int xformIndex = UpdateHover ( mouseFlipped ) ; //Determine if an affine circle was clicked.
if ( m_HoverXform & & xformIndex ! = - 1 )
{
m_SelectedXform = m_HoverXform ;
2016-01-04 19:50:15 -05:00
m_DragSrcTransform = Affine2D < T > ( m_AffineType = = eAffineType : : AffinePre ? m_SelectedXform - > m_Affine : m_SelectedXform - > m_Post ) ; //Copy the affine of the xform that was selected.
2014-07-08 03:11:14 -04:00
//The user has selected an xform by clicking on it, so update the main GUI by selecting this xform in the combo box.
2016-02-02 20:51:58 -05:00
m_Fractorium - > CurrentXform ( xformIndex ) ; //Must do this first so UpdateXform() below properly grabs the current plus any selected.
2019-06-19 00:29:58 -04:00
m_DragSrcPreTransforms . clear ( ) ;
m_DragSrcPostTransforms . clear ( ) ;
--User changes
-No longer constrain pitch, yaw or depth spinners to -180 - 180.
--Bug fixes
-Properly set color index on padded xforms.
-Adding a padding final xform included a linear variation with a weight of zero to not appear empty. Made it have a weight of 1.
-Always write animate tag on final xform when saving to Xml.
-Motion was being applied to the wrong flame in SheepTools::Edge(), so apply it to the correct one.
-Prevent divide by zero when normalizing variation weights.
-Was accidentally adding the placeholder value of -9999 for motion_offset to varation weights and parameters when applying motion. Set to zero if no value present.
-Clamp flame rotation values to -180 - 180 when reading a flame from Xml.
-Events were not properly wired for user changes in the random rotations per blend controls in the sequencer.
-Fix major UI bugs with sequencer min/max random controls which made it nearly impossible to hand type values.
-Values from rotations per blend and rotations per blend max were not being saved to file between program runs.
-Checking animate for an xform was not applied to all flames even if Apply All was checked.
-Changing interpolation type, temporal filter width, temporal type, and affine interpolation type were not actually saving to the flame when changed.
-Grid on the main window was not being drawn at the right scale initially due to some OpenGL initialization occurring in the wrong order.
-Severe bugs in sequence generation code:
--Improperly detected padding xforms.
--When looking for specific variations during xform aligning, only presence was detected, when it should have been presence plus a weight greater than zero.
--When adding specific variations during xform aligning, must first remove any variations of that type.
--Two variables were unsigned when they should have been signed. This prevented large blocks of code from ever executing.
--When interpolating affines, an EPS that was too small was used, causing affine values to interpolate incorrectly. Instead use 1e-10 to ensure results equal to flam3.
--Code changes
-Modify FractoriumEmberController::UpdateXform() to pass the selected xform index as well as the absolute index to func().
2018-06-13 00:20:15 -04:00
m_FractoriumEmberController - > UpdateXform ( [ & ] ( Xform < T > * xform , size_t xfindex , size_t selIndex )
2016-02-12 00:38:21 -05:00
{
2019-06-19 00:29:58 -04:00
if ( m_AffineType = = eAffineType : : AffinePre )
m_DragSrcPreTransforms [ xfindex ] = xform - > m_Affine ;
else
m_DragSrcPostTransforms [ xfindex ] = xform - > m_Post ;
2019-06-21 20:51:20 -04:00
} , eXformUpdate : : UPDATE_SELECTED , false ) ; //Don't update renderer here.
2016-02-02 20:51:58 -05:00
m_DragHandlePos = m_HoverHandlePos ; //The location in local coordinates of the point selected on the spinner, x, y or center.
m_DragState = eDragState : : DragDragging ;
2014-07-28 01:25:38 -04:00
m_GL - > repaint ( ) ;
2014-07-08 03:11:14 -04:00
}
else //Nothing was selected.
{
2015-01-02 18:11:36 -05:00
//m_SelectedXform = nullptr;
2019-06-19 00:29:58 -04:00
m_DragSrcPreTransforms . clear ( ) ;
m_DragSrcPostTransforms . clear ( ) ;
2016-01-04 19:50:15 -05:00
m_DragState = eDragState : : DragNone ;
2014-07-08 03:11:14 -04:00
}
}
2020-03-15 03:40:57 -04:00
else if ( e - > button ( ) = = Qt : : MiddleButton | | ( e - > button ( ) = = Qt : : RightButton & & e - > modifiers ( ) & Qt : : ShiftModifier ) ) //Middle button or right button with shift key, do whole image translation.
2014-07-08 03:11:14 -04:00
{
m_CenterDownX = ember - > m_CenterX ; //Capture where the center of the image is because this value will change when panning.
m_CenterDownY = ember - > m_CenterY ;
2016-01-04 19:50:15 -05:00
m_DragState = eDragState : : DragPanning ;
2014-07-08 03:11:14 -04:00
}
else if ( e - > button ( ) = = Qt : : RightButton ) //Right button does whole image rotation and scaling.
{
--User changes
-Add a palette editor.
-Add support for reading .ugr/.gradient/.gradients palette files.
-Allow toggling on spinners whose minimum value is not zero.
-Allow toggling display of image, affines and grid.
-Add new variations: cylinder2, circlesplit, tile_log, truchet_fill, waves2_radial.
--Bug fixes
-cpow2 was wrong.
-Palettes with rapid changes in color would produce slightly different outputs from Apo/Chaotica. This was due to a long standing bug from flam3.
-Use exec() on Apple and show() on all other OSes for dialog boxes.
-Trying to render a sequence with no frames would crash.
-Selecting multiple xforms and rotating them would produce the wrong rotation.
-Better handling when parsing flames using different encoding, such as unicode and UTF-8.
-Switching between SP/DP didn't reselect the selected flame in the Library tab.
--Code changes
-Make all types concerning palettes be floats, including PaletteTableWidgetItem.
-PaletteTableWidgetItem is no longer templated because all palettes are float.
-Include the source colors for user created gradients.
-Change parallel_for() calls to work with very old versions of TBB which are lingering on some systems.
-Split conditional out of accumulation loop on the CPU for better performance.
-Vectorize summing when doing density filter for better performance.
-Make all usage of palettes be of type float, double is pointless.
-Allow palettes to reside in multiple folders, while ensuring only one of each name is added.
-Refactor some palette path searching code.
-Make ReadFile() throw and catch an exception if the file operation fails.
-A little extra safety in foci and foci3D with a call to Zeps().
-Cast to (real_t) in the OpenCL string for the w variation, which was having trouble compiling on Mac.
-Fixing missing comma between paths in InitPaletteList().
-Move Xml and PaletteList classes into cpp to shorten build times when working on them.
-Remove default param values for IterOpenCLKernelCreator<T>::SharedDataIndexDefines in cpp file.
-Change more NULL to nullptr.
2017-02-26 03:02:21 -05:00
if ( m_Fractorium - > DrawImage ( ) )
{
m_CenterDownX = ember - > m_CenterX ; //Capture these because they will change when rotating and scaling.
m_CenterDownY = ember - > m_CenterY ;
m_RotationDown = ember - > m_Rotate ;
m_ScaleDown = ember - > m_PixelsPerUnit ;
m_DragState = eDragState : : DragRotateScale ;
}
2014-07-08 03:11:14 -04:00
}
}
}
/// <summary>
/// Call controller MousePress().
/// </summary>
/// <param name="e">The event</param>
void GLWidget : : mousePressEvent ( QMouseEvent * e )
{
setFocus ( ) ; //Must do this so that this window gets keyboard events.
2016-02-12 00:38:21 -05:00
if ( auto controller = GLController ( ) )
2014-07-08 03:11:14 -04:00
controller - > MousePress ( e ) ;
2015-01-01 10:17:05 -05:00
QOpenGLWidget : : mousePressEvent ( e ) ;
2014-07-08 03:11:14 -04:00
}
/// <summary>
/// Reset the selection and dragging state, but re-calculate the
/// hovering state because the mouse might still be over an affine circle.
/// </summary>
/// <param name="e">The event</param>
template < typename T >
void GLEmberController < T > : : MouseRelease ( QMouseEvent * e )
{
--User changes
-Support 4k monitors, and in general, properly scale any monitor that is not HD.
-Allow for a spatial filter of radius zero, which means do not use a spatial filter.
-Add new variations: concentric, cpow3, helicoid, helix, rand_cubes, sphereblur.
-Use a new method for computing elliptic which is more precise. Developed by Discord user Claude.
-Remove the 8 variation per xform limitation on the GPU.
-Allow for loading the last flame file on startup, rather than randoms.
-Use two different default quality values in the interactive renderer, one each for CPU and GPU.
-Creating linked xforms was using non-standard behavior. Make it match Apo and also support creating multiple linked xforms at once.
--Bug fixes
-No variations in an xform used to have the same behavior as a single linear variation with weight 1. While sensible, this breaks backward compatibility. No variations now sets the output point to zeroes.
-Prevent crashing the program when adjusting a value on the main window while a final render is in progress.
-The xaos table was inverted.
--Code changes
-Convert projects to Visual Studio 2017.
-Change bad vals from +- 1e10 to +-1e20.
-Reintroduce the symmetry tag in xforms for legacy support in programs that do not use color_speed.
-Compiler will not let us use default values in templated member functions anymore.
2017-11-26 20:27:00 -05:00
v3T mouseFlipped ( e - > x ( ) * m_GL - > devicePixelRatioF ( ) , m_Viewport [ 3 ] - e - > y ( ) * m_GL - > devicePixelRatioF ( ) , 0 ) ; //Must flip y because in OpenGL, 0,0 is bottom left, but in windows, it's top left.
2014-07-08 03:11:14 -04:00
m_MouseWorldPos = WindowToWorld ( mouseFlipped , false ) ;
2016-01-04 19:50:15 -05:00
if ( m_DragState = = eDragState : : DragDragging & & ( e - > button ( ) & Qt : : LeftButton ) )
UpdateHover ( mouseFlipped ) ;
2014-07-08 03:11:14 -04:00
2016-12-05 22:04:33 -05:00
if ( m_DragState = = eDragState : : DragNone )
m_Fractorium - > OnXformsSelectNoneButtonClicked ( false ) ;
2016-01-04 19:50:15 -05:00
m_DragState = eDragState : : DragNone ;
2014-07-08 03:11:14 -04:00
m_DragModifier = 0 ;
--User changes
-Add a palette editor.
-Add support for reading .ugr/.gradient/.gradients palette files.
-Allow toggling on spinners whose minimum value is not zero.
-Allow toggling display of image, affines and grid.
-Add new variations: cylinder2, circlesplit, tile_log, truchet_fill, waves2_radial.
--Bug fixes
-cpow2 was wrong.
-Palettes with rapid changes in color would produce slightly different outputs from Apo/Chaotica. This was due to a long standing bug from flam3.
-Use exec() on Apple and show() on all other OSes for dialog boxes.
-Trying to render a sequence with no frames would crash.
-Selecting multiple xforms and rotating them would produce the wrong rotation.
-Better handling when parsing flames using different encoding, such as unicode and UTF-8.
-Switching between SP/DP didn't reselect the selected flame in the Library tab.
--Code changes
-Make all types concerning palettes be floats, including PaletteTableWidgetItem.
-PaletteTableWidgetItem is no longer templated because all palettes are float.
-Include the source colors for user created gradients.
-Change parallel_for() calls to work with very old versions of TBB which are lingering on some systems.
-Split conditional out of accumulation loop on the CPU for better performance.
-Vectorize summing when doing density filter for better performance.
-Make all usage of palettes be of type float, double is pointless.
-Allow palettes to reside in multiple folders, while ensuring only one of each name is added.
-Refactor some palette path searching code.
-Make ReadFile() throw and catch an exception if the file operation fails.
-A little extra safety in foci and foci3D with a call to Zeps().
-Cast to (real_t) in the OpenCL string for the w variation, which was having trouble compiling on Mac.
-Fixing missing comma between paths in InitPaletteList().
-Move Xml and PaletteList classes into cpp to shorten build times when working on them.
-Remove default param values for IterOpenCLKernelCreator<T>::SharedDataIndexDefines in cpp file.
-Change more NULL to nullptr.
2017-02-26 03:02:21 -05:00
m_GL - > update ( ) ;
2014-07-08 03:11:14 -04:00
}
/// <summary>
/// Call controller MouseRelease().
/// </summary>
/// <param name="e">The event</param>
void GLWidget : : mouseReleaseEvent ( QMouseEvent * e )
{
setFocus ( ) ; //Must do this so that this window gets keyboard events.
2016-02-12 00:38:21 -05:00
if ( auto controller = GLController ( ) )
2014-07-08 03:11:14 -04:00
controller - > MouseRelease ( e ) ;
2015-01-01 10:17:05 -05:00
QOpenGLWidget : : mouseReleaseEvent ( e ) ;
2014-07-08 03:11:14 -04:00
}
/// <summary>
/// If dragging, update relevant values and reset entire rendering process.
/// If hovering, update display.
/// </summary>
/// <param name="e">The event</param>
template < typename T >
void GLEmberController < T > : : MouseMove ( QMouseEvent * e )
{
bool draw = true ;
--User changes
-Support 4k monitors, and in general, properly scale any monitor that is not HD.
-Allow for a spatial filter of radius zero, which means do not use a spatial filter.
-Add new variations: concentric, cpow3, helicoid, helix, rand_cubes, sphereblur.
-Use a new method for computing elliptic which is more precise. Developed by Discord user Claude.
-Remove the 8 variation per xform limitation on the GPU.
-Allow for loading the last flame file on startup, rather than randoms.
-Use two different default quality values in the interactive renderer, one each for CPU and GPU.
-Creating linked xforms was using non-standard behavior. Make it match Apo and also support creating multiple linked xforms at once.
--Bug fixes
-No variations in an xform used to have the same behavior as a single linear variation with weight 1. While sensible, this breaks backward compatibility. No variations now sets the output point to zeroes.
-Prevent crashing the program when adjusting a value on the main window while a final render is in progress.
-The xaos table was inverted.
--Code changes
-Convert projects to Visual Studio 2017.
-Change bad vals from +- 1e10 to +-1e20.
-Reintroduce the symmetry tag in xforms for legacy support in programs that do not use color_speed.
-Compiler will not let us use default values in templated member functions anymore.
2017-11-26 20:27:00 -05:00
glm : : ivec2 mouse ( e - > x ( ) * m_GL - > devicePixelRatioF ( ) , e - > y ( ) * m_GL - > devicePixelRatioF ( ) ) ;
v3T mouseFlipped ( e - > x ( ) * m_GL - > devicePixelRatioF ( ) , m_Viewport [ 3 ] - e - > y ( ) * m_GL - > devicePixelRatioF ( ) , 0 ) ; //Must flip y because in OpenGL, 0,0 is bottom left, but in windows, it's top left.
2016-02-02 20:51:58 -05:00
auto ember = m_FractoriumEmberController - > CurrentEmber ( ) ;
2016-01-04 19:50:15 -05:00
2014-07-08 03:11:14 -04:00
//First check to see if the mouse actually moved.
if ( mouse = = m_MousePos )
return ;
m_MousePos = mouse ;
m_MouseWorldPos = WindowToWorld ( mouseFlipped , false ) ;
//Update status bar on main window, regardless of whether anything is being dragged.
if ( m_Fractorium - > m_Controller - > RenderTimerRunning ( ) )
--User changes
-Support 4k monitors, and in general, properly scale any monitor that is not HD.
-Allow for a spatial filter of radius zero, which means do not use a spatial filter.
-Add new variations: concentric, cpow3, helicoid, helix, rand_cubes, sphereblur.
-Use a new method for computing elliptic which is more precise. Developed by Discord user Claude.
-Remove the 8 variation per xform limitation on the GPU.
-Allow for loading the last flame file on startup, rather than randoms.
-Use two different default quality values in the interactive renderer, one each for CPU and GPU.
-Creating linked xforms was using non-standard behavior. Make it match Apo and also support creating multiple linked xforms at once.
--Bug fixes
-No variations in an xform used to have the same behavior as a single linear variation with weight 1. While sensible, this breaks backward compatibility. No variations now sets the output point to zeroes.
-Prevent crashing the program when adjusting a value on the main window while a final render is in progress.
-The xaos table was inverted.
--Code changes
-Convert projects to Visual Studio 2017.
-Change bad vals from +- 1e10 to +-1e20.
-Reintroduce the symmetry tag in xforms for legacy support in programs that do not use color_speed.
-Compiler will not let us use default values in templated member functions anymore.
2017-11-26 20:27:00 -05:00
m_Fractorium - > SetCoordinateStatus ( e - > x ( ) * m_GL - > devicePixelRatioF ( ) , e - > y ( ) * m_GL - > devicePixelRatioF ( ) , m_MouseWorldPos . x , m_MouseWorldPos . y ) ;
2014-07-08 03:11:14 -04:00
2016-01-04 19:50:15 -05:00
if ( m_SelectedXform & & m_DragState = = eDragState : : DragDragging ) //Dragging and affine.
2014-07-08 03:11:14 -04:00
{
2016-01-04 19:50:15 -05:00
bool pre = m_AffineType = = eAffineType : : AffinePre ;
2014-07-08 03:11:14 -04:00
2016-01-04 19:50:15 -05:00
if ( m_HoverType = = eHoverType : : HoverTranslation )
2016-02-12 00:38:21 -05:00
CalcDragTranslation ( ) ;
2016-01-04 19:50:15 -05:00
else if ( m_HoverType = = eHoverType : : HoverXAxis )
2016-02-12 00:38:21 -05:00
CalcDragXAxis ( ) ;
2016-01-04 19:50:15 -05:00
else if ( m_HoverType = = eHoverType : : HoverYAxis )
2016-02-12 00:38:21 -05:00
CalcDragYAxis ( ) ;
2014-07-08 03:11:14 -04:00
m_FractoriumEmberController - > FillAffineWithXform ( m_SelectedXform , pre ) ; //Update the spinners in the affine tab of the main window.
m_FractoriumEmberController - > UpdateRender ( ) ; //Restart the rendering process.
}
2016-12-05 22:04:33 -05:00
else if ( ( m_DragState = = eDragState : : DragNone | | m_DragState = = eDragState : : DragSelect ) & & ( e - > buttons ( ) & Qt : : LeftButton ) )
{
m_DragState = eDragState : : DragSelect ; //Only set drag state once the user starts moving the mouse with the left button down.
//Iterate over each xform, seeing if it's in the bounding box.
QPointF tl ( m_MouseDownWorldPos . x , m_MouseDownWorldPos . y ) ;
QPointF br ( m_MouseWorldPos . x , m_MouseWorldPos . y ) ;
QRectF qrf ( tl , br ) ;
T scale = m_FractoriumEmberController - > AffineScaleCurrentToLocked ( ) ;
int i = 0 ;
--User changes
-No longer constrain pitch, yaw or depth spinners to -180 - 180.
--Bug fixes
-Properly set color index on padded xforms.
-Adding a padding final xform included a linear variation with a weight of zero to not appear empty. Made it have a weight of 1.
-Always write animate tag on final xform when saving to Xml.
-Motion was being applied to the wrong flame in SheepTools::Edge(), so apply it to the correct one.
-Prevent divide by zero when normalizing variation weights.
-Was accidentally adding the placeholder value of -9999 for motion_offset to varation weights and parameters when applying motion. Set to zero if no value present.
-Clamp flame rotation values to -180 - 180 when reading a flame from Xml.
-Events were not properly wired for user changes in the random rotations per blend controls in the sequencer.
-Fix major UI bugs with sequencer min/max random controls which made it nearly impossible to hand type values.
-Values from rotations per blend and rotations per blend max were not being saved to file between program runs.
-Checking animate for an xform was not applied to all flames even if Apply All was checked.
-Changing interpolation type, temporal filter width, temporal type, and affine interpolation type were not actually saving to the flame when changed.
-Grid on the main window was not being drawn at the right scale initially due to some OpenGL initialization occurring in the wrong order.
-Severe bugs in sequence generation code:
--Improperly detected padding xforms.
--When looking for specific variations during xform aligning, only presence was detected, when it should have been presence plus a weight greater than zero.
--When adding specific variations during xform aligning, must first remove any variations of that type.
--Two variables were unsigned when they should have been signed. This prevented large blocks of code from ever executing.
--When interpolating affines, an EPS that was too small was used, causing affine values to interpolate incorrectly. Instead use 1e-10 to ensure results equal to flam3.
--Code changes
-Modify FractoriumEmberController::UpdateXform() to pass the selected xform index as well as the absolute index to func().
2018-06-13 00:20:15 -04:00
m_FractoriumEmberController - > UpdateXform ( [ & ] ( Xform < T > * xform , size_t xfindex , size_t selIndex )
2016-12-05 22:04:33 -05:00
{
2019-06-19 00:29:58 -04:00
if ( m_Fractorium - > DrawAllPre ( ) | | xform = = m_SelectedXform ) //Draw all pre affine if specified.
2016-12-05 22:04:33 -05:00
{
2019-06-19 00:29:58 -04:00
QPointF cd ( xform - > m_Affine . C ( ) * scale , xform - > m_Affine . F ( ) * scale ) ;
bool b = qrf . contains ( cd ) ;
2019-06-21 20:51:20 -04:00
m_FractoriumEmberController - > XformCheckboxAt ( int ( xfindex ) , [ & ] ( QCheckBox * cb )
2019-06-19 00:29:58 -04:00
{
cb - > setChecked ( b ) ;
} ) ;
}
if ( m_Fractorium - > DrawAllPost ( ) | | xform = = m_SelectedXform )
{
QPointF cd ( xform - > m_Post . C ( ) * scale , xform - > m_Post . F ( ) * scale ) ;
bool b = qrf . contains ( cd ) ;
2019-06-21 20:51:20 -04:00
m_FractoriumEmberController - > XformCheckboxAt ( int ( xfindex ) , [ & ] ( QCheckBox * cb )
2019-06-19 00:29:58 -04:00
{
if ( ! cb - > isChecked ( ) & & b )
cb - > setChecked ( b ) ;
} ) ;
}
2016-12-05 22:04:33 -05:00
} , eXformUpdate : : UPDATE_ALL , false ) ;
}
2016-01-04 19:50:15 -05:00
else if ( m_DragState = = eDragState : : DragPanning ) //Translating the whole image.
2014-07-08 03:11:14 -04:00
{
T x = - ( m_MouseWorldPos . x - m_MouseDownWorldPos . x ) ;
T y = ( m_MouseWorldPos . y - m_MouseDownWorldPos . y ) ;
Affine2D < T > rotMat ;
rotMat . C ( m_CenterDownX ) ;
rotMat . F ( m_CenterDownY ) ;
2016-02-12 00:38:21 -05:00
rotMat . Rotate ( ember - > m_Rotate * DEG_2_RAD_T ) ;
2014-07-08 03:11:14 -04:00
v2T v1 ( x , y ) ;
v2T v2 = rotMat . TransformVector ( v1 ) ;
ember - > m_CenterX = v2 . x ;
2020-03-15 03:40:57 -04:00
ember - > m_CenterY = v2 . y ;
2014-07-08 03:11:14 -04:00
m_FractoriumEmberController - > SetCenter ( ember - > m_CenterX , ember - > m_CenterY ) ; //Will restart the rendering process.
}
2016-01-04 19:50:15 -05:00
else if ( m_DragState = = eDragState : : DragRotateScale ) //Rotating and scaling the whole image.
2014-07-08 03:11:14 -04:00
{
T rot = CalcRotation ( ) ;
T scale = CalcScale ( ) ;
ember - > m_Rotate = NormalizeDeg180 < T > ( m_RotationDown + rot ) ;
m_Fractorium - > SetRotation ( ember - > m_Rotate , true ) ;
2018-08-10 21:06:04 -04:00
m_Fractorium - > SetScale ( std : : max ( T ( 10 ) , m_ScaleDown + scale ) ) ; //Will restart the rendering process.
2014-07-08 03:11:14 -04:00
}
else
{
//If the user doesn't already have a key down, and they aren't dragging, clear the keys to be safe.
//This is done because if they do an alt+tab between windows, it thinks the alt key is down.
if ( e - > modifiers ( ) = = Qt : : NoModifier )
ClearDrag ( ) ;
//Check if they weren't dragging and weren't hovering over any affine.
//In that case, nothing needs to be done.
if ( UpdateHover ( mouseFlipped ) = = - 1 )
2018-09-15 06:11:12 -04:00
{
m_HoverXform = nullptr ;
}
2014-07-08 03:11:14 -04:00
}
2016-01-04 19:50:15 -05:00
2014-07-08 03:11:14 -04:00
//Only update if the user was dragging or hovered over a point.
//Use repaint() to update immediately for a more responsive feel.
2016-01-04 19:50:15 -05:00
if ( ( m_DragState ! = eDragState : : DragNone ) | | draw )
2014-07-08 03:11:14 -04:00
m_GL - > update ( ) ;
}
/// <summary>
/// Call controller MouseMove().
/// </summary>
/// <param name="e">The event</param>
void GLWidget : : mouseMoveEvent ( QMouseEvent * e )
{
setFocus ( ) ; //Must do this so that this window gets keyboard events.
2016-01-04 19:50:15 -05:00
2016-02-12 00:38:21 -05:00
if ( auto controller = GLController ( ) )
2014-07-08 03:11:14 -04:00
controller - > MouseMove ( e ) ;
2016-01-04 19:50:15 -05:00
2015-01-01 10:17:05 -05:00
QOpenGLWidget : : mouseMoveEvent ( e ) ;
2014-07-08 03:11:14 -04:00
}
/// <summary>
/// Mouse wheel changes the scale (pixels per unit) which
/// will zoom in the image in our out, while sacrificing quality.
/// If the user needs to preserve quality, they can use the zoom spinner
/// on the main window.
--User changes
-Add a palette editor.
-Add support for reading .ugr/.gradient/.gradients palette files.
-Allow toggling on spinners whose minimum value is not zero.
-Allow toggling display of image, affines and grid.
-Add new variations: cylinder2, circlesplit, tile_log, truchet_fill, waves2_radial.
--Bug fixes
-cpow2 was wrong.
-Palettes with rapid changes in color would produce slightly different outputs from Apo/Chaotica. This was due to a long standing bug from flam3.
-Use exec() on Apple and show() on all other OSes for dialog boxes.
-Trying to render a sequence with no frames would crash.
-Selecting multiple xforms and rotating them would produce the wrong rotation.
-Better handling when parsing flames using different encoding, such as unicode and UTF-8.
-Switching between SP/DP didn't reselect the selected flame in the Library tab.
--Code changes
-Make all types concerning palettes be floats, including PaletteTableWidgetItem.
-PaletteTableWidgetItem is no longer templated because all palettes are float.
-Include the source colors for user created gradients.
-Change parallel_for() calls to work with very old versions of TBB which are lingering on some systems.
-Split conditional out of accumulation loop on the CPU for better performance.
-Vectorize summing when doing density filter for better performance.
-Make all usage of palettes be of type float, double is pointless.
-Allow palettes to reside in multiple folders, while ensuring only one of each name is added.
-Refactor some palette path searching code.
-Make ReadFile() throw and catch an exception if the file operation fails.
-A little extra safety in foci and foci3D with a call to Zeps().
-Cast to (real_t) in the OpenCL string for the w variation, which was having trouble compiling on Mac.
-Fixing missing comma between paths in InitPaletteList().
-Move Xml and PaletteList classes into cpp to shorten build times when working on them.
-Remove default param values for IterOpenCLKernelCreator<T>::SharedDataIndexDefines in cpp file.
-Change more NULL to nullptr.
2017-02-26 03:02:21 -05:00
/// If Alt is pressed, only the scale of the affines is changed, the scale of the image remains untouched.
2014-07-08 03:11:14 -04:00
/// </summary>
/// <param name="e">The event</param>
template < typename T >
void GLEmberController < T > : : Wheel ( QWheelEvent * e )
{
--User changes
-Add a palette editor.
-Add support for reading .ugr/.gradient/.gradients palette files.
-Allow toggling on spinners whose minimum value is not zero.
-Allow toggling display of image, affines and grid.
-Add new variations: cylinder2, circlesplit, tile_log, truchet_fill, waves2_radial.
--Bug fixes
-cpow2 was wrong.
-Palettes with rapid changes in color would produce slightly different outputs from Apo/Chaotica. This was due to a long standing bug from flam3.
-Use exec() on Apple and show() on all other OSes for dialog boxes.
-Trying to render a sequence with no frames would crash.
-Selecting multiple xforms and rotating them would produce the wrong rotation.
-Better handling when parsing flames using different encoding, such as unicode and UTF-8.
-Switching between SP/DP didn't reselect the selected flame in the Library tab.
--Code changes
-Make all types concerning palettes be floats, including PaletteTableWidgetItem.
-PaletteTableWidgetItem is no longer templated because all palettes are float.
-Include the source colors for user created gradients.
-Change parallel_for() calls to work with very old versions of TBB which are lingering on some systems.
-Split conditional out of accumulation loop on the CPU for better performance.
-Vectorize summing when doing density filter for better performance.
-Make all usage of palettes be of type float, double is pointless.
-Allow palettes to reside in multiple folders, while ensuring only one of each name is added.
-Refactor some palette path searching code.
-Make ReadFile() throw and catch an exception if the file operation fails.
-A little extra safety in foci and foci3D with a call to Zeps().
-Cast to (real_t) in the OpenCL string for the w variation, which was having trouble compiling on Mac.
-Fixing missing comma between paths in InitPaletteList().
-Move Xml and PaletteList classes into cpp to shorten build times when working on them.
-Remove default param values for IterOpenCLKernelCreator<T>::SharedDataIndexDefines in cpp file.
-Change more NULL to nullptr.
2017-02-26 03:02:21 -05:00
if ( ( e - > modifiers ( ) & Qt : : AltModifier ) & & m_Fractorium - > DrawXforms ( ) )
{
2017-02-27 19:11:51 -05:00
# ifdef __APPLE__
m_FractoriumEmberController - > ChangeLockedScale ( e - > angleDelta ( ) . y ( ) > = 0 ? 1.0981 : 0.9 ) ;
# else
--User changes
-Add a palette editor.
-Add support for reading .ugr/.gradient/.gradients palette files.
-Allow toggling on spinners whose minimum value is not zero.
-Allow toggling display of image, affines and grid.
-Add new variations: cylinder2, circlesplit, tile_log, truchet_fill, waves2_radial.
--Bug fixes
-cpow2 was wrong.
-Palettes with rapid changes in color would produce slightly different outputs from Apo/Chaotica. This was due to a long standing bug from flam3.
-Use exec() on Apple and show() on all other OSes for dialog boxes.
-Trying to render a sequence with no frames would crash.
-Selecting multiple xforms and rotating them would produce the wrong rotation.
-Better handling when parsing flames using different encoding, such as unicode and UTF-8.
-Switching between SP/DP didn't reselect the selected flame in the Library tab.
--Code changes
-Make all types concerning palettes be floats, including PaletteTableWidgetItem.
-PaletteTableWidgetItem is no longer templated because all palettes are float.
-Include the source colors for user created gradients.
-Change parallel_for() calls to work with very old versions of TBB which are lingering on some systems.
-Split conditional out of accumulation loop on the CPU for better performance.
-Vectorize summing when doing density filter for better performance.
-Make all usage of palettes be of type float, double is pointless.
-Allow palettes to reside in multiple folders, while ensuring only one of each name is added.
-Refactor some palette path searching code.
-Make ReadFile() throw and catch an exception if the file operation fails.
-A little extra safety in foci and foci3D with a call to Zeps().
-Cast to (real_t) in the OpenCL string for the w variation, which was having trouble compiling on Mac.
-Fixing missing comma between paths in InitPaletteList().
-Move Xml and PaletteList classes into cpp to shorten build times when working on them.
-Remove default param values for IterOpenCLKernelCreator<T>::SharedDataIndexDefines in cpp file.
-Change more NULL to nullptr.
2017-02-26 03:02:21 -05:00
m_FractoriumEmberController - > ChangeLockedScale ( e - > angleDelta ( ) . x ( ) > = 0 ? 1.0981 : 0.9 ) ;
2017-02-27 19:11:51 -05:00
# endif
--User changes
-Add a palette editor.
-Add support for reading .ugr/.gradient/.gradients palette files.
-Allow toggling on spinners whose minimum value is not zero.
-Allow toggling display of image, affines and grid.
-Add new variations: cylinder2, circlesplit, tile_log, truchet_fill, waves2_radial.
--Bug fixes
-cpow2 was wrong.
-Palettes with rapid changes in color would produce slightly different outputs from Apo/Chaotica. This was due to a long standing bug from flam3.
-Use exec() on Apple and show() on all other OSes for dialog boxes.
-Trying to render a sequence with no frames would crash.
-Selecting multiple xforms and rotating them would produce the wrong rotation.
-Better handling when parsing flames using different encoding, such as unicode and UTF-8.
-Switching between SP/DP didn't reselect the selected flame in the Library tab.
--Code changes
-Make all types concerning palettes be floats, including PaletteTableWidgetItem.
-PaletteTableWidgetItem is no longer templated because all palettes are float.
-Include the source colors for user created gradients.
-Change parallel_for() calls to work with very old versions of TBB which are lingering on some systems.
-Split conditional out of accumulation loop on the CPU for better performance.
-Vectorize summing when doing density filter for better performance.
-Make all usage of palettes be of type float, double is pointless.
-Allow palettes to reside in multiple folders, while ensuring only one of each name is added.
-Refactor some palette path searching code.
-Make ReadFile() throw and catch an exception if the file operation fails.
-A little extra safety in foci and foci3D with a call to Zeps().
-Cast to (real_t) in the OpenCL string for the w variation, which was having trouble compiling on Mac.
-Fixing missing comma between paths in InitPaletteList().
-Move Xml and PaletteList classes into cpp to shorten build times when working on them.
-Remove default param values for IterOpenCLKernelCreator<T>::SharedDataIndexDefines in cpp file.
-Change more NULL to nullptr.
2017-02-26 03:02:21 -05:00
m_GL - > update ( ) ;
}
else
{
2019-06-11 22:25:21 -04:00
if ( m_Fractorium - > DrawImage ( ) & & ! ( e - > buttons ( ) & Qt : : MiddleButton ) & & ! ( e - > modifiers ( ) & Qt : : ShiftModifier ) ) //Middle button does whole image translation, so ignore the mouse wheel while panning to avoid inadvertent zooming. ShiftModifier for sensitive mouse.
--User changes
-Add a palette editor.
-Add support for reading .ugr/.gradient/.gradients palette files.
-Allow toggling on spinners whose minimum value is not zero.
-Allow toggling display of image, affines and grid.
-Add new variations: cylinder2, circlesplit, tile_log, truchet_fill, waves2_radial.
--Bug fixes
-cpow2 was wrong.
-Palettes with rapid changes in color would produce slightly different outputs from Apo/Chaotica. This was due to a long standing bug from flam3.
-Use exec() on Apple and show() on all other OSes for dialog boxes.
-Trying to render a sequence with no frames would crash.
-Selecting multiple xforms and rotating them would produce the wrong rotation.
-Better handling when parsing flames using different encoding, such as unicode and UTF-8.
-Switching between SP/DP didn't reselect the selected flame in the Library tab.
--Code changes
-Make all types concerning palettes be floats, including PaletteTableWidgetItem.
-PaletteTableWidgetItem is no longer templated because all palettes are float.
-Include the source colors for user created gradients.
-Change parallel_for() calls to work with very old versions of TBB which are lingering on some systems.
-Split conditional out of accumulation loop on the CPU for better performance.
-Vectorize summing when doing density filter for better performance.
-Make all usage of palettes be of type float, double is pointless.
-Allow palettes to reside in multiple folders, while ensuring only one of each name is added.
-Refactor some palette path searching code.
-Make ReadFile() throw and catch an exception if the file operation fails.
-A little extra safety in foci and foci3D with a call to Zeps().
-Cast to (real_t) in the OpenCL string for the w variation, which was having trouble compiling on Mac.
-Fixing missing comma between paths in InitPaletteList().
-Move Xml and PaletteList classes into cpp to shorten build times when working on them.
-Remove default param values for IterOpenCLKernelCreator<T>::SharedDataIndexDefines in cpp file.
-Change more NULL to nullptr.
2017-02-26 03:02:21 -05:00
{
auto ember = m_FractoriumEmberController - > CurrentEmber ( ) ;
2019-06-11 22:25:21 -04:00
m_Fractorium - > SetScale ( ember - > m_PixelsPerUnit + ( e - > angleDelta ( ) . y ( ) > = 0 ? 50 : - 50 ) ) ;
--User changes
-Add a palette editor.
-Add support for reading .ugr/.gradient/.gradients palette files.
-Allow toggling on spinners whose minimum value is not zero.
-Allow toggling display of image, affines and grid.
-Add new variations: cylinder2, circlesplit, tile_log, truchet_fill, waves2_radial.
--Bug fixes
-cpow2 was wrong.
-Palettes with rapid changes in color would produce slightly different outputs from Apo/Chaotica. This was due to a long standing bug from flam3.
-Use exec() on Apple and show() on all other OSes for dialog boxes.
-Trying to render a sequence with no frames would crash.
-Selecting multiple xforms and rotating them would produce the wrong rotation.
-Better handling when parsing flames using different encoding, such as unicode and UTF-8.
-Switching between SP/DP didn't reselect the selected flame in the Library tab.
--Code changes
-Make all types concerning palettes be floats, including PaletteTableWidgetItem.
-PaletteTableWidgetItem is no longer templated because all palettes are float.
-Include the source colors for user created gradients.
-Change parallel_for() calls to work with very old versions of TBB which are lingering on some systems.
-Split conditional out of accumulation loop on the CPU for better performance.
-Vectorize summing when doing density filter for better performance.
-Make all usage of palettes be of type float, double is pointless.
-Allow palettes to reside in multiple folders, while ensuring only one of each name is added.
-Refactor some palette path searching code.
-Make ReadFile() throw and catch an exception if the file operation fails.
-A little extra safety in foci and foci3D with a call to Zeps().
-Cast to (real_t) in the OpenCL string for the w variation, which was having trouble compiling on Mac.
-Fixing missing comma between paths in InitPaletteList().
-Move Xml and PaletteList classes into cpp to shorten build times when working on them.
-Remove default param values for IterOpenCLKernelCreator<T>::SharedDataIndexDefines in cpp file.
-Change more NULL to nullptr.
2017-02-26 03:02:21 -05:00
}
}
2014-07-08 03:11:14 -04:00
}
/// <summary>
/// Call controller Wheel().
/// </summary>
/// <param name="e">The event</param>
void GLWidget : : wheelEvent ( QWheelEvent * e )
{
2016-02-12 00:38:21 -05:00
if ( auto controller = GLController ( ) )
2018-07-08 11:31:26 -04:00
{
2014-07-08 03:11:14 -04:00
controller - > Wheel ( e ) ;
2018-07-08 11:31:26 -04:00
e - > accept ( ) ; //Prevents it from being sent to the main scroll bars. Scrolling should only affect the scale parameter and affine display zooming.
}
2016-01-04 19:50:15 -05:00
2015-01-01 10:17:05 -05:00
//Do not call QOpenGLWidget::wheelEvent(e) because this should only affect the scale and not the position of the scroll bars.
2014-07-08 03:11:14 -04:00
}
2018-03-28 00:32:10 -04:00
/// <summary>
/// Wrapper around drawing a simple primitive, like a point or line, using a GLSL program.
/// </summary>
/// <param name="col">The color to draw with</param>
/// <param name="vertices">The vertices to use</param>
/// <param name="drawType">The type of primitive to draw, such as GL_POINT or GL_LINES</param>
2018-07-31 00:39:41 -04:00
/// <param name="dashed">True to draw dashed lines, else solid</param>
2018-04-10 21:52:43 -04:00
/// <param name="pointSize">The size in pixels of points, which is internally scaled by the device pixel ratio.</param>
2018-07-31 00:39:41 -04:00
void GLWidget : : DrawPointOrLine ( const QVector4D & col , const std : : vector < float > & vertices , int drawType , bool dashed , GLfloat pointSize )
2018-03-28 00:32:10 -04:00
{
2018-07-31 00:39:41 -04:00
DrawPointOrLine ( col , vertices . data ( ) , int ( vertices . size ( ) / 2 ) , drawType , dashed , pointSize ) ;
2018-03-28 00:32:10 -04:00
}
/// <summary>
/// Wrapper around drawing a simple primitive, like a point or line, using a GLSL program.
/// </summary>
/// <param name="col">The color to draw with</param>
/// <param name="vertices">The vertices to use</param>
/// <param name="size">The number of verticies. This is usually the size of vertices / 2.</param>
/// <param name="drawType">The type of primitive to draw, such as GL_POINT or GL_LINES</param>
2018-07-31 00:39:41 -04:00
/// <param name="dashed">True to draw dashed lines, else solid</param>
2018-04-10 21:52:43 -04:00
/// <param name="pointSize">The size in pixels of points, which is internally scaled by the device pixel ratio.</param>
2018-07-31 00:39:41 -04:00
void GLWidget : : DrawPointOrLine ( const QVector4D & col , const GLfloat * vertices , int size , int drawType , bool dashed , GLfloat pointSize )
2018-03-28 00:32:10 -04:00
{
# ifdef USE_GLSL
2018-07-31 00:39:41 -04:00
2018-09-15 06:11:12 -04:00
if ( dashed & & ( drawType = = GL_LINES | | drawType = = GL_LINE_LOOP ) )
2018-07-31 00:39:41 -04:00
{
glLineStipple ( 1 , 0XFF00 ) ;
glEnable ( GL_LINE_STIPPLE ) ;
}
2018-03-28 00:32:10 -04:00
m_ModelViewProjectionMatrix = m_ProjMatrix * m_ModelViewMatrix ;
m_Program - > setUniformValue ( m_ColAttr , col ) ;
2018-04-10 21:52:43 -04:00
m_Program - > setUniformValue ( m_PointSizeUniform , pointSize * GLfloat ( devicePixelRatioF ( ) ) ) ;
2018-03-28 00:32:10 -04:00
m_Program - > setUniformValue ( m_MatrixUniform , m_ModelViewProjectionMatrix ) ;
this - > glVertexAttribPointer ( m_PosAttr , 2 , GL_FLOAT , GL_FALSE , 0 , vertices ) ;
this - > glEnableVertexAttribArray ( 0 ) ;
this - > glDrawArrays ( drawType , 0 , size ) ;
this - > glDisableVertexAttribArray ( 0 ) ;
2018-07-31 00:39:41 -04:00
2018-09-15 06:11:12 -04:00
if ( dashed & & ( drawType = = GL_LINES | | drawType = = GL_LINE_LOOP ) )
2018-07-31 00:39:41 -04:00
glDisable ( GL_LINE_STIPPLE ) ;
2018-03-28 00:32:10 -04:00
# endif
}
2014-10-18 15:56:37 -04:00
/// <summary>
/// Set the dimensions of the drawing area.
/// This will be called from the main window's SyncSizes() function.
/// </summary>
/// <param name="w">Width in pixels</param>
/// <param name="h">Height in pixels</param>
2014-10-14 11:53:15 -04:00
void GLWidget : : SetDimensions ( int w , int h )
{
--User changes
-Support 4k monitors, and in general, properly scale any monitor that is not HD.
-Allow for a spatial filter of radius zero, which means do not use a spatial filter.
-Add new variations: concentric, cpow3, helicoid, helix, rand_cubes, sphereblur.
-Use a new method for computing elliptic which is more precise. Developed by Discord user Claude.
-Remove the 8 variation per xform limitation on the GPU.
-Allow for loading the last flame file on startup, rather than randoms.
-Use two different default quality values in the interactive renderer, one each for CPU and GPU.
-Creating linked xforms was using non-standard behavior. Make it match Apo and also support creating multiple linked xforms at once.
--Bug fixes
-No variations in an xform used to have the same behavior as a single linear variation with weight 1. While sensible, this breaks backward compatibility. No variations now sets the output point to zeroes.
-Prevent crashing the program when adjusting a value on the main window while a final render is in progress.
-The xaos table was inverted.
--Code changes
-Convert projects to Visual Studio 2017.
-Change bad vals from +- 1e10 to +-1e20.
-Reintroduce the symmetry tag in xforms for legacy support in programs that do not use color_speed.
-Compiler will not let us use default values in templated member functions anymore.
2017-11-26 20:27:00 -05:00
auto downscaledW = std : : ceil ( w / devicePixelRatioF ( ) ) ;
auto downscaledH = std : : ceil ( h / devicePixelRatioF ( ) ) ;
setFixedSize ( downscaledW , downscaledH ) ;
2014-07-08 03:11:14 -04:00
}
/// <summary>
/// Set up texture memory to match the size of the window.
/// If first allocation, generate, bind and set parameters.
/// If subsequent call, only take action if dimensions don't match the window. In such case,
/// first deallocate, then reallocate.
/// </summary>
/// <returns>True if success, else false.</returns>
bool GLWidget : : Allocate ( bool force )
{
bool alloc = false ;
--User changes
-Support 4k monitors, and in general, properly scale any monitor that is not HD.
-Allow for a spatial filter of radius zero, which means do not use a spatial filter.
-Add new variations: concentric, cpow3, helicoid, helix, rand_cubes, sphereblur.
-Use a new method for computing elliptic which is more precise. Developed by Discord user Claude.
-Remove the 8 variation per xform limitation on the GPU.
-Allow for loading the last flame file on startup, rather than randoms.
-Use two different default quality values in the interactive renderer, one each for CPU and GPU.
-Creating linked xforms was using non-standard behavior. Make it match Apo and also support creating multiple linked xforms at once.
--Bug fixes
-No variations in an xform used to have the same behavior as a single linear variation with weight 1. While sensible, this breaks backward compatibility. No variations now sets the output point to zeroes.
-Prevent crashing the program when adjusting a value on the main window while a final render is in progress.
-The xaos table was inverted.
--Code changes
-Convert projects to Visual Studio 2017.
-Change bad vals from +- 1e10 to +-1e20.
-Reintroduce the symmetry tag in xforms for legacy support in programs that do not use color_speed.
-Compiler will not let us use default values in templated member functions anymore.
2017-11-26 20:27:00 -05:00
//auto scaledW = std::ceil(width() * devicePixelRatioF());
auto w = m_Fractorium - > m_Controller - > FinalRasW ( ) ;
auto h = m_Fractorium - > m_Controller - > FinalRasH ( ) ;
bool doResize = force | | m_TexWidth ! = w | | m_TexHeight ! = h ;
2014-12-11 00:50:15 -05:00
bool doIt = doResize | | m_OutputTexID = = 0 ;
2018-03-28 00:32:10 -04:00
# ifndef USE_GLSL
2014-07-08 03:11:14 -04:00
2014-10-14 11:53:15 -04:00
if ( doIt )
2014-07-08 03:11:14 -04:00
{
--User changes
-Support 4k monitors, and in general, properly scale any monitor that is not HD.
-Allow for a spatial filter of radius zero, which means do not use a spatial filter.
-Add new variations: concentric, cpow3, helicoid, helix, rand_cubes, sphereblur.
-Use a new method for computing elliptic which is more precise. Developed by Discord user Claude.
-Remove the 8 variation per xform limitation on the GPU.
-Allow for loading the last flame file on startup, rather than randoms.
-Use two different default quality values in the interactive renderer, one each for CPU and GPU.
-Creating linked xforms was using non-standard behavior. Make it match Apo and also support creating multiple linked xforms at once.
--Bug fixes
-No variations in an xform used to have the same behavior as a single linear variation with weight 1. While sensible, this breaks backward compatibility. No variations now sets the output point to zeroes.
-Prevent crashing the program when adjusting a value on the main window while a final render is in progress.
-The xaos table was inverted.
--Code changes
-Convert projects to Visual Studio 2017.
-Change bad vals from +- 1e10 to +-1e20.
-Reintroduce the symmetry tag in xforms for legacy support in programs that do not use color_speed.
-Compiler will not let us use default values in templated member functions anymore.
2017-11-26 20:27:00 -05:00
m_TexWidth = GLint ( w ) ;
m_TexHeight = GLint ( h ) ;
2014-07-08 03:11:14 -04:00
glEnable ( GL_TEXTURE_2D ) ;
glTexEnvf ( GL_TEXTURE_ENV , GL_TEXTURE_ENV_MODE , GL_REPLACE ) ;
2014-10-14 11:53:15 -04:00
2014-12-11 00:50:15 -05:00
if ( doResize )
2014-10-14 11:53:15 -04:00
Deallocate ( ) ;
2014-07-08 03:11:14 -04:00
glGenTextures ( 1 , & m_OutputTexID ) ;
glBindTexture ( GL_TEXTURE_2D , m_OutputTexID ) ;
glTexParameteri ( GL_TEXTURE_2D , GL_TEXTURE_MIN_FILTER , GL_LINEAR ) ; //Fractron had this as GL_LINEAR_MIPMAP_LINEAR for OpenCL and Cuda.
glTexParameteri ( GL_TEXTURE_2D , GL_TEXTURE_MAG_FILTER , GL_LINEAR ) ;
glTexParameteri ( GL_TEXTURE_2D , GL_TEXTURE_WRAP_S , GL_CLAMP ) ;
glTexParameteri ( GL_TEXTURE_2D , GL_TEXTURE_WRAP_T , GL_CLAMP ) ;
2017-12-13 18:32:50 -05:00
# if defined (__APPLE__) || defined(MACOSX)
2017-12-15 19:22:00 -05:00
glTexImage2D ( GL_TEXTURE_2D , 0 , GL_RGB32F , m_TexWidth , m_TexHeight , 0 , GL_RGB , GL_FLOAT , nullptr ) ;
2017-12-13 18:32:50 -05:00
# else
2017-07-22 16:43:35 -04:00
glTexImage2D ( GL_TEXTURE_2D , 0 , GL_RGBA32F , m_TexWidth , m_TexHeight , 0 , GL_RGBA , GL_FLOAT , nullptr ) ;
2017-12-13 18:32:50 -05:00
# endif
2014-07-08 03:11:14 -04:00
alloc = true ;
}
2016-01-04 19:50:15 -05:00
2014-07-08 03:11:14 -04:00
if ( alloc )
{
glBindTexture ( GL_TEXTURE_2D , 0 ) ;
glDisable ( GL_TEXTURE_2D ) ;
}
2018-03-28 00:32:10 -04:00
# else
if ( doIt )
{
m_TexWidth = GLint ( w ) ;
m_TexHeight = GLint ( h ) ;
this - > glEnable ( GL_TEXTURE_2D ) ;
if ( doResize )
Deallocate ( ) ;
this - > glActiveTexture ( GL_TEXTURE0 ) ;
this - > glGenTextures ( 1 , & m_OutputTexID ) ;
this - > glBindTexture ( GL_TEXTURE_2D , m_OutputTexID ) ;
this - > glTexParameteri ( GL_TEXTURE_2D , GL_TEXTURE_MIN_FILTER , GL_LINEAR ) ; //Fractron had this as GL_LINEAR_MIPMAP_LINEAR for OpenCL and Cuda.
this - > glTexParameteri ( GL_TEXTURE_2D , GL_TEXTURE_MAG_FILTER , GL_LINEAR ) ;
this - > glTexParameteri ( GL_TEXTURE_2D , GL_TEXTURE_WRAP_S , GL_CLAMP ) ;
this - > glTexParameteri ( GL_TEXTURE_2D , GL_TEXTURE_WRAP_T , GL_CLAMP ) ;
# if defined (__APPLE__) || defined(MACOSX)
this - > glTexImage2D ( GL_TEXTURE_2D , 0 , GL_RGB32F , m_TexWidth , m_TexHeight , 0 , GL_RGB , GL_FLOAT , nullptr ) ;
# else
this - > glTexImage2D ( GL_TEXTURE_2D , 0 , GL_RGBA32F , m_TexWidth , m_TexHeight , 0 , GL_RGBA , GL_FLOAT , nullptr ) ;
# endif
alloc = true ;
}
if ( alloc )
{
this - > glBindTexture ( GL_TEXTURE_2D , 0 ) ;
this - > glDisable ( GL_TEXTURE_2D ) ;
}
# endif
2018-04-29 01:28:05 -04:00
this - > glFinish ( ) ;
2014-07-08 03:11:14 -04:00
return m_OutputTexID ! = 0 ;
}
/// <summary>
/// Deallocate texture memory.
/// </summary>
/// <returns>True if anything deleted, else false.</returns>
bool GLWidget : : Deallocate ( )
{
bool deleted = false ;
if ( m_OutputTexID ! = 0 )
{
2018-03-28 00:32:10 -04:00
this - > glBindTexture ( GL_TEXTURE_2D , m_OutputTexID ) ;
this - > glDeleteTextures ( 1 , & m_OutputTexID ) ;
2014-07-08 03:11:14 -04:00
m_OutputTexID = 0 ;
deleted = true ;
}
return deleted ;
}
/// <summary>
/// Set the viewport to match the window dimensions.
/// If the dimensions already match, no action is taken.
/// </summary>
void GLWidget : : SetViewport ( )
{
2014-10-14 11:53:15 -04:00
if ( m_Init & & ( m_ViewWidth ! = m_TexWidth | | m_ViewHeight ! = m_TexHeight ) )
2014-07-08 03:11:14 -04:00
{
2018-03-28 00:32:10 -04:00
this - > glViewport ( 0 , 0 , GLint ( m_TexWidth ) , GLint ( m_TexHeight ) ) ;
# ifdef USE_GLSL
m_Viewport = glm : : ivec4 ( 0 , 0 , m_TexWidth , m_TexHeight ) ;
# endif
2014-10-14 11:53:15 -04:00
m_ViewWidth = m_TexWidth ;
m_ViewHeight = m_TexHeight ;
2014-07-08 03:11:14 -04:00
}
}
/// <summary>
2014-10-14 11:53:15 -04:00
/// Determine whether the dimensions of the renderer's current ember match
/// the dimensions of the widget, texture and viewport.
/// Since this uses the renderer's dimensions, this
/// must be called after the renderer has set the current ember.
2014-07-08 03:11:14 -04:00
/// </summary>
/// <returns>True if all sizes match, else false.</returns>
template < typename T >
2014-10-14 11:53:15 -04:00
bool GLEmberController < T > : : SizesMatch ( )
2014-07-08 03:11:14 -04:00
{
--User changes
-Support 4k monitors, and in general, properly scale any monitor that is not HD.
-Allow for a spatial filter of radius zero, which means do not use a spatial filter.
-Add new variations: concentric, cpow3, helicoid, helix, rand_cubes, sphereblur.
-Use a new method for computing elliptic which is more precise. Developed by Discord user Claude.
-Remove the 8 variation per xform limitation on the GPU.
-Allow for loading the last flame file on startup, rather than randoms.
-Use two different default quality values in the interactive renderer, one each for CPU and GPU.
-Creating linked xforms was using non-standard behavior. Make it match Apo and also support creating multiple linked xforms at once.
--Bug fixes
-No variations in an xform used to have the same behavior as a single linear variation with weight 1. While sensible, this breaks backward compatibility. No variations now sets the output point to zeroes.
-Prevent crashing the program when adjusting a value on the main window while a final render is in progress.
-The xaos table was inverted.
--Code changes
-Convert projects to Visual Studio 2017.
-Change bad vals from +- 1e10 to +-1e20.
-Reintroduce the symmetry tag in xforms for legacy support in programs that do not use color_speed.
-Compiler will not let us use default values in templated member functions anymore.
2017-11-26 20:27:00 -05:00
//auto scaledW = std::ceil(m_GL->width() * m_GL->devicePixelRatioF());
//auto scaledH = std::ceil(m_GL->height() * m_GL->devicePixelRatioF());
2016-02-02 20:51:58 -05:00
auto ember = m_FractoriumEmberController - > CurrentEmber ( ) ;
2014-10-14 11:53:15 -04:00
return ( ember & &
--User changes
-Support 4k monitors, and in general, properly scale any monitor that is not HD.
-Allow for a spatial filter of radius zero, which means do not use a spatial filter.
-Add new variations: concentric, cpow3, helicoid, helix, rand_cubes, sphereblur.
-Use a new method for computing elliptic which is more precise. Developed by Discord user Claude.
-Remove the 8 variation per xform limitation on the GPU.
-Allow for loading the last flame file on startup, rather than randoms.
-Use two different default quality values in the interactive renderer, one each for CPU and GPU.
-Creating linked xforms was using non-standard behavior. Make it match Apo and also support creating multiple linked xforms at once.
--Bug fixes
-No variations in an xform used to have the same behavior as a single linear variation with weight 1. While sensible, this breaks backward compatibility. No variations now sets the output point to zeroes.
-Prevent crashing the program when adjusting a value on the main window while a final render is in progress.
-The xaos table was inverted.
--Code changes
-Convert projects to Visual Studio 2017.
-Change bad vals from +- 1e10 to +-1e20.
-Reintroduce the symmetry tag in xforms for legacy support in programs that do not use color_speed.
-Compiler will not let us use default values in templated member functions anymore.
2017-11-26 20:27:00 -05:00
ember - > m_FinalRasW = = m_GL - > m_TexWidth & &
ember - > m_FinalRasH = = m_GL - > m_TexHeight & &
2016-01-04 19:50:15 -05:00
m_GL - > m_TexWidth = = m_GL - > m_ViewWidth & &
m_GL - > m_TexHeight = = m_GL - > m_ViewHeight ) ;
2014-07-08 03:11:14 -04:00
}
/// <summary>
/// Draw the unit square.
/// </summary>
void GLWidget : : DrawUnitSquare ( )
{
--User changes
-Support 4k monitors, and in general, properly scale any monitor that is not HD.
-Allow for a spatial filter of radius zero, which means do not use a spatial filter.
-Add new variations: concentric, cpow3, helicoid, helix, rand_cubes, sphereblur.
-Use a new method for computing elliptic which is more precise. Developed by Discord user Claude.
-Remove the 8 variation per xform limitation on the GPU.
-Allow for loading the last flame file on startup, rather than randoms.
-Use two different default quality values in the interactive renderer, one each for CPU and GPU.
-Creating linked xforms was using non-standard behavior. Make it match Apo and also support creating multiple linked xforms at once.
--Bug fixes
-No variations in an xform used to have the same behavior as a single linear variation with weight 1. While sensible, this breaks backward compatibility. No variations now sets the output point to zeroes.
-Prevent crashing the program when adjusting a value on the main window while a final render is in progress.
-The xaos table was inverted.
--Code changes
-Convert projects to Visual Studio 2017.
-Change bad vals from +- 1e10 to +-1e20.
-Reintroduce the symmetry tag in xforms for legacy support in programs that do not use color_speed.
-Compiler will not let us use default values in templated member functions anymore.
2017-11-26 20:27:00 -05:00
glLineWidth ( 1.0f * devicePixelRatioF ( ) ) ;
2018-03-28 00:32:10 -04:00
# ifndef USE_GLSL
2014-07-08 03:11:14 -04:00
glBegin ( GL_LINES ) ;
glColor4f ( 1.0f , 1.0f , 1.0f , 0.25f ) ;
2016-01-04 19:50:15 -05:00
glVertex2f ( - 1 , - 1 ) ;
glVertex2f ( 1 , - 1 ) ;
2014-07-08 03:11:14 -04:00
glVertex2f ( - 1 , 1 ) ;
glVertex2f ( 1 , 1 ) ;
2016-01-04 19:50:15 -05:00
glVertex2f ( - 1 , - 1 ) ;
2014-07-08 03:11:14 -04:00
glVertex2f ( - 1 , 1 ) ;
2016-01-04 19:50:15 -05:00
glVertex2f ( 1 , - 1 ) ;
2014-07-08 03:11:14 -04:00
glVertex2f ( 1 , 1 ) ;
glColor4f ( 1.0f , 0.0f , 0.0f , 0.5f ) ;
glVertex2f ( - 1 , 0 ) ;
glVertex2f ( 1 , 0 ) ;
glColor4f ( 0.0f , 1.0f , 0.0f , 0.5f ) ;
2016-01-04 19:50:15 -05:00
glVertex2f ( 0 , - 1 ) ;
2014-07-08 03:11:14 -04:00
glVertex2f ( 0 , 1 ) ;
glEnd ( ) ;
2018-03-28 00:32:10 -04:00
# else
GLfloat vertices [ ] = //Should these be of type T?//TODO
{
- 1 , - 1 ,
1 , - 1 ,
- 1 , 1 ,
1 , 1 ,
- 1 , - 1 ,
- 1 , 1 ,
1 , - 1 ,
1 , 1
} ;
QVector4D col ( 1.0f , 1.0f , 1.0f , 0.25f ) ;
DrawPointOrLine ( col , vertices , 8 , GL_LINES ) ;
GLfloat vertices2 [ ] = //Should these be of type T?//TODO
{
- 1 , 0 ,
1 , 0
} ;
QVector4D col2 ( 1.0f , 0.0f , 0.0f , 0.5f ) ;
DrawPointOrLine ( col2 , vertices2 , 2 , GL_LINES ) ;
GLfloat vertices3 [ ] = //Should these be of type T?//TODO
{
0 , - 1 ,
0 , 1
} ;
QVector4D col3 ( 0.0f , 1.0f , 0.0f , 0.5f ) ;
DrawPointOrLine ( col3 , vertices3 , 2 , GL_LINES ) ;
# endif
2014-07-08 03:11:14 -04:00
}
--User changes
-Add a palette editor.
-Add support for reading .ugr/.gradient/.gradients palette files.
-Allow toggling on spinners whose minimum value is not zero.
-Allow toggling display of image, affines and grid.
-Add new variations: cylinder2, circlesplit, tile_log, truchet_fill, waves2_radial.
--Bug fixes
-cpow2 was wrong.
-Palettes with rapid changes in color would produce slightly different outputs from Apo/Chaotica. This was due to a long standing bug from flam3.
-Use exec() on Apple and show() on all other OSes for dialog boxes.
-Trying to render a sequence with no frames would crash.
-Selecting multiple xforms and rotating them would produce the wrong rotation.
-Better handling when parsing flames using different encoding, such as unicode and UTF-8.
-Switching between SP/DP didn't reselect the selected flame in the Library tab.
--Code changes
-Make all types concerning palettes be floats, including PaletteTableWidgetItem.
-PaletteTableWidgetItem is no longer templated because all palettes are float.
-Include the source colors for user created gradients.
-Change parallel_for() calls to work with very old versions of TBB which are lingering on some systems.
-Split conditional out of accumulation loop on the CPU for better performance.
-Vectorize summing when doing density filter for better performance.
-Make all usage of palettes be of type float, double is pointless.
-Allow palettes to reside in multiple folders, while ensuring only one of each name is added.
-Refactor some palette path searching code.
-Make ReadFile() throw and catch an exception if the file operation fails.
-A little extra safety in foci and foci3D with a call to Zeps().
-Cast to (real_t) in the OpenCL string for the w variation, which was having trouble compiling on Mac.
-Fixing missing comma between paths in InitPaletteList().
-Move Xml and PaletteList classes into cpp to shorten build times when working on them.
-Remove default param values for IterOpenCLKernelCreator<T>::SharedDataIndexDefines in cpp file.
-Change more NULL to nullptr.
2017-02-26 03:02:21 -05:00
/// <summary>
/// Draw the grid
/// The frequency of the grid lines will change depending on the zoom (ALT+WHEEL).
/// Calculated with the frame always centered, the renderer just moves the camera.
/// </summary>
template < typename T >
void GLEmberController < T > : : DrawGrid ( )
{
auto renderer = m_Fractorium - > m_Controller - > Renderer ( ) ;
double scale = m_FractoriumEmberController - > AffineScaleCurrentToLocked ( ) ;
2018-01-28 20:51:19 -05:00
//qDebug() << renderer->UpperRightX(false) << " " << renderer->LowerLeftX(false) << " " << renderer->UpperRightY(false) << " " << renderer->LowerLeftY(false);
--User changes
-Add a palette editor.
-Add support for reading .ugr/.gradient/.gradients palette files.
-Allow toggling on spinners whose minimum value is not zero.
-Allow toggling display of image, affines and grid.
-Add new variations: cylinder2, circlesplit, tile_log, truchet_fill, waves2_radial.
--Bug fixes
-cpow2 was wrong.
-Palettes with rapid changes in color would produce slightly different outputs from Apo/Chaotica. This was due to a long standing bug from flam3.
-Use exec() on Apple and show() on all other OSes for dialog boxes.
-Trying to render a sequence with no frames would crash.
-Selecting multiple xforms and rotating them would produce the wrong rotation.
-Better handling when parsing flames using different encoding, such as unicode and UTF-8.
-Switching between SP/DP didn't reselect the selected flame in the Library tab.
--Code changes
-Make all types concerning palettes be floats, including PaletteTableWidgetItem.
-PaletteTableWidgetItem is no longer templated because all palettes are float.
-Include the source colors for user created gradients.
-Change parallel_for() calls to work with very old versions of TBB which are lingering on some systems.
-Split conditional out of accumulation loop on the CPU for better performance.
-Vectorize summing when doing density filter for better performance.
-Make all usage of palettes be of type float, double is pointless.
-Allow palettes to reside in multiple folders, while ensuring only one of each name is added.
-Refactor some palette path searching code.
-Make ReadFile() throw and catch an exception if the file operation fails.
-A little extra safety in foci and foci3D with a call to Zeps().
-Cast to (real_t) in the OpenCL string for the w variation, which was having trouble compiling on Mac.
-Fixing missing comma between paths in InitPaletteList().
-Move Xml and PaletteList classes into cpp to shorten build times when working on them.
-Remove default param values for IterOpenCLKernelCreator<T>::SharedDataIndexDefines in cpp file.
-Change more NULL to nullptr.
2017-02-26 03:02:21 -05:00
float unitX = ( std : : abs ( renderer - > UpperRightX ( false ) - renderer - > LowerLeftX ( false ) ) / 2.0f ) / scale ;
float unitY = ( std : : abs ( renderer - > UpperRightY ( false ) - renderer - > LowerLeftY ( false ) ) / 2.0f ) / scale ;
2018-09-15 06:11:12 -04:00
if ( unitX > 100000 | | unitY > 100000 ) //Need a better way to do this.//TODO
{
qDebug ( ) < < unitX < < " " < < unitY ;
//return;
}
06/09/2017
--User changes
-dark.qss is now per-OS.
-Properly set/reload palette when coming from the palette editor. The latter must be done if they've modified the current palette even if they've clicked cancel.
--Bug fixes
-Make the following variations safer by using Zeps(): conic, bipolar, edisc, whorl, tan, csc, cot, tanh, sech, csch, coth, auger, bwraps, hypertile3d, hypertile3d1, ortho, poincare, rational3, barycentroid, sschecks, cscq, cschq, scry_3D, splitbrdr, hexcrop, nblur, crob.
-Fix bug enabling/disabling overwrite button in palette editor.
-Small optimization for gdoffs, use precalcAtanYX.
-Properly propagate z through circlesplit, cylinder2 and tile_log variations.
-Some values in truchet_fill could've been NaN.
--Code changes
-Make most installation files read only.
-Qualify many calls with std:: to ensure they're not colliding with glm::
-Use auto in more places.
2017-06-09 22:38:06 -04:00
float xLow = std : : floor ( - unitX ) ;
float xHigh = std : : ceil ( unitX ) ;
float yLow = std : : floor ( - unitY ) ;
float yHigh = std : : ceil ( unitY ) ;
--User changes
-Add a palette editor.
-Add support for reading .ugr/.gradient/.gradients palette files.
-Allow toggling on spinners whose minimum value is not zero.
-Allow toggling display of image, affines and grid.
-Add new variations: cylinder2, circlesplit, tile_log, truchet_fill, waves2_radial.
--Bug fixes
-cpow2 was wrong.
-Palettes with rapid changes in color would produce slightly different outputs from Apo/Chaotica. This was due to a long standing bug from flam3.
-Use exec() on Apple and show() on all other OSes for dialog boxes.
-Trying to render a sequence with no frames would crash.
-Selecting multiple xforms and rotating them would produce the wrong rotation.
-Better handling when parsing flames using different encoding, such as unicode and UTF-8.
-Switching between SP/DP didn't reselect the selected flame in the Library tab.
--Code changes
-Make all types concerning palettes be floats, including PaletteTableWidgetItem.
-PaletteTableWidgetItem is no longer templated because all palettes are float.
-Include the source colors for user created gradients.
-Change parallel_for() calls to work with very old versions of TBB which are lingering on some systems.
-Split conditional out of accumulation loop on the CPU for better performance.
-Vectorize summing when doing density filter for better performance.
-Make all usage of palettes be of type float, double is pointless.
-Allow palettes to reside in multiple folders, while ensuring only one of each name is added.
-Refactor some palette path searching code.
-Make ReadFile() throw and catch an exception if the file operation fails.
-A little extra safety in foci and foci3D with a call to Zeps().
-Cast to (real_t) in the OpenCL string for the w variation, which was having trouble compiling on Mac.
-Fixing missing comma between paths in InitPaletteList().
-Move Xml and PaletteList classes into cpp to shorten build times when working on them.
-Remove default param values for IterOpenCLKernelCreator<T>::SharedDataIndexDefines in cpp file.
-Change more NULL to nullptr.
2017-02-26 03:02:21 -05:00
float alpha = 0.25f ;
2018-01-28 20:51:19 -05:00
int xsteps = std : : ceil ( std : : abs ( xHigh - xLow ) / GridStep ) ; //Need these because sometimes the float value never reaches the max and it gets stuck in an infinite loop.
int ysteps = std : : ceil ( std : : abs ( yHigh - yLow ) / GridStep ) ;
--User changes
-Add a palette editor.
-Add support for reading .ugr/.gradient/.gradients palette files.
-Allow toggling on spinners whose minimum value is not zero.
-Allow toggling display of image, affines and grid.
-Add new variations: cylinder2, circlesplit, tile_log, truchet_fill, waves2_radial.
--Bug fixes
-cpow2 was wrong.
-Palettes with rapid changes in color would produce slightly different outputs from Apo/Chaotica. This was due to a long standing bug from flam3.
-Use exec() on Apple and show() on all other OSes for dialog boxes.
-Trying to render a sequence with no frames would crash.
-Selecting multiple xforms and rotating them would produce the wrong rotation.
-Better handling when parsing flames using different encoding, such as unicode and UTF-8.
-Switching between SP/DP didn't reselect the selected flame in the Library tab.
--Code changes
-Make all types concerning palettes be floats, including PaletteTableWidgetItem.
-PaletteTableWidgetItem is no longer templated because all palettes are float.
-Include the source colors for user created gradients.
-Change parallel_for() calls to work with very old versions of TBB which are lingering on some systems.
-Split conditional out of accumulation loop on the CPU for better performance.
-Vectorize summing when doing density filter for better performance.
-Make all usage of palettes be of type float, double is pointless.
-Allow palettes to reside in multiple folders, while ensuring only one of each name is added.
-Refactor some palette path searching code.
-Make ReadFile() throw and catch an exception if the file operation fails.
-A little extra safety in foci and foci3D with a call to Zeps().
-Cast to (real_t) in the OpenCL string for the w variation, which was having trouble compiling on Mac.
-Fixing missing comma between paths in InitPaletteList().
-Move Xml and PaletteList classes into cpp to shorten build times when working on them.
-Remove default param values for IterOpenCLKernelCreator<T>::SharedDataIndexDefines in cpp file.
-Change more NULL to nullptr.
2017-02-26 03:02:21 -05:00
Affine2D < T > temp ;
2018-03-28 00:32:10 -04:00
m_GL - > glLineWidth ( 1.0f * m_GL - > devicePixelRatioF ( ) ) ;
# ifndef USE_GLSL
--User changes
-Add a palette editor.
-Add support for reading .ugr/.gradient/.gradients palette files.
-Allow toggling on spinners whose minimum value is not zero.
-Allow toggling display of image, affines and grid.
-Add new variations: cylinder2, circlesplit, tile_log, truchet_fill, waves2_radial.
--Bug fixes
-cpow2 was wrong.
-Palettes with rapid changes in color would produce slightly different outputs from Apo/Chaotica. This was due to a long standing bug from flam3.
-Use exec() on Apple and show() on all other OSes for dialog boxes.
-Trying to render a sequence with no frames would crash.
-Selecting multiple xforms and rotating them would produce the wrong rotation.
-Better handling when parsing flames using different encoding, such as unicode and UTF-8.
-Switching between SP/DP didn't reselect the selected flame in the Library tab.
--Code changes
-Make all types concerning palettes be floats, including PaletteTableWidgetItem.
-PaletteTableWidgetItem is no longer templated because all palettes are float.
-Include the source colors for user created gradients.
-Change parallel_for() calls to work with very old versions of TBB which are lingering on some systems.
-Split conditional out of accumulation loop on the CPU for better performance.
-Vectorize summing when doing density filter for better performance.
-Make all usage of palettes be of type float, double is pointless.
-Allow palettes to reside in multiple folders, while ensuring only one of each name is added.
-Refactor some palette path searching code.
-Make ReadFile() throw and catch an exception if the file operation fails.
-A little extra safety in foci and foci3D with a call to Zeps().
-Cast to (real_t) in the OpenCL string for the w variation, which was having trouble compiling on Mac.
-Fixing missing comma between paths in InitPaletteList().
-Move Xml and PaletteList classes into cpp to shorten build times when working on them.
-Remove default param values for IterOpenCLKernelCreator<T>::SharedDataIndexDefines in cpp file.
-Change more NULL to nullptr.
2017-02-26 03:02:21 -05:00
m4T mat = ( temp * scale ) . ToMat4RowMajor ( ) ;
m_GL - > glPushMatrix ( ) ;
m_GL - > glLoadIdentity ( ) ;
MultMatrix ( mat ) ;
m_GL - > glBegin ( GL_LINES ) ;
m_GL - > glColor4f ( 0.5f , 0.5f , 0.5f , alpha ) ;
2018-01-28 20:51:19 -05:00
for ( float fx = xLow , i = 0 ; fx < = xHigh & & i < xsteps ; fx + = GridStep , i + + )
--User changes
-Add a palette editor.
-Add support for reading .ugr/.gradient/.gradients palette files.
-Allow toggling on spinners whose minimum value is not zero.
-Allow toggling display of image, affines and grid.
-Add new variations: cylinder2, circlesplit, tile_log, truchet_fill, waves2_radial.
--Bug fixes
-cpow2 was wrong.
-Palettes with rapid changes in color would produce slightly different outputs from Apo/Chaotica. This was due to a long standing bug from flam3.
-Use exec() on Apple and show() on all other OSes for dialog boxes.
-Trying to render a sequence with no frames would crash.
-Selecting multiple xforms and rotating them would produce the wrong rotation.
-Better handling when parsing flames using different encoding, such as unicode and UTF-8.
-Switching between SP/DP didn't reselect the selected flame in the Library tab.
--Code changes
-Make all types concerning palettes be floats, including PaletteTableWidgetItem.
-PaletteTableWidgetItem is no longer templated because all palettes are float.
-Include the source colors for user created gradients.
-Change parallel_for() calls to work with very old versions of TBB which are lingering on some systems.
-Split conditional out of accumulation loop on the CPU for better performance.
-Vectorize summing when doing density filter for better performance.
-Make all usage of palettes be of type float, double is pointless.
-Allow palettes to reside in multiple folders, while ensuring only one of each name is added.
-Refactor some palette path searching code.
-Make ReadFile() throw and catch an exception if the file operation fails.
-A little extra safety in foci and foci3D with a call to Zeps().
-Cast to (real_t) in the OpenCL string for the w variation, which was having trouble compiling on Mac.
-Fixing missing comma between paths in InitPaletteList().
-Move Xml and PaletteList classes into cpp to shorten build times when working on them.
-Remove default param values for IterOpenCLKernelCreator<T>::SharedDataIndexDefines in cpp file.
-Change more NULL to nullptr.
2017-02-26 03:02:21 -05:00
{
m_GL - > glVertex2f ( fx , yLow ) ;
m_GL - > glVertex2f ( fx , yHigh ) ;
}
2018-01-28 20:51:19 -05:00
for ( float fy = yLow , i = 0 ; fy < yHigh & & i < ysteps ; fy + = GridStep , i + + )
--User changes
-Add a palette editor.
-Add support for reading .ugr/.gradient/.gradients palette files.
-Allow toggling on spinners whose minimum value is not zero.
-Allow toggling display of image, affines and grid.
-Add new variations: cylinder2, circlesplit, tile_log, truchet_fill, waves2_radial.
--Bug fixes
-cpow2 was wrong.
-Palettes with rapid changes in color would produce slightly different outputs from Apo/Chaotica. This was due to a long standing bug from flam3.
-Use exec() on Apple and show() on all other OSes for dialog boxes.
-Trying to render a sequence with no frames would crash.
-Selecting multiple xforms and rotating them would produce the wrong rotation.
-Better handling when parsing flames using different encoding, such as unicode and UTF-8.
-Switching between SP/DP didn't reselect the selected flame in the Library tab.
--Code changes
-Make all types concerning palettes be floats, including PaletteTableWidgetItem.
-PaletteTableWidgetItem is no longer templated because all palettes are float.
-Include the source colors for user created gradients.
-Change parallel_for() calls to work with very old versions of TBB which are lingering on some systems.
-Split conditional out of accumulation loop on the CPU for better performance.
-Vectorize summing when doing density filter for better performance.
-Make all usage of palettes be of type float, double is pointless.
-Allow palettes to reside in multiple folders, while ensuring only one of each name is added.
-Refactor some palette path searching code.
-Make ReadFile() throw and catch an exception if the file operation fails.
-A little extra safety in foci and foci3D with a call to Zeps().
-Cast to (real_t) in the OpenCL string for the w variation, which was having trouble compiling on Mac.
-Fixing missing comma between paths in InitPaletteList().
-Move Xml and PaletteList classes into cpp to shorten build times when working on them.
-Remove default param values for IterOpenCLKernelCreator<T>::SharedDataIndexDefines in cpp file.
-Change more NULL to nullptr.
2017-02-26 03:02:21 -05:00
{
m_GL - > glVertex2f ( xLow , fy ) ;
m_GL - > glVertex2f ( xHigh , fy ) ;
}
m_GL - > glColor4f ( 1.0f , 0.0f , 0.0f , alpha ) ;
m_GL - > glVertex2f ( 0.0f , 0.0f ) ;
m_GL - > glVertex2f ( xHigh , 0.0f ) ;
m_GL - > glColor4f ( 0.5f , 0.0f , 0.0f , alpha ) ;
m_GL - > glVertex2f ( 0.0f , 0.0f ) ;
m_GL - > glVertex2f ( xLow , 0.0f ) ;
m_GL - > glColor4f ( 0.0f , 1.0f , 0.0f , alpha ) ;
m_GL - > glVertex2f ( 0.0f , 0.0f ) ;
m_GL - > glVertex2f ( 0.0f , yHigh ) ;
m_GL - > glColor4f ( 0.0f , 0.5f , 0.0f , alpha ) ;
m_GL - > glVertex2f ( 0.0f , 0.0f ) ;
m_GL - > glVertex2f ( 0.0f , yLow ) ;
2017-12-13 18:32:50 -05:00
m_GL - > glColor4f ( 0.0f , 0.0f , 0.0f , 1.0f ) ;
--User changes
-Add a palette editor.
-Add support for reading .ugr/.gradient/.gradients palette files.
-Allow toggling on spinners whose minimum value is not zero.
-Allow toggling display of image, affines and grid.
-Add new variations: cylinder2, circlesplit, tile_log, truchet_fill, waves2_radial.
--Bug fixes
-cpow2 was wrong.
-Palettes with rapid changes in color would produce slightly different outputs from Apo/Chaotica. This was due to a long standing bug from flam3.
-Use exec() on Apple and show() on all other OSes for dialog boxes.
-Trying to render a sequence with no frames would crash.
-Selecting multiple xforms and rotating them would produce the wrong rotation.
-Better handling when parsing flames using different encoding, such as unicode and UTF-8.
-Switching between SP/DP didn't reselect the selected flame in the Library tab.
--Code changes
-Make all types concerning palettes be floats, including PaletteTableWidgetItem.
-PaletteTableWidgetItem is no longer templated because all palettes are float.
-Include the source colors for user created gradients.
-Change parallel_for() calls to work with very old versions of TBB which are lingering on some systems.
-Split conditional out of accumulation loop on the CPU for better performance.
-Vectorize summing when doing density filter for better performance.
-Make all usage of palettes be of type float, double is pointless.
-Allow palettes to reside in multiple folders, while ensuring only one of each name is added.
-Refactor some palette path searching code.
-Make ReadFile() throw and catch an exception if the file operation fails.
-A little extra safety in foci and foci3D with a call to Zeps().
-Cast to (real_t) in the OpenCL string for the w variation, which was having trouble compiling on Mac.
-Fixing missing comma between paths in InitPaletteList().
-Move Xml and PaletteList classes into cpp to shorten build times when working on them.
-Remove default param values for IterOpenCLKernelCreator<T>::SharedDataIndexDefines in cpp file.
-Change more NULL to nullptr.
2017-02-26 03:02:21 -05:00
m_GL - > glEnd ( ) ;
m_GL - > glPopMatrix ( ) ;
2018-03-28 00:32:10 -04:00
# else
m4T mat = ( temp * scale ) . ToMat4ColMajor ( ) ;
glm : : tmat4x4 < float , glm : : defaultp > tempmat4 = mat ;
m_GL - > m_ModelViewMatrix = QMatrix4x4 ( glm : : value_ptr ( tempmat4 ) ) ;
m_GL - > glLineWidth ( 1.0f * m_GL - > devicePixelRatioF ( ) ) ;
m_Verts . clear ( ) ;
for ( float fx = xLow , i = 0 ; fx < = xHigh & & i < xsteps ; fx + = GridStep , i + + )
{
m_Verts . push_back ( fx ) ;
m_Verts . push_back ( yLow ) ;
m_Verts . push_back ( fx ) ;
m_Verts . push_back ( yHigh ) ;
}
for ( float fy = yLow , i = 0 ; fy < yHigh & & i < ysteps ; fy + = GridStep , i + + )
{
m_Verts . push_back ( xLow ) ;
m_Verts . push_back ( fy ) ;
m_Verts . push_back ( xHigh ) ;
m_Verts . push_back ( fy ) ;
}
QVector4D col ( 0.5f , 0.5f , 0.5f , alpha ) ;
m_GL - > DrawPointOrLine ( col , m_Verts , GL_LINES ) ;
m_Verts . clear ( ) ;
m_Verts . push_back ( 0.0f ) ;
m_Verts . push_back ( 0.0f ) ;
m_Verts . push_back ( xHigh ) ;
m_Verts . push_back ( 0.0f ) ;
col = QVector4D ( 1.0f , 0.0f , 0.0f , alpha ) ;
m_GL - > DrawPointOrLine ( col , m_Verts , GL_LINES ) ;
m_Verts . clear ( ) ;
m_Verts . push_back ( 0.0f ) ;
m_Verts . push_back ( 0.0f ) ;
m_Verts . push_back ( xLow ) ;
m_Verts . push_back ( 0.0f ) ;
col = QVector4D ( 0.5f , 0.0f , 0.0f , alpha ) ;
m_GL - > DrawPointOrLine ( col , m_Verts , GL_LINES ) ;
m_Verts . clear ( ) ;
m_Verts . push_back ( 0.0f ) ;
m_Verts . push_back ( 0.0f ) ;
m_Verts . push_back ( 0.0f ) ;
m_Verts . push_back ( yHigh ) ;
col = QVector4D ( 0.0f , 1.0f , 0.0f , alpha ) ;
m_GL - > DrawPointOrLine ( col , m_Verts , GL_LINES ) ;
m_Verts . clear ( ) ;
m_Verts . push_back ( 0.0f ) ;
m_Verts . push_back ( 0.0f ) ;
m_Verts . push_back ( 0.0f ) ;
m_Verts . push_back ( yLow ) ;
col = QVector4D ( 0.0f , 0.5f , 0.0f , alpha ) ;
m_GL - > DrawPointOrLine ( col , m_Verts , GL_LINES ) ;
# endif
--User changes
-Add a palette editor.
-Add support for reading .ugr/.gradient/.gradients palette files.
-Allow toggling on spinners whose minimum value is not zero.
-Allow toggling display of image, affines and grid.
-Add new variations: cylinder2, circlesplit, tile_log, truchet_fill, waves2_radial.
--Bug fixes
-cpow2 was wrong.
-Palettes with rapid changes in color would produce slightly different outputs from Apo/Chaotica. This was due to a long standing bug from flam3.
-Use exec() on Apple and show() on all other OSes for dialog boxes.
-Trying to render a sequence with no frames would crash.
-Selecting multiple xforms and rotating them would produce the wrong rotation.
-Better handling when parsing flames using different encoding, such as unicode and UTF-8.
-Switching between SP/DP didn't reselect the selected flame in the Library tab.
--Code changes
-Make all types concerning palettes be floats, including PaletteTableWidgetItem.
-PaletteTableWidgetItem is no longer templated because all palettes are float.
-Include the source colors for user created gradients.
-Change parallel_for() calls to work with very old versions of TBB which are lingering on some systems.
-Split conditional out of accumulation loop on the CPU for better performance.
-Vectorize summing when doing density filter for better performance.
-Make all usage of palettes be of type float, double is pointless.
-Allow palettes to reside in multiple folders, while ensuring only one of each name is added.
-Refactor some palette path searching code.
-Make ReadFile() throw and catch an exception if the file operation fails.
-A little extra safety in foci and foci3D with a call to Zeps().
-Cast to (real_t) in the OpenCL string for the w variation, which was having trouble compiling on Mac.
-Fixing missing comma between paths in InitPaletteList().
-Move Xml and PaletteList classes into cpp to shorten build times when working on them.
-Remove default param values for IterOpenCLKernelCreator<T>::SharedDataIndexDefines in cpp file.
-Change more NULL to nullptr.
2017-02-26 03:02:21 -05:00
}
2014-07-08 03:11:14 -04:00
/// <summary>
/// Draw the pre or post affine circle for the passed in xform.
/// For drawing affine transforms, multiply the identity model view matrix by the
/// affine for each xform, so that all points are considered to be "1".
/// </summary>
/// <param name="xform">A pointer to the xform whose affine will be drawn</param>
/// <param name="pre">True for pre affine, else false for post.</param>
/// <param name="selected">True if selected (draw enclosing circle), else false (only draw axes).</param>
2018-09-15 06:11:12 -04:00
/// <param name="hovered">True if the xform is being hovered over (draw tansparent disc), else false (no disc).</param>
2014-07-08 03:11:14 -04:00
template < typename T >
2020-01-25 14:12:49 -05:00
void GLEmberController < T > : : DrawAffine ( const Xform < T > * xform , bool pre , bool selected , bool hovered )
2014-07-08 03:11:14 -04:00
{
2016-02-02 20:51:58 -05:00
auto ember = m_FractoriumEmberController - > CurrentEmber ( ) ;
2016-02-12 00:38:21 -05:00
auto final = ember - > IsFinalXform ( xform ) ;
auto index = ember - > GetXformIndex ( xform ) ;
auto size = ember - > m_Palette . m_Entries . size ( ) ;
auto color = ember - > m_Palette . m_Entries [ Clamp < T > ( xform - > m_ColorX * size , 0 , size - 1 ) ] ;
2016-05-24 10:02:05 -04:00
auto & affine = pre ? xform - > m_Affine : xform - > m_Post ;
2018-03-28 00:32:10 -04:00
# ifndef USE_GLSL
2014-07-08 03:11:14 -04:00
//For some incredibly strange reason, even though glm and OpenGL use matrices with a column-major
//data layout, nothing will work here unless they are flipped to row major order. This is how it was
//done in Fractron.
2016-05-24 10:02:05 -04:00
m4T mat = ( affine * m_FractoriumEmberController - > AffineScaleCurrentToLocked ( ) ) . ToMat4RowMajor ( ) ;
2014-07-08 03:11:14 -04:00
m_GL - > glPushMatrix ( ) ;
m_GL - > glLoadIdentity ( ) ;
MultMatrix ( mat ) ;
2018-03-28 00:32:10 -04:00
//QueryMatrices(true);
--User changes
-Support 4k monitors, and in general, properly scale any monitor that is not HD.
-Allow for a spatial filter of radius zero, which means do not use a spatial filter.
-Add new variations: concentric, cpow3, helicoid, helix, rand_cubes, sphereblur.
-Use a new method for computing elliptic which is more precise. Developed by Discord user Claude.
-Remove the 8 variation per xform limitation on the GPU.
-Allow for loading the last flame file on startup, rather than randoms.
-Use two different default quality values in the interactive renderer, one each for CPU and GPU.
-Creating linked xforms was using non-standard behavior. Make it match Apo and also support creating multiple linked xforms at once.
--Bug fixes
-No variations in an xform used to have the same behavior as a single linear variation with weight 1. While sensible, this breaks backward compatibility. No variations now sets the output point to zeroes.
-Prevent crashing the program when adjusting a value on the main window while a final render is in progress.
-The xaos table was inverted.
--Code changes
-Convert projects to Visual Studio 2017.
-Change bad vals from +- 1e10 to +-1e20.
-Reintroduce the symmetry tag in xforms for legacy support in programs that do not use color_speed.
-Compiler will not let us use default values in templated member functions anymore.
2017-11-26 20:27:00 -05:00
m_GL - > glLineWidth ( 3.0f * m_GL - > devicePixelRatioF ( ) ) ; //One 3px wide, colored black, except green on x axis for post affine.
2018-09-15 06:11:12 -04:00
m_GL - > DrawAffineHelper ( index , selected , hovered , pre , final , true ) ;
--User changes
-Support 4k monitors, and in general, properly scale any monitor that is not HD.
-Allow for a spatial filter of radius zero, which means do not use a spatial filter.
-Add new variations: concentric, cpow3, helicoid, helix, rand_cubes, sphereblur.
-Use a new method for computing elliptic which is more precise. Developed by Discord user Claude.
-Remove the 8 variation per xform limitation on the GPU.
-Allow for loading the last flame file on startup, rather than randoms.
-Use two different default quality values in the interactive renderer, one each for CPU and GPU.
-Creating linked xforms was using non-standard behavior. Make it match Apo and also support creating multiple linked xforms at once.
--Bug fixes
-No variations in an xform used to have the same behavior as a single linear variation with weight 1. While sensible, this breaks backward compatibility. No variations now sets the output point to zeroes.
-Prevent crashing the program when adjusting a value on the main window while a final render is in progress.
-The xaos table was inverted.
--Code changes
-Convert projects to Visual Studio 2017.
-Change bad vals from +- 1e10 to +-1e20.
-Reintroduce the symmetry tag in xforms for legacy support in programs that do not use color_speed.
-Compiler will not let us use default values in templated member functions anymore.
2017-11-26 20:27:00 -05:00
m_GL - > glLineWidth ( 1.0f * m_GL - > devicePixelRatioF ( ) ) ; //Again 1px wide, colored white, to give a white middle with black outline effect.
2018-09-15 06:11:12 -04:00
m_GL - > DrawAffineHelper ( index , selected , hovered , pre , final , false ) ;
--User changes
-Support 4k monitors, and in general, properly scale any monitor that is not HD.
-Allow for a spatial filter of radius zero, which means do not use a spatial filter.
-Add new variations: concentric, cpow3, helicoid, helix, rand_cubes, sphereblur.
-Use a new method for computing elliptic which is more precise. Developed by Discord user Claude.
-Remove the 8 variation per xform limitation on the GPU.
-Allow for loading the last flame file on startup, rather than randoms.
-Use two different default quality values in the interactive renderer, one each for CPU and GPU.
-Creating linked xforms was using non-standard behavior. Make it match Apo and also support creating multiple linked xforms at once.
--Bug fixes
-No variations in an xform used to have the same behavior as a single linear variation with weight 1. While sensible, this breaks backward compatibility. No variations now sets the output point to zeroes.
-Prevent crashing the program when adjusting a value on the main window while a final render is in progress.
-The xaos table was inverted.
--Code changes
-Convert projects to Visual Studio 2017.
-Change bad vals from +- 1e10 to +-1e20.
-Reintroduce the symmetry tag in xforms for legacy support in programs that do not use color_speed.
-Compiler will not let us use default values in templated member functions anymore.
2017-11-26 20:27:00 -05:00
m_GL - > glPointSize ( 5.0f * m_GL - > devicePixelRatioF ( ) ) ; //Three black points, one in the center and two on the circle. Drawn big 5px first to give a black outline.
2014-07-08 03:11:14 -04:00
m_GL - > glBegin ( GL_POINTS ) ;
m_GL - > glColor4f ( 0.0f , 0.0f , 0.0f , selected ? 1.0f : 0.5f ) ;
m_GL - > glVertex2f ( 0.0f , 0.0f ) ;
m_GL - > glVertex2f ( 1.0f , 0.0f ) ;
m_GL - > glVertex2f ( 0.0f , 1.0f ) ;
m_GL - > glEnd ( ) ;
--User changes
-Support 4k monitors, and in general, properly scale any monitor that is not HD.
-Allow for a spatial filter of radius zero, which means do not use a spatial filter.
-Add new variations: concentric, cpow3, helicoid, helix, rand_cubes, sphereblur.
-Use a new method for computing elliptic which is more precise. Developed by Discord user Claude.
-Remove the 8 variation per xform limitation on the GPU.
-Allow for loading the last flame file on startup, rather than randoms.
-Use two different default quality values in the interactive renderer, one each for CPU and GPU.
-Creating linked xforms was using non-standard behavior. Make it match Apo and also support creating multiple linked xforms at once.
--Bug fixes
-No variations in an xform used to have the same behavior as a single linear variation with weight 1. While sensible, this breaks backward compatibility. No variations now sets the output point to zeroes.
-Prevent crashing the program when adjusting a value on the main window while a final render is in progress.
-The xaos table was inverted.
--Code changes
-Convert projects to Visual Studio 2017.
-Change bad vals from +- 1e10 to +-1e20.
-Reintroduce the symmetry tag in xforms for legacy support in programs that do not use color_speed.
-Compiler will not let us use default values in templated member functions anymore.
2017-11-26 20:27:00 -05:00
m_GL - > glLineWidth ( 2.0f * m_GL - > devicePixelRatioF ( ) ) ; //Draw lines again for y axis only, without drawing the circle, using the color of the selected xform.
2014-07-08 03:11:14 -04:00
m_GL - > glBegin ( GL_LINES ) ;
m_GL - > glColor4f ( color . r , color . g , color . b , 1.0f ) ;
m_GL - > glVertex2f ( 0.0f , 0.0f ) ;
m_GL - > glVertex2f ( 0.0f , 1.0f ) ;
m_GL - > glEnd ( ) ;
--User changes
-Support 4k monitors, and in general, properly scale any monitor that is not HD.
-Allow for a spatial filter of radius zero, which means do not use a spatial filter.
-Add new variations: concentric, cpow3, helicoid, helix, rand_cubes, sphereblur.
-Use a new method for computing elliptic which is more precise. Developed by Discord user Claude.
-Remove the 8 variation per xform limitation on the GPU.
-Allow for loading the last flame file on startup, rather than randoms.
-Use two different default quality values in the interactive renderer, one each for CPU and GPU.
-Creating linked xforms was using non-standard behavior. Make it match Apo and also support creating multiple linked xforms at once.
--Bug fixes
-No variations in an xform used to have the same behavior as a single linear variation with weight 1. While sensible, this breaks backward compatibility. No variations now sets the output point to zeroes.
-Prevent crashing the program when adjusting a value on the main window while a final render is in progress.
-The xaos table was inverted.
--Code changes
-Convert projects to Visual Studio 2017.
-Change bad vals from +- 1e10 to +-1e20.
-Reintroduce the symmetry tag in xforms for legacy support in programs that do not use color_speed.
-Compiler will not let us use default values in templated member functions anymore.
2017-11-26 20:27:00 -05:00
m_GL - > glPointSize ( 3.0f * m_GL - > devicePixelRatioF ( ) ) ; //Draw smaller white points, to give a black outline effect.
2014-07-08 03:11:14 -04:00
m_GL - > glBegin ( GL_POINTS ) ;
m_GL - > glColor4f ( 1.0f , 1.0f , 1.0f , selected ? 1.0f : 0.5f ) ;
m_GL - > glVertex2f ( 0.0f , 0.0f ) ;
m_GL - > glVertex2f ( 1.0f , 0.0f ) ;
m_GL - > glVertex2f ( 0.0f , 1.0f ) ;
2017-12-13 18:32:50 -05:00
m_GL - > glColor4f ( 0.0f , 0.0f , 0.0f , 1.0f ) ;
2014-07-08 03:11:14 -04:00
m_GL - > glEnd ( ) ;
m_GL - > glPopMatrix ( ) ;
2018-03-28 00:32:10 -04:00
# else
m4T mat = ( affine * m_FractoriumEmberController - > AffineScaleCurrentToLocked ( ) ) . ToMat4ColMajor ( ) ;
glm : : tmat4x4 < float , glm : : defaultp > tempmat4 = mat ;
m_GL - > m_ModelViewMatrix = QMatrix4x4 ( glm : : value_ptr ( tempmat4 ) ) ;
2018-09-25 22:12:48 -04:00
m_GL - > DrawAffineHelper ( index , 1.0 , 3.0 , selected , hovered , pre , final , true ) ; //Circle line width is thinner than the line width for the axes, just to distinguish it.
m_GL - > DrawAffineHelper ( index , 0.5 , 2.0 , selected , hovered , pre , final , false ) ;
2018-03-28 00:32:10 -04:00
QVector4D col ( 0.0f , 0.0f , 0.0f , selected ? 1.0f : 0.5f ) ;
m_Verts . clear ( ) ;
m_Verts . push_back ( 0.0f ) ;
m_Verts . push_back ( 0.0f ) ;
m_Verts . push_back ( 1.0f ) ;
m_Verts . push_back ( 0.0f ) ;
m_Verts . push_back ( 0.0f ) ;
m_Verts . push_back ( 1.0f ) ;
2018-09-25 21:37:26 -04:00
m_GL - > DrawPointOrLine ( col , m_Verts , GL_POINTS , ! pre , 6.0f ) ; //Three black points, one in the center and two on the circle. Drawn big 5px first to give a black outline.
2018-09-25 22:12:48 -04:00
//Somewhat of a hack, since it's drawing over the Y axis line it just drew.
m_GL - > glLineWidth ( 2.0f * m_GL - > devicePixelRatioF ( ) ) ; //Draw lines again for y axis only, using the color of the selected xform.
2018-03-28 00:32:10 -04:00
m_Verts . clear ( ) ;
m_Verts . push_back ( 0.0f ) ;
m_Verts . push_back ( 0.0f ) ;
m_Verts . push_back ( 0.0f ) ;
m_Verts . push_back ( 1.0f ) ;
col = QVector4D ( color . r , color . g , color . b , 1.0f ) ;
2018-07-31 00:39:41 -04:00
m_GL - > DrawPointOrLine ( col , m_Verts , GL_LINES , ! pre ) ;
2018-09-25 22:12:48 -04:00
//Line from x to y in the color of the xform combo, thinner and solid with no background to somewhat distinguish it.
m_GL - > glLineWidth ( 0.5f * m_GL - > devicePixelRatioF ( ) ) ;
2018-08-10 21:06:04 -04:00
m_Verts . clear ( ) ;
m_Verts . push_back ( 0 ) ;
m_Verts . push_back ( 1 ) ;
m_Verts . push_back ( 1 ) ;
m_Verts . push_back ( 0 ) ;
auto qcol = final ? m_Fractorium - > m_FinalXformComboColor : m_Fractorium - > m_XformComboColors [ index % XFORM_COLOR_COUNT ] ;
m_GL - > DrawPointOrLine ( QVector4D ( qcol . redF ( ) , qcol . greenF ( ) , qcol . blueF ( ) , 1.0f ) , m_Verts , GL_LINES , ! pre ) ;
2018-03-28 00:32:10 -04:00
//
2018-09-25 22:12:48 -04:00
m_GL - > glLineWidth ( 2.0f * m_GL - > devicePixelRatioF ( ) ) ;
2018-03-28 00:32:10 -04:00
m_Verts . clear ( ) ;
2018-09-25 21:37:26 -04:00
m_Verts . push_back ( 0.0f ) ; //Center.
2018-03-28 00:32:10 -04:00
m_Verts . push_back ( 0.0f ) ;
2018-09-25 21:37:26 -04:00
col = QVector4D ( 1.0f , 1.0f , 1.0f , selected ? 1.0f : 0.5f ) ;
m_GL - > DrawPointOrLine ( col , m_Verts , GL_POINTS , false , 5.0f ) ; //Draw smaller white point, to give a black outline effect.
m_Verts . clear ( ) ;
m_Verts . push_back ( 1.0f ) ; //X axis.
2018-03-28 00:32:10 -04:00
m_Verts . push_back ( 0.0f ) ;
2018-09-25 21:37:26 -04:00
col = QVector4D ( 0.0f , 1.0f , 0.0f , selected ? 1.0f : 0.5f ) ;
m_GL - > DrawPointOrLine ( col , m_Verts , GL_POINTS , false , 5.0f ) ; //Draw smaller green point, to give a black outline effect.
m_Verts . clear ( ) ;
m_Verts . push_back ( 0.0f ) ; //Y axis.
2018-03-28 00:32:10 -04:00
m_Verts . push_back ( 1.0f ) ;
2018-09-25 21:37:26 -04:00
col = QVector4D ( 1.0f , 0.0f , 1.0f , selected ? 1.0f : 0.5f ) ;
m_GL - > DrawPointOrLine ( col , m_Verts , GL_POINTS , false , 5.0f ) ; //Draw smaller purple point, to give a black outline effect.
2018-03-28 00:32:10 -04:00
m_GL - > m_ModelViewMatrix . setToIdentity ( ) ;
# endif
2014-07-08 03:11:14 -04:00
}
/// <summary>
/// Draw the axes, and optionally the surrounding circle
/// of an affine transform.
/// </summary>
2014-07-26 15:03:51 -04:00
/// <param name="index"></param>
2018-09-25 22:12:48 -04:00
/// <param name="circleWidth"></param>
/// <param name="lineWidth"></param>
2014-07-08 03:11:14 -04:00
/// <param name="selected">True if selected (draw enclosing circle), else false (only draw axes).</param>
2018-09-15 06:11:12 -04:00
/// <param name="hovered">True if the xform is being hovered over (draw tansparent disc), else false (no disc).</param>
2014-07-26 15:03:51 -04:00
/// <param name="pre"></param>
/// <param name="final"></param>
/// <param name="background"></param>
2018-09-25 22:12:48 -04:00
void GLWidget : : DrawAffineHelper ( int index , float circleWidth , float lineWidth , bool selected , bool hovered , bool pre , bool final , bool background )
2014-07-08 03:11:14 -04:00
{
float px = 1.0f ;
float py = 0.0f ;
2016-02-12 00:38:21 -05:00
auto col = final ? m_Fractorium - > m_FinalXformComboColor : m_Fractorium - > m_XformComboColors [ index % XFORM_COLOR_COUNT ] ;
2018-03-28 00:32:10 -04:00
# ifndef USE_GLSL
2014-07-08 03:11:14 -04:00
glBegin ( GL_LINES ) ;
//Circle part.
if ( ! background )
{
2014-07-26 15:03:51 -04:00
glColor4f ( col . redF ( ) , col . greenF ( ) , col . blueF ( ) , 1.0f ) ; //Draw pre affine transform with white.
2014-07-08 03:11:14 -04:00
}
else
{
2014-07-26 15:03:51 -04:00
glColor4f ( 0.0f , 0.0f , 0.0f , 1.0f ) ; //Draw pre affine transform outline with white.
2014-07-08 03:11:14 -04:00
}
if ( selected )
{
--User changes
-Add support for multiple GPU devices.
--These options are present in the command line and in Fractorium.
-Change scheme of specifying devices from platform,device to just total device index.
--Single number on the command line.
--Change from combo boxes for device selection to a table of all devices in Fractorium.
-Temporal samples defaults to 100 instead of 1000 which was needless overkill.
--Bug fixes
-EmberAnimate, EmberRender, FractoriumSettings, FinalRenderDialog: Fix wrong order of arguments to Clamp() when assigning thread priority.
-VariationsDC.h: Fix NVidia OpenCL compilation error in DCTriangleVariation.
-FractoriumXformsColor.cpp: Checking for null pixmap pointer is not enough, must also check if the underlying buffer is null via call to QPixmap::isNull().
--Code changes
-Ember.h: Add case for FLAME_MOTION_NONE and default in ApplyFlameMotion().
-EmberMotion.h: Call base constructor.
-EmberPch.h: #pragma once only on Windows.
-EmberToXml.h:
--Handle different types of exceptions.
--Add default cases to ToString().
-Isaac.h: Remove unused variable in constructor.
-Point.h: Call base constructor in Color().
-Renderer.h/cpp:
--Add bool to Alloc() to only allocate memory for the histogram. Needed for multi-GPU.
--Make CoordMap() return a const ref, not a pointer.
-SheepTools.h:
--Use 64-bit types like the rest of the code already does.
--Fix some comment misspellings.
-Timing.h: Make BeginTime(), EndTime(), ElapsedTime() and Format() be const functions.
-Utils.h:
--Add new functions Equal() and Split().
--Handle more exception types in ReadFile().
--Get rid of most legacy blending of C and C++ argument parsing.
-XmlToEmber.h:
--Get rid of most legacy blending of C and C++ code from flam3.
--Remove some unused variables.
-EmberAnimate:
--Support multi-GPU processing that alternates full frames between devices.
--Use OpenCLInfo instead of OpenCLWrapper for --openclinfo option.
--Remove bucketT template parameter, and hard code float in its place.
--If a render fails, exit since there is no point in continuing an animation with a missing frame.
--Pass variables to threaded save better, which most likely fixes a very subtle bug that existed before.
--Remove some unused variables.
-EmberGenome, EmberRender:
--Support multi-GPU processing that alternates full frames between devices.
--Use OpenCLInfo instead of OpenCLWrapper for --openclinfo option.
--Remove bucketT template parameter, and hard code float in its place.
-EmberRender:
--Support multi-GPU processing that alternates full frames between devices.
--Use OpenCLInfo instead of OpenCLWrapper for --openclinfo option.
--Remove bucketT template parameter, and hard code float in its place.
--Only print values when not rendering with OpenCL, since they're always 0 in that case.
-EmberCLPch.h:
--#pragma once only on Windows.
--#include <atomic>.
-IterOpenCLKernelCreator.h: Add new kernel for summing two histograms. This is needed for multi-GPU.
-OpenCLWrapper.h:
--Move all OpenCL info related code into its own class OpenCLInfo.
--Add members to cache the values of global memory size and max allocation size.
-RendererCL.h/cpp:
--Redesign to accomodate multi-GPU.
--Constructor now takes a vector of devices.
--Remove DumpErrorReport() function, it's handled in the base.
--ClearBuffer(), ReadPoints(), WritePoints(), ReadHist() and WriteHist() now optionally take a device index as a parameter.
--MakeDmap() override and m_DmapCL member removed because it no longer applies since the histogram is always float since the last commit.
--Add new function SumDeviceHist() to sum histograms from two devices by first copying to a temporary on the host, then a temporary on the device, then summing.
--m_Calls member removed, as it's now per-device.
--OpenCLWrapper removed.
--m_Seeds member is now a vector of vector of seeds, to accomodate a separate and different array of seeds for each device.
--Added member m_Devices, a vector of unique_ptr of RendererCLDevice.
-EmberCommon.h
--Added Devices() function to convert from a vector of device indices to a vector of platform,device indices.
--Changed CreateRenderer() to accept a vector of devices to create a single RendererCL which will split work across multiple devices.
--Added CreateRenderers() function to accept a vector of devices to create multiple RendererCL, each which will render on a single device.
--Add more comments to some existing functions.
-EmberCommonPch.h: #pragma once only on Windows.
-EmberOptions.h:
--Remove --platform option, it's just sequential device number now with the --device option.
--Make --out be OPT_USE_RENDER instead of OPT_RENDER_ANIM since it's an error condition when animating. It makes no sense to write all frames to a single image.
--Add Devices() function to parse comma separated --device option string and return a vector of device indices.
--Make int and uint types be 64-bit, so intmax_t and size_t.
--Make better use of macros.
-JpegUtils.h: Make string parameters to WriteJpeg() and WritePng() be const ref.
-All project files: Turn off buffer security check option in Visual Studio (/Gs-)
-deployment.pri: Remove the line OTHER_FILES +=, it's pointless and was causing problems.
-Ember.pro, EmberCL.pro: Add CONFIG += plugin, otherwise it wouldn't link.
-EmberCL.pro: Add new files for multi-GPU support.
-build_all.sh: use -j4 and QMAKE=${QMAKE:/usr/bin/qmake}
-shared_settings.pri:
-Add version string.
-Remove old DESTDIR definitions.
-Add the following lines or else nothing would build:
CONFIG(release, debug|release) {
CONFIG += warn_off
DESTDIR = ../../../Bin/release
}
CONFIG(debug, debug|release) {
DESTDIR = ../../../Bin/debug
}
QMAKE_POST_LINK += $$quote(cp --update ../../../Data/flam3-palettes.xml $${DESTDIR}$$escape_expand(\n\t))
LIBS += -L/usr/lib -lpthread
-AboutDialog.ui: Another futile attempt to make it look correct on Linux.
-FinalRenderDialog.h/cpp:
--Add support for multi-GPU.
--Change from combo boxes for device selection to a table of all devices.
--Ensure device selection makes sense.
--Remove "FinalRender" prefix of various function names, it's implied given the context.
-FinalRenderEmberController.h/cpp:
--Add support for multi-GPU.
--Change m_FinishedImageCount to be atomic.
--Move CancelRender() from the base to FinalRenderEmberController<T>.
--Refactor RenderComplete() to omit any progress related functionality or image saving since it can be potentially ran in a thread.
--Consolidate setting various renderer fields into SyncGuiToRenderer().
-Fractorium.cpp: Allow for resizing of the options dialog to show the entire device table.
-FractoriumCommon.h: Add various functions to handle a table showing the available OpenCL devices on the system.
-FractoriumEmberController.h/cpp: Remove m_FinalImageIndex, it's no longer needed.
-FractoriumRender.cpp: Scale the interactive sub batch count and quality by the number of devices used.
-FractoriumSettings.h/cpp:
--Temporal samples defaults to 100 instead of 1000 which was needless overkill.
--Add multi-GPU support, remove old device,platform pair.
-FractoriumToolbar.cpp: Disable OpenCL toolbar button if there are no devices present on the system.
-FractoriumOptionsDialog.h/cpp:
--Add support for multi-GPU.
--Consolidate more assignments in DataToGui().
--Enable/disable CPU/OpenCL items in response to OpenCL checkbox event.
-Misc: Convert almost everything to size_t for unsigned, intmax_t for signed.
2015-09-12 21:33:45 -04:00
for ( size_t i = 1 ; i < = 64 ; i + + ) //The circle.
2014-07-08 03:11:14 -04:00
{
2014-12-11 00:50:15 -05:00
float theta = float ( M_PI ) * 2.0f * float ( i % 64 ) / 64.0f ;
2016-02-12 00:38:21 -05:00
float fx = std : : cos ( theta ) ;
float fy = std : : sin ( theta ) ;
2014-07-08 03:11:14 -04:00
glVertex2f ( px , py ) ;
2014-12-11 00:50:15 -05:00
glVertex2f ( fx , fy ) ;
px = fx ;
py = fy ;
2014-07-08 03:11:14 -04:00
}
}
//Lines from center to circle.
if ( ! background )
{
2014-07-26 15:03:51 -04:00
glColor4f ( col . redF ( ) , col . greenF ( ) , col . blueF ( ) , 1.0f ) ;
2014-07-08 03:11:14 -04:00
}
else
{
2014-07-26 15:03:51 -04:00
if ( pre )
glColor4f ( 0.0f , 0.0f , 0.0f , 1.0f ) ; //Draw pre affine transform outline with white.
else
glColor4f ( 0.0f , 0.75f , 0.0f , 1.0f ) ; //Draw post affine transform outline with green.
2014-07-08 03:11:14 -04:00
}
//The lines from the center to the circle.
glVertex2f ( 0.0f , 0.0f ) ; //X axis.
glVertex2f ( 1.0f , 0.0f ) ;
2016-01-04 19:50:15 -05:00
2014-07-08 03:11:14 -04:00
if ( background )
glColor4f ( 0.0f , 0.0f , 0.0f , 1.0f ) ;
glVertex2f ( 0.0f , 0.0f ) ; //Y axis.
glVertex2f ( 0.0f , 1.0f ) ;
glEnd ( ) ;
2018-03-28 00:32:10 -04:00
# else
QVector4D color ;
//Circle part.
if ( ! background )
{
2018-09-15 06:11:12 -04:00
color = QVector4D ( col . redF ( ) , col . greenF ( ) , col . blueF ( ) , hovered ? 0.25f : 1.0f ) ; //Draw pre affine transform with white.
2018-03-28 00:32:10 -04:00
}
else
{
2018-09-15 06:11:12 -04:00
color = QVector4D ( 0.0f , 0.0f , 0.0f , hovered ? 0.25f : 1.0f ) ; //Draw pre affine transform outline with white.
2018-03-28 00:32:10 -04:00
}
m_Verts . clear ( ) ;
2018-09-25 22:12:48 -04:00
glLineWidth ( circleWidth * devicePixelRatioF ( ) ) ; //One thinner, colored black, except green on x axis for post affine.
2018-03-28 00:32:10 -04:00
2018-09-15 06:11:12 -04:00
if ( selected | | hovered )
2018-03-28 00:32:10 -04:00
{
for ( size_t i = 1 ; i < = 64 ; i + + ) //The circle.
{
float theta = float ( M_PI ) * 2.0f * float ( i % 64 ) / 64.0f ;
float fx = std : : cos ( theta ) ;
float fy = std : : sin ( theta ) ;
m_Verts . push_back ( fx ) ;
m_Verts . push_back ( fy ) ;
}
2018-09-15 06:11:12 -04:00
DrawPointOrLine ( color , m_Verts , hovered ? GL_TRIANGLE_FAN : GL_LINE_LOOP , ! pre ) ;
}
2018-03-28 00:32:10 -04:00
2018-09-25 22:12:48 -04:00
glLineWidth ( lineWidth * devicePixelRatioF ( ) ) ; //One thicker, colored black, except green on x axis for post affine.
2018-03-28 00:32:10 -04:00
//Lines from center to circle.
if ( ! background )
{
color = QVector4D ( col . redF ( ) , col . greenF ( ) , col . blueF ( ) , 1.0f ) ;
}
else
{
if ( pre )
color = QVector4D ( 0.0f , 0.0f , 0.0f , 1.0f ) ; //Draw pre affine transform outline with white.
else
color = QVector4D ( 0.0f , 0.75f , 0.0f , 1.0f ) ; //Draw post affine transform outline with green.
}
//The lines from the center to the circle.
m_Verts . clear ( ) ;
m_Verts . push_back ( 0 ) ; //X axis.
m_Verts . push_back ( 0 ) ;
m_Verts . push_back ( 1 ) ;
m_Verts . push_back ( 0 ) ;
2018-07-31 00:39:41 -04:00
DrawPointOrLine ( color , m_Verts , GL_LINES , ! pre ) ;
2018-03-28 00:32:10 -04:00
if ( background )
color = QVector4D ( 0.0f , 0.0f , 0.0f , 1.0f ) ;
m_Verts . clear ( ) ;
m_Verts . push_back ( 0 ) ; //Y axis.
m_Verts . push_back ( 0 ) ;
m_Verts . push_back ( 0 ) ;
m_Verts . push_back ( 1 ) ;
2018-07-31 00:39:41 -04:00
DrawPointOrLine ( color , m_Verts , GL_LINES , ! pre ) ;
2018-03-28 00:32:10 -04:00
# endif
2014-07-08 03:11:14 -04:00
}
/// <summary>
/// Determine the index of the xform being hovered over if any.
/// Give precedence to the currently selected xform, if any.
/// </summary>
/// <param name="glCoords">The mouse raster coordinates to check</param>
/// <returns>The index of the xform being hovered over, else -1 if no hover.</returns>
template < typename T >
2020-01-25 14:12:49 -05:00
int GLEmberController < T > : : UpdateHover ( const v3T & glCoords )
2014-07-08 03:11:14 -04:00
{
2020-01-25 18:50:53 -05:00
bool pre = m_Fractorium - > DrawPreAffines ( ) ;
bool post = m_Fractorium - > DrawPostAffines ( ) ;
2017-05-31 22:50:05 -04:00
int i = 0 , bestIndex = - 1 ;
2014-07-08 03:11:14 -04:00
T bestDist = 10 ;
2016-02-02 20:51:58 -05:00
auto ember = m_FractoriumEmberController - > CurrentEmber ( ) ;
2016-01-04 19:50:15 -05:00
m_HoverType = eHoverType : : HoverNone ;
2014-07-08 03:11:14 -04:00
--User changes
-Add a palette editor.
-Add support for reading .ugr/.gradient/.gradients palette files.
-Allow toggling on spinners whose minimum value is not zero.
-Allow toggling display of image, affines and grid.
-Add new variations: cylinder2, circlesplit, tile_log, truchet_fill, waves2_radial.
--Bug fixes
-cpow2 was wrong.
-Palettes with rapid changes in color would produce slightly different outputs from Apo/Chaotica. This was due to a long standing bug from flam3.
-Use exec() on Apple and show() on all other OSes for dialog boxes.
-Trying to render a sequence with no frames would crash.
-Selecting multiple xforms and rotating them would produce the wrong rotation.
-Better handling when parsing flames using different encoding, such as unicode and UTF-8.
-Switching between SP/DP didn't reselect the selected flame in the Library tab.
--Code changes
-Make all types concerning palettes be floats, including PaletteTableWidgetItem.
-PaletteTableWidgetItem is no longer templated because all palettes are float.
-Include the source colors for user created gradients.
-Change parallel_for() calls to work with very old versions of TBB which are lingering on some systems.
-Split conditional out of accumulation loop on the CPU for better performance.
-Vectorize summing when doing density filter for better performance.
-Make all usage of palettes be of type float, double is pointless.
-Allow palettes to reside in multiple folders, while ensuring only one of each name is added.
-Refactor some palette path searching code.
-Make ReadFile() throw and catch an exception if the file operation fails.
-A little extra safety in foci and foci3D with a call to Zeps().
-Cast to (real_t) in the OpenCL string for the w variation, which was having trouble compiling on Mac.
-Fixing missing comma between paths in InitPaletteList().
-Move Xml and PaletteList classes into cpp to shorten build times when working on them.
-Remove default param values for IterOpenCLKernelCreator<T>::SharedDataIndexDefines in cpp file.
-Change more NULL to nullptr.
2017-02-26 03:02:21 -05:00
if ( m_Fractorium - > DrawXforms ( ) ) //Don't bother checking anything if the user wants to see no xforms.
2014-07-08 03:11:14 -04:00
{
2017-07-27 00:25:44 -04:00
bool forceFinal = m_Fractorium - > HaveFinal ( ) ;
--User changes
-Add a palette editor.
-Add support for reading .ugr/.gradient/.gradients palette files.
-Allow toggling on spinners whose minimum value is not zero.
-Allow toggling display of image, affines and grid.
-Add new variations: cylinder2, circlesplit, tile_log, truchet_fill, waves2_radial.
--Bug fixes
-cpow2 was wrong.
-Palettes with rapid changes in color would produce slightly different outputs from Apo/Chaotica. This was due to a long standing bug from flam3.
-Use exec() on Apple and show() on all other OSes for dialog boxes.
-Trying to render a sequence with no frames would crash.
-Selecting multiple xforms and rotating them would produce the wrong rotation.
-Better handling when parsing flames using different encoding, such as unicode and UTF-8.
-Switching between SP/DP didn't reselect the selected flame in the Library tab.
--Code changes
-Make all types concerning palettes be floats, including PaletteTableWidgetItem.
-PaletteTableWidgetItem is no longer templated because all palettes are float.
-Include the source colors for user created gradients.
-Change parallel_for() calls to work with very old versions of TBB which are lingering on some systems.
-Split conditional out of accumulation loop on the CPU for better performance.
-Vectorize summing when doing density filter for better performance.
-Make all usage of palettes be of type float, double is pointless.
-Allow palettes to reside in multiple folders, while ensuring only one of each name is added.
-Refactor some palette path searching code.
-Make ReadFile() throw and catch an exception if the file operation fails.
-A little extra safety in foci and foci3D with a call to Zeps().
-Cast to (real_t) in the OpenCL string for the w variation, which was having trouble compiling on Mac.
-Fixing missing comma between paths in InitPaletteList().
-Move Xml and PaletteList classes into cpp to shorten build times when working on them.
-Remove default param values for IterOpenCLKernelCreator<T>::SharedDataIndexDefines in cpp file.
-Change more NULL to nullptr.
2017-02-26 03:02:21 -05:00
//If there's a selected/current xform, check it first so it gets precedence over the others.
if ( m_SelectedXform )
2014-07-08 03:11:14 -04:00
{
--User changes
-Add a palette editor.
-Add support for reading .ugr/.gradient/.gradients palette files.
-Allow toggling on spinners whose minimum value is not zero.
-Allow toggling display of image, affines and grid.
-Add new variations: cylinder2, circlesplit, tile_log, truchet_fill, waves2_radial.
--Bug fixes
-cpow2 was wrong.
-Palettes with rapid changes in color would produce slightly different outputs from Apo/Chaotica. This was due to a long standing bug from flam3.
-Use exec() on Apple and show() on all other OSes for dialog boxes.
-Trying to render a sequence with no frames would crash.
-Selecting multiple xforms and rotating them would produce the wrong rotation.
-Better handling when parsing flames using different encoding, such as unicode and UTF-8.
-Switching between SP/DP didn't reselect the selected flame in the Library tab.
--Code changes
-Make all types concerning palettes be floats, including PaletteTableWidgetItem.
-PaletteTableWidgetItem is no longer templated because all palettes are float.
-Include the source colors for user created gradients.
-Change parallel_for() calls to work with very old versions of TBB which are lingering on some systems.
-Split conditional out of accumulation loop on the CPU for better performance.
-Vectorize summing when doing density filter for better performance.
-Make all usage of palettes be of type float, double is pointless.
-Allow palettes to reside in multiple folders, while ensuring only one of each name is added.
-Refactor some palette path searching code.
-Make ReadFile() throw and catch an exception if the file operation fails.
-A little extra safety in foci and foci3D with a call to Zeps().
-Cast to (real_t) in the OpenCL string for the w variation, which was having trouble compiling on Mac.
-Fixing missing comma between paths in InitPaletteList().
-Move Xml and PaletteList classes into cpp to shorten build times when working on them.
-Remove default param values for IterOpenCLKernelCreator<T>::SharedDataIndexDefines in cpp file.
-Change more NULL to nullptr.
2017-02-26 03:02:21 -05:00
//These checks prevent highlighting the pre/post selected xform circle, when one is set to show all, and the other
//is set to show current, and the user hovers over another xform, but doesn't select it, then moves the mouse
//back over the hidden circle for the pre/post that was set to only show current.
2018-09-15 06:11:12 -04:00
bool isSel = m_Fractorium - > IsXformSelected ( ember - > GetTotalXformIndex ( m_SelectedXform ) ) ;
2019-06-21 20:51:20 -04:00
bool checkPre = pre & & ( m_Fractorium - > DrawAllPre ( ) | | ( m_Fractorium - > DrawSelectedPre ( ) & & isSel ) ) ;
bool checkPost = post & & ( m_Fractorium - > DrawAllPost ( ) | | ( m_Fractorium - > DrawSelectedPost ( ) & & isSel ) ) ;
2014-07-08 03:11:14 -04:00
2018-09-15 06:11:12 -04:00
if ( CheckXformHover ( m_SelectedXform , glCoords , bestDist , checkPre , checkPost ) )
2014-07-08 03:11:14 -04:00
{
--User changes
-Add a palette editor.
-Add support for reading .ugr/.gradient/.gradients palette files.
-Allow toggling on spinners whose minimum value is not zero.
-Allow toggling display of image, affines and grid.
-Add new variations: cylinder2, circlesplit, tile_log, truchet_fill, waves2_radial.
--Bug fixes
-cpow2 was wrong.
-Palettes with rapid changes in color would produce slightly different outputs from Apo/Chaotica. This was due to a long standing bug from flam3.
-Use exec() on Apple and show() on all other OSes for dialog boxes.
-Trying to render a sequence with no frames would crash.
-Selecting multiple xforms and rotating them would produce the wrong rotation.
-Better handling when parsing flames using different encoding, such as unicode and UTF-8.
-Switching between SP/DP didn't reselect the selected flame in the Library tab.
--Code changes
-Make all types concerning palettes be floats, including PaletteTableWidgetItem.
-PaletteTableWidgetItem is no longer templated because all palettes are float.
-Include the source colors for user created gradients.
-Change parallel_for() calls to work with very old versions of TBB which are lingering on some systems.
-Split conditional out of accumulation loop on the CPU for better performance.
-Vectorize summing when doing density filter for better performance.
-Make all usage of palettes be of type float, double is pointless.
-Allow palettes to reside in multiple folders, while ensuring only one of each name is added.
-Refactor some palette path searching code.
-Make ReadFile() throw and catch an exception if the file operation fails.
-A little extra safety in foci and foci3D with a call to Zeps().
-Cast to (real_t) in the OpenCL string for the w variation, which was having trouble compiling on Mac.
-Fixing missing comma between paths in InitPaletteList().
-Move Xml and PaletteList classes into cpp to shorten build times when working on them.
-Remove default param values for IterOpenCLKernelCreator<T>::SharedDataIndexDefines in cpp file.
-Change more NULL to nullptr.
2017-02-26 03:02:21 -05:00
m_HoverXform = m_SelectedXform ;
2017-07-27 00:25:44 -04:00
bestIndex = int ( ember - > GetTotalXformIndex ( m_SelectedXform , forceFinal ) ) ;
2014-07-08 03:11:14 -04:00
}
}
--User changes
-Add a palette editor.
-Add support for reading .ugr/.gradient/.gradients palette files.
-Allow toggling on spinners whose minimum value is not zero.
-Allow toggling display of image, affines and grid.
-Add new variations: cylinder2, circlesplit, tile_log, truchet_fill, waves2_radial.
--Bug fixes
-cpow2 was wrong.
-Palettes with rapid changes in color would produce slightly different outputs from Apo/Chaotica. This was due to a long standing bug from flam3.
-Use exec() on Apple and show() on all other OSes for dialog boxes.
-Trying to render a sequence with no frames would crash.
-Selecting multiple xforms and rotating them would produce the wrong rotation.
-Better handling when parsing flames using different encoding, such as unicode and UTF-8.
-Switching between SP/DP didn't reselect the selected flame in the Library tab.
--Code changes
-Make all types concerning palettes be floats, including PaletteTableWidgetItem.
-PaletteTableWidgetItem is no longer templated because all palettes are float.
-Include the source colors for user created gradients.
-Change parallel_for() calls to work with very old versions of TBB which are lingering on some systems.
-Split conditional out of accumulation loop on the CPU for better performance.
-Vectorize summing when doing density filter for better performance.
-Make all usage of palettes be of type float, double is pointless.
-Allow palettes to reside in multiple folders, while ensuring only one of each name is added.
-Refactor some palette path searching code.
-Make ReadFile() throw and catch an exception if the file operation fails.
-A little extra safety in foci and foci3D with a call to Zeps().
-Cast to (real_t) in the OpenCL string for the w variation, which was having trouble compiling on Mac.
-Fixing missing comma between paths in InitPaletteList().
-Move Xml and PaletteList classes into cpp to shorten build times when working on them.
-Remove default param values for IterOpenCLKernelCreator<T>::SharedDataIndexDefines in cpp file.
-Change more NULL to nullptr.
2017-02-26 03:02:21 -05:00
//Check all xforms.
2017-07-27 00:25:44 -04:00
while ( auto xform = ember - > GetTotalXform ( i , forceFinal ) )
2014-07-08 03:11:14 -04:00
{
2018-09-15 06:11:12 -04:00
bool isSel = m_Fractorium - > IsXformSelected ( i ) ;
if ( pre )
2014-07-08 03:11:14 -04:00
{
2018-09-15 06:11:12 -04:00
bool checkPre = m_Fractorium - > DrawAllPre ( ) | | ( m_Fractorium - > DrawSelectedPre ( ) & & isSel ) | | ( m_SelectedXform = = xform ) ;
if ( checkPre ) //Only check pre affine if they are shown.
--User changes
-Add a palette editor.
-Add support for reading .ugr/.gradient/.gradients palette files.
-Allow toggling on spinners whose minimum value is not zero.
-Allow toggling display of image, affines and grid.
-Add new variations: cylinder2, circlesplit, tile_log, truchet_fill, waves2_radial.
--Bug fixes
-cpow2 was wrong.
-Palettes with rapid changes in color would produce slightly different outputs from Apo/Chaotica. This was due to a long standing bug from flam3.
-Use exec() on Apple and show() on all other OSes for dialog boxes.
-Trying to render a sequence with no frames would crash.
-Selecting multiple xforms and rotating them would produce the wrong rotation.
-Better handling when parsing flames using different encoding, such as unicode and UTF-8.
-Switching between SP/DP didn't reselect the selected flame in the Library tab.
--Code changes
-Make all types concerning palettes be floats, including PaletteTableWidgetItem.
-PaletteTableWidgetItem is no longer templated because all palettes are float.
-Include the source colors for user created gradients.
-Change parallel_for() calls to work with very old versions of TBB which are lingering on some systems.
-Split conditional out of accumulation loop on the CPU for better performance.
-Vectorize summing when doing density filter for better performance.
-Make all usage of palettes be of type float, double is pointless.
-Allow palettes to reside in multiple folders, while ensuring only one of each name is added.
-Refactor some palette path searching code.
-Make ReadFile() throw and catch an exception if the file operation fails.
-A little extra safety in foci and foci3D with a call to Zeps().
-Cast to (real_t) in the OpenCL string for the w variation, which was having trouble compiling on Mac.
-Fixing missing comma between paths in InitPaletteList().
-Move Xml and PaletteList classes into cpp to shorten build times when working on them.
-Remove default param values for IterOpenCLKernelCreator<T>::SharedDataIndexDefines in cpp file.
-Change more NULL to nullptr.
2017-02-26 03:02:21 -05:00
{
2018-09-15 06:11:12 -04:00
if ( CheckXformHover ( xform , glCoords , bestDist , true , false ) )
{
m_HoverXform = xform ;
bestIndex = i ;
}
--User changes
-Add a palette editor.
-Add support for reading .ugr/.gradient/.gradients palette files.
-Allow toggling on spinners whose minimum value is not zero.
-Allow toggling display of image, affines and grid.
-Add new variations: cylinder2, circlesplit, tile_log, truchet_fill, waves2_radial.
--Bug fixes
-cpow2 was wrong.
-Palettes with rapid changes in color would produce slightly different outputs from Apo/Chaotica. This was due to a long standing bug from flam3.
-Use exec() on Apple and show() on all other OSes for dialog boxes.
-Trying to render a sequence with no frames would crash.
-Selecting multiple xforms and rotating them would produce the wrong rotation.
-Better handling when parsing flames using different encoding, such as unicode and UTF-8.
-Switching between SP/DP didn't reselect the selected flame in the Library tab.
--Code changes
-Make all types concerning palettes be floats, including PaletteTableWidgetItem.
-PaletteTableWidgetItem is no longer templated because all palettes are float.
-Include the source colors for user created gradients.
-Change parallel_for() calls to work with very old versions of TBB which are lingering on some systems.
-Split conditional out of accumulation loop on the CPU for better performance.
-Vectorize summing when doing density filter for better performance.
-Make all usage of palettes be of type float, double is pointless.
-Allow palettes to reside in multiple folders, while ensuring only one of each name is added.
-Refactor some palette path searching code.
-Make ReadFile() throw and catch an exception if the file operation fails.
-A little extra safety in foci and foci3D with a call to Zeps().
-Cast to (real_t) in the OpenCL string for the w variation, which was having trouble compiling on Mac.
-Fixing missing comma between paths in InitPaletteList().
-Move Xml and PaletteList classes into cpp to shorten build times when working on them.
-Remove default param values for IterOpenCLKernelCreator<T>::SharedDataIndexDefines in cpp file.
-Change more NULL to nullptr.
2017-02-26 03:02:21 -05:00
}
}
2018-09-15 06:11:12 -04:00
if ( post )
--User changes
-Add a palette editor.
-Add support for reading .ugr/.gradient/.gradients palette files.
-Allow toggling on spinners whose minimum value is not zero.
-Allow toggling display of image, affines and grid.
-Add new variations: cylinder2, circlesplit, tile_log, truchet_fill, waves2_radial.
--Bug fixes
-cpow2 was wrong.
-Palettes with rapid changes in color would produce slightly different outputs from Apo/Chaotica. This was due to a long standing bug from flam3.
-Use exec() on Apple and show() on all other OSes for dialog boxes.
-Trying to render a sequence with no frames would crash.
-Selecting multiple xforms and rotating them would produce the wrong rotation.
-Better handling when parsing flames using different encoding, such as unicode and UTF-8.
-Switching between SP/DP didn't reselect the selected flame in the Library tab.
--Code changes
-Make all types concerning palettes be floats, including PaletteTableWidgetItem.
-PaletteTableWidgetItem is no longer templated because all palettes are float.
-Include the source colors for user created gradients.
-Change parallel_for() calls to work with very old versions of TBB which are lingering on some systems.
-Split conditional out of accumulation loop on the CPU for better performance.
-Vectorize summing when doing density filter for better performance.
-Make all usage of palettes be of type float, double is pointless.
-Allow palettes to reside in multiple folders, while ensuring only one of each name is added.
-Refactor some palette path searching code.
-Make ReadFile() throw and catch an exception if the file operation fails.
-A little extra safety in foci and foci3D with a call to Zeps().
-Cast to (real_t) in the OpenCL string for the w variation, which was having trouble compiling on Mac.
-Fixing missing comma between paths in InitPaletteList().
-Move Xml and PaletteList classes into cpp to shorten build times when working on them.
-Remove default param values for IterOpenCLKernelCreator<T>::SharedDataIndexDefines in cpp file.
-Change more NULL to nullptr.
2017-02-26 03:02:21 -05:00
{
2018-09-15 06:11:12 -04:00
bool checkPost = m_Fractorium - > DrawAllPost ( ) | | ( m_Fractorium - > DrawSelectedPost ( ) & & isSel ) | | ( m_SelectedXform = = xform ) ;
if ( checkPost )
--User changes
-Add a palette editor.
-Add support for reading .ugr/.gradient/.gradients palette files.
-Allow toggling on spinners whose minimum value is not zero.
-Allow toggling display of image, affines and grid.
-Add new variations: cylinder2, circlesplit, tile_log, truchet_fill, waves2_radial.
--Bug fixes
-cpow2 was wrong.
-Palettes with rapid changes in color would produce slightly different outputs from Apo/Chaotica. This was due to a long standing bug from flam3.
-Use exec() on Apple and show() on all other OSes for dialog boxes.
-Trying to render a sequence with no frames would crash.
-Selecting multiple xforms and rotating them would produce the wrong rotation.
-Better handling when parsing flames using different encoding, such as unicode and UTF-8.
-Switching between SP/DP didn't reselect the selected flame in the Library tab.
--Code changes
-Make all types concerning palettes be floats, including PaletteTableWidgetItem.
-PaletteTableWidgetItem is no longer templated because all palettes are float.
-Include the source colors for user created gradients.
-Change parallel_for() calls to work with very old versions of TBB which are lingering on some systems.
-Split conditional out of accumulation loop on the CPU for better performance.
-Vectorize summing when doing density filter for better performance.
-Make all usage of palettes be of type float, double is pointless.
-Allow palettes to reside in multiple folders, while ensuring only one of each name is added.
-Refactor some palette path searching code.
-Make ReadFile() throw and catch an exception if the file operation fails.
-A little extra safety in foci and foci3D with a call to Zeps().
-Cast to (real_t) in the OpenCL string for the w variation, which was having trouble compiling on Mac.
-Fixing missing comma between paths in InitPaletteList().
-Move Xml and PaletteList classes into cpp to shorten build times when working on them.
-Remove default param values for IterOpenCLKernelCreator<T>::SharedDataIndexDefines in cpp file.
-Change more NULL to nullptr.
2017-02-26 03:02:21 -05:00
{
2018-09-15 06:11:12 -04:00
if ( CheckXformHover ( xform , glCoords , bestDist , false , true ) )
{
m_HoverXform = xform ;
bestIndex = i ;
}
--User changes
-Add a palette editor.
-Add support for reading .ugr/.gradient/.gradients palette files.
-Allow toggling on spinners whose minimum value is not zero.
-Allow toggling display of image, affines and grid.
-Add new variations: cylinder2, circlesplit, tile_log, truchet_fill, waves2_radial.
--Bug fixes
-cpow2 was wrong.
-Palettes with rapid changes in color would produce slightly different outputs from Apo/Chaotica. This was due to a long standing bug from flam3.
-Use exec() on Apple and show() on all other OSes for dialog boxes.
-Trying to render a sequence with no frames would crash.
-Selecting multiple xforms and rotating them would produce the wrong rotation.
-Better handling when parsing flames using different encoding, such as unicode and UTF-8.
-Switching between SP/DP didn't reselect the selected flame in the Library tab.
--Code changes
-Make all types concerning palettes be floats, including PaletteTableWidgetItem.
-PaletteTableWidgetItem is no longer templated because all palettes are float.
-Include the source colors for user created gradients.
-Change parallel_for() calls to work with very old versions of TBB which are lingering on some systems.
-Split conditional out of accumulation loop on the CPU for better performance.
-Vectorize summing when doing density filter for better performance.
-Make all usage of palettes be of type float, double is pointless.
-Allow palettes to reside in multiple folders, while ensuring only one of each name is added.
-Refactor some palette path searching code.
-Make ReadFile() throw and catch an exception if the file operation fails.
-A little extra safety in foci and foci3D with a call to Zeps().
-Cast to (real_t) in the OpenCL string for the w variation, which was having trouble compiling on Mac.
-Fixing missing comma between paths in InitPaletteList().
-Move Xml and PaletteList classes into cpp to shorten build times when working on them.
-Remove default param values for IterOpenCLKernelCreator<T>::SharedDataIndexDefines in cpp file.
-Change more NULL to nullptr.
2017-02-26 03:02:21 -05:00
}
2014-07-08 03:11:14 -04:00
}
2017-05-31 22:50:05 -04:00
i + + ;
2014-07-08 03:11:14 -04:00
}
}
return bestIndex ;
}
/// <summary>
/// Determine the passed in xform's pre/post affine transforms are being hovered over.
/// Meant to be called in succession when checking all xforms for hover, and the best
/// hover distance is recorded in the bestDist reference parameter.
/// Mouse coordinates will be converted internally to world cartesian coordinates for checking.
/// </summary>
/// <param name="xform">A pointer to the xform to check for hover</param>
/// <param name="glCoords">The mouse raster coordinates to check</param>
/// <param name="bestDist">Reference to hold the best distance found so far</param>
/// <param name="pre">True to check pre affine, else don't.</param>
/// <param name="post">True to check post affine, else don't.</param>
/// <returns>True if hovering and the distance is smaller than the bestDist parameter</returns>
template < typename T >
2020-01-25 14:12:49 -05:00
bool GLEmberController < T > : : CheckXformHover ( const Xform < T > * xform , const v3T & glCoords , T & bestDist , bool pre , bool post )
2014-07-08 03:11:14 -04:00
{
bool preFound = false , postFound = false ;
2016-02-02 20:51:58 -05:00
T dist = 0 , scale = m_FractoriumEmberController - > AffineScaleCurrentToLocked ( ) ;
2014-07-08 03:11:14 -04:00
v3T pos ;
if ( pre )
{
2016-02-02 20:51:58 -05:00
auto affineScaled = xform - > m_Affine * scale ;
v3T translation ( affineScaled . C ( ) , affineScaled . F ( ) , 0 ) ;
2014-07-08 03:11:14 -04:00
v3T transScreen = glm : : project ( translation , m_Modelview , m_Projection , m_Viewport ) ;
2016-02-02 20:51:58 -05:00
v3T xAxis ( affineScaled . A ( ) , affineScaled . D ( ) , 0 ) ;
2014-07-08 03:11:14 -04:00
v3T xAxisScreen = glm : : project ( translation + xAxis , m_Modelview , m_Projection , m_Viewport ) ;
2016-02-02 20:51:58 -05:00
v3T yAxis ( affineScaled . B ( ) , affineScaled . E ( ) , 0 ) ;
2014-07-08 03:11:14 -04:00
v3T yAxisScreen = glm : : project ( translation + yAxis , m_Modelview , m_Projection , m_Viewport ) ;
pos = translation ;
dist = glm : : distance ( glCoords , transScreen ) ;
if ( dist < bestDist )
{
bestDist = dist ;
2016-01-04 19:50:15 -05:00
m_HoverType = eHoverType : : HoverTranslation ;
2014-07-08 03:11:14 -04:00
m_HoverHandlePos = pos ;
preFound = true ;
}
pos = translation + xAxis ;
dist = glm : : distance ( glCoords , xAxisScreen ) ;
2016-01-04 19:50:15 -05:00
2014-07-08 03:11:14 -04:00
if ( dist < bestDist )
{
bestDist = dist ;
2016-01-04 19:50:15 -05:00
m_HoverType = eHoverType : : HoverXAxis ;
2014-07-08 03:11:14 -04:00
m_HoverHandlePos = pos ;
preFound = true ;
}
pos = translation + yAxis ;
dist = glm : : distance ( glCoords , yAxisScreen ) ;
2016-01-04 19:50:15 -05:00
2014-07-08 03:11:14 -04:00
if ( dist < bestDist )
{
bestDist = dist ;
2016-01-04 19:50:15 -05:00
m_HoverType = eHoverType : : HoverYAxis ;
2014-07-08 03:11:14 -04:00
m_HoverHandlePos = pos ;
preFound = true ;
}
if ( preFound )
2016-01-04 19:50:15 -05:00
m_AffineType = eAffineType : : AffinePre ;
2014-07-08 03:11:14 -04:00
}
if ( post )
{
2016-02-02 20:51:58 -05:00
auto affineScaled = xform - > m_Post * scale ;
v3T translation ( affineScaled . C ( ) , affineScaled . F ( ) , 0 ) ;
2014-07-08 03:11:14 -04:00
v3T transScreen = glm : : project ( translation , m_Modelview , m_Projection , m_Viewport ) ;
2016-02-02 20:51:58 -05:00
v3T xAxis ( affineScaled . A ( ) , affineScaled . D ( ) , 0 ) ;
2014-07-08 03:11:14 -04:00
v3T xAxisScreen = glm : : project ( translation + xAxis , m_Modelview , m_Projection , m_Viewport ) ;
2016-02-02 20:51:58 -05:00
v3T yAxis ( affineScaled . B ( ) , affineScaled . E ( ) , 0 ) ;
2014-07-08 03:11:14 -04:00
v3T yAxisScreen = glm : : project ( translation + yAxis , m_Modelview , m_Projection , m_Viewport ) ;
pos = translation ;
dist = glm : : distance ( glCoords , transScreen ) ;
if ( dist < bestDist )
{
bestDist = dist ;
2016-01-04 19:50:15 -05:00
m_HoverType = eHoverType : : HoverTranslation ;
2014-07-08 03:11:14 -04:00
m_HoverHandlePos = pos ;
postFound = true ;
}
pos = translation + xAxis ;
dist = glm : : distance ( glCoords , xAxisScreen ) ;
2016-01-04 19:50:15 -05:00
2014-07-08 03:11:14 -04:00
if ( dist < bestDist )
{
bestDist = dist ;
2016-01-04 19:50:15 -05:00
m_HoverType = eHoverType : : HoverXAxis ;
2014-07-08 03:11:14 -04:00
m_HoverHandlePos = pos ;
postFound = true ;
}
pos = translation + yAxis ;
dist = glm : : distance ( glCoords , yAxisScreen ) ;
2016-01-04 19:50:15 -05:00
2014-07-08 03:11:14 -04:00
if ( dist < bestDist )
{
bestDist = dist ;
2016-01-04 19:50:15 -05:00
m_HoverType = eHoverType : : HoverYAxis ;
2014-07-08 03:11:14 -04:00
m_HoverHandlePos = pos ;
postFound = true ;
}
if ( postFound )
2016-01-04 19:50:15 -05:00
m_AffineType = eAffineType : : AffinePost ;
2014-07-08 03:11:14 -04:00
}
return preFound | | postFound ;
}
/// <summary>
/// Calculate the new affine transform when dragging with the x axis with the left mouse button.
/// The value returned will depend on whether any modifier keys were held down.
2018-09-15 06:11:12 -04:00
/// None: Rotate only.
2014-07-08 03:11:14 -04:00
/// Local Pivot:
2018-09-15 06:11:12 -04:00
/// Shift: Scale and optionally Rotate about affine center.
/// Alt: Rotate single axis about affine center.
/// Shift + Alt: Free transform.
/// Control: Rotate, snapping to grid.
/// Control + Shift: Scale and optionally Rotate, snapping to grid.
/// Control + Alt: Rotate single axis about affine center, snapping to grid.
/// Control + Shift + Alt: Free transform, snapping to grid.
2014-07-08 03:11:14 -04:00
/// World Pivot:
/// Shift + Alt: Rotate single axis about world center.
/// Control + Shift + Alt: Rotate single axis about world center, snapping to grid.
/// All others are the same as local pivot.
/// </summary>
/// <returns>The new affine transform to be assigned to the selected xform</returns>
template < typename T >
2016-02-12 00:38:21 -05:00
void GLEmberController < T > : : CalcDragXAxis ( )
2014-07-08 03:11:14 -04:00
{
2020-01-14 23:08:27 -05:00
T affineToWorldScale = T ( m_FractoriumEmberController - > AffineScaleLockedToCurrent ( ) ) ;
T worldToAffineScale = T ( m_FractoriumEmberController - > AffineScaleCurrentToLocked ( ) ) ;
2016-02-12 00:38:21 -05:00
bool pre = m_AffineType = = eAffineType : : AffinePre ;
2016-01-04 19:50:15 -05:00
bool worldPivotShiftAlt = ! m_Fractorium - > LocalPivot ( ) & & GetShift ( ) & & GetAlt ( ) ;
2018-09-15 06:11:12 -04:00
auto worldRelAxisStartScaled = ( v2T ( m_HoverHandlePos ) * affineToWorldScale ) - m_DragSrcTransform . O ( ) ; //World axis start position, relative, scaled by the zoom.
T startAngle = std : : atan2 ( worldRelAxisStartScaled . y , worldRelAxisStartScaled . x ) ;
v3T relScaled = ( m_MouseWorldPos * affineToWorldScale ) - v3T ( m_DragSrcTransform . O ( ) , 0 ) ;
2014-07-08 03:11:14 -04:00
2018-09-15 06:11:12 -04:00
if ( ! GetShift ( ) )
2014-07-08 03:11:14 -04:00
{
2018-09-15 06:11:12 -04:00
if ( GetControl ( ) )
{
relScaled = SnapToNormalizedAngle ( relScaled , 24u ) ; //relScaled is using the relative scaled position of the axis.
}
T endAngle = std : : atan2 ( relScaled . y , relScaled . x ) ;
2016-02-12 00:38:21 -05:00
T angle = startAngle - endAngle ;
--User changes
-No longer constrain pitch, yaw or depth spinners to -180 - 180.
--Bug fixes
-Properly set color index on padded xforms.
-Adding a padding final xform included a linear variation with a weight of zero to not appear empty. Made it have a weight of 1.
-Always write animate tag on final xform when saving to Xml.
-Motion was being applied to the wrong flame in SheepTools::Edge(), so apply it to the correct one.
-Prevent divide by zero when normalizing variation weights.
-Was accidentally adding the placeholder value of -9999 for motion_offset to varation weights and parameters when applying motion. Set to zero if no value present.
-Clamp flame rotation values to -180 - 180 when reading a flame from Xml.
-Events were not properly wired for user changes in the random rotations per blend controls in the sequencer.
-Fix major UI bugs with sequencer min/max random controls which made it nearly impossible to hand type values.
-Values from rotations per blend and rotations per blend max were not being saved to file between program runs.
-Checking animate for an xform was not applied to all flames even if Apply All was checked.
-Changing interpolation type, temporal filter width, temporal type, and affine interpolation type were not actually saving to the flame when changed.
-Grid on the main window was not being drawn at the right scale initially due to some OpenGL initialization occurring in the wrong order.
-Severe bugs in sequence generation code:
--Improperly detected padding xforms.
--When looking for specific variations during xform aligning, only presence was detected, when it should have been presence plus a weight greater than zero.
--When adding specific variations during xform aligning, must first remove any variations of that type.
--Two variables were unsigned when they should have been signed. This prevented large blocks of code from ever executing.
--When interpolating affines, an EPS that was too small was used, causing affine values to interpolate incorrectly. Instead use 1e-10 to ensure results equal to flam3.
--Code changes
-Modify FractoriumEmberController::UpdateXform() to pass the selected xform index as well as the absolute index to func().
2018-06-13 00:20:15 -04:00
m_FractoriumEmberController - > UpdateXform ( [ & ] ( Xform < T > * xform , size_t xfindex , size_t selIndex )
2016-02-12 00:38:21 -05:00
{
2019-06-19 00:29:58 -04:00
auto it = m_DragSrcPreTransforms . find ( xfindex ) ;
2014-07-08 03:11:14 -04:00
2019-06-21 20:51:20 -04:00
if ( it ! = m_DragSrcPreTransforms . end ( ) )
2016-02-12 00:38:21 -05:00
{
2019-06-19 00:29:58 -04:00
auto src = it - > second ;
auto & affine = xform - > m_Affine ;
if ( GetAlt ( ) )
{
src . Rotate ( angle ) ;
affine . X ( src . X ( ) ) ;
}
else
{
src . Rotate ( angle ) ;
affine = src ;
}
2016-02-12 00:38:21 -05:00
}
2019-06-19 00:29:58 -04:00
it = m_DragSrcPostTransforms . find ( xfindex ) ;
2019-06-21 20:51:20 -04:00
if ( it ! = m_DragSrcPostTransforms . end ( ) )
2016-02-12 00:38:21 -05:00
{
2019-06-19 00:29:58 -04:00
auto src = it - > second ;
auto & affine = xform - > m_Post ;
if ( GetAlt ( ) )
{
src . Rotate ( angle ) ;
affine . X ( src . X ( ) ) ;
}
else
{
src . Rotate ( angle ) ;
affine = src ;
}
2016-02-12 00:38:21 -05:00
}
2016-01-04 19:50:15 -05:00
2019-06-19 00:29:58 -04:00
auto & affine = pre ? xform - > m_Affine : xform - > m_Post ;
2016-02-12 00:38:21 -05:00
if ( xform = = m_FractoriumEmberController - > CurrentXform ( ) )
--User changes
-Add a palette editor.
-Add support for reading .ugr/.gradient/.gradients palette files.
-Allow toggling on spinners whose minimum value is not zero.
-Allow toggling display of image, affines and grid.
-Add new variations: cylinder2, circlesplit, tile_log, truchet_fill, waves2_radial.
--Bug fixes
-cpow2 was wrong.
-Palettes with rapid changes in color would produce slightly different outputs from Apo/Chaotica. This was due to a long standing bug from flam3.
-Use exec() on Apple and show() on all other OSes for dialog boxes.
-Trying to render a sequence with no frames would crash.
-Selecting multiple xforms and rotating them would produce the wrong rotation.
-Better handling when parsing flames using different encoding, such as unicode and UTF-8.
-Switching between SP/DP didn't reselect the selected flame in the Library tab.
--Code changes
-Make all types concerning palettes be floats, including PaletteTableWidgetItem.
-PaletteTableWidgetItem is no longer templated because all palettes are float.
-Include the source colors for user created gradients.
-Change parallel_for() calls to work with very old versions of TBB which are lingering on some systems.
-Split conditional out of accumulation loop on the CPU for better performance.
-Vectorize summing when doing density filter for better performance.
-Make all usage of palettes be of type float, double is pointless.
-Allow palettes to reside in multiple folders, while ensuring only one of each name is added.
-Refactor some palette path searching code.
-Make ReadFile() throw and catch an exception if the file operation fails.
-A little extra safety in foci and foci3D with a call to Zeps().
-Cast to (real_t) in the OpenCL string for the w variation, which was having trouble compiling on Mac.
-Fixing missing comma between paths in InitPaletteList().
-Move Xml and PaletteList classes into cpp to shorten build times when working on them.
-Remove default param values for IterOpenCLKernelCreator<T>::SharedDataIndexDefines in cpp file.
-Change more NULL to nullptr.
2017-02-26 03:02:21 -05:00
m_DragHandlePos = v3T ( ( affine . O ( ) + affine . X ( ) ) * worldToAffineScale , 0 ) ;
2019-06-21 20:51:20 -04:00
} , eXformUpdate : : UPDATE_SELECTED , false ) ; //Calling code will update renderer.
2014-07-08 03:11:14 -04:00
}
else
{
2018-09-15 06:11:12 -04:00
auto origmag = Zeps ( glm : : length ( m_DragSrcTransform . X ( ) ) ) ; //Magnitude of original dragged axis before it was dragged.
2016-02-12 00:38:21 -05:00
2016-01-04 19:50:15 -05:00
if ( GetControl ( ) )
--User changes
-Add a palette editor.
-Add support for reading .ugr/.gradient/.gradients palette files.
-Allow toggling on spinners whose minimum value is not zero.
-Allow toggling display of image, affines and grid.
-Add new variations: cylinder2, circlesplit, tile_log, truchet_fill, waves2_radial.
--Bug fixes
-cpow2 was wrong.
-Palettes with rapid changes in color would produce slightly different outputs from Apo/Chaotica. This was due to a long standing bug from flam3.
-Use exec() on Apple and show() on all other OSes for dialog boxes.
-Trying to render a sequence with no frames would crash.
-Selecting multiple xforms and rotating them would produce the wrong rotation.
-Better handling when parsing flames using different encoding, such as unicode and UTF-8.
-Switching between SP/DP didn't reselect the selected flame in the Library tab.
--Code changes
-Make all types concerning palettes be floats, including PaletteTableWidgetItem.
-PaletteTableWidgetItem is no longer templated because all palettes are float.
-Include the source colors for user created gradients.
-Change parallel_for() calls to work with very old versions of TBB which are lingering on some systems.
-Split conditional out of accumulation loop on the CPU for better performance.
-Vectorize summing when doing density filter for better performance.
-Make all usage of palettes be of type float, double is pointless.
-Allow palettes to reside in multiple folders, while ensuring only one of each name is added.
-Refactor some palette path searching code.
-Make ReadFile() throw and catch an exception if the file operation fails.
-A little extra safety in foci and foci3D with a call to Zeps().
-Cast to (real_t) in the OpenCL string for the w variation, which was having trouble compiling on Mac.
-Fixing missing comma between paths in InitPaletteList().
-Move Xml and PaletteList classes into cpp to shorten build times when working on them.
-Remove default param values for IterOpenCLKernelCreator<T>::SharedDataIndexDefines in cpp file.
-Change more NULL to nullptr.
2017-02-26 03:02:21 -05:00
{
2018-09-15 06:11:12 -04:00
relScaled = SnapToGrid ( relScaled ) ;
--User changes
-Add a palette editor.
-Add support for reading .ugr/.gradient/.gradients palette files.
-Allow toggling on spinners whose minimum value is not zero.
-Allow toggling display of image, affines and grid.
-Add new variations: cylinder2, circlesplit, tile_log, truchet_fill, waves2_radial.
--Bug fixes
-cpow2 was wrong.
-Palettes with rapid changes in color would produce slightly different outputs from Apo/Chaotica. This was due to a long standing bug from flam3.
-Use exec() on Apple and show() on all other OSes for dialog boxes.
-Trying to render a sequence with no frames would crash.
-Selecting multiple xforms and rotating them would produce the wrong rotation.
-Better handling when parsing flames using different encoding, such as unicode and UTF-8.
-Switching between SP/DP didn't reselect the selected flame in the Library tab.
--Code changes
-Make all types concerning palettes be floats, including PaletteTableWidgetItem.
-PaletteTableWidgetItem is no longer templated because all palettes are float.
-Include the source colors for user created gradients.
-Change parallel_for() calls to work with very old versions of TBB which are lingering on some systems.
-Split conditional out of accumulation loop on the CPU for better performance.
-Vectorize summing when doing density filter for better performance.
-Make all usage of palettes be of type float, double is pointless.
-Allow palettes to reside in multiple folders, while ensuring only one of each name is added.
-Refactor some palette path searching code.
-Make ReadFile() throw and catch an exception if the file operation fails.
-A little extra safety in foci and foci3D with a call to Zeps().
-Cast to (real_t) in the OpenCL string for the w variation, which was having trouble compiling on Mac.
-Fixing missing comma between paths in InitPaletteList().
-Move Xml and PaletteList classes into cpp to shorten build times when working on them.
-Remove default param values for IterOpenCLKernelCreator<T>::SharedDataIndexDefines in cpp file.
-Change more NULL to nullptr.
2017-02-26 03:02:21 -05:00
}
2014-07-08 03:11:14 -04:00
2018-09-15 06:11:12 -04:00
auto newmag = glm : : length ( relScaled ) ;
--User changes
-Add a palette editor.
-Add support for reading .ugr/.gradient/.gradients palette files.
-Allow toggling on spinners whose minimum value is not zero.
-Allow toggling display of image, affines and grid.
-Add new variations: cylinder2, circlesplit, tile_log, truchet_fill, waves2_radial.
--Bug fixes
-cpow2 was wrong.
-Palettes with rapid changes in color would produce slightly different outputs from Apo/Chaotica. This was due to a long standing bug from flam3.
-Use exec() on Apple and show() on all other OSes for dialog boxes.
-Trying to render a sequence with no frames would crash.
-Selecting multiple xforms and rotating them would produce the wrong rotation.
-Better handling when parsing flames using different encoding, such as unicode and UTF-8.
-Switching between SP/DP didn't reselect the selected flame in the Library tab.
--Code changes
-Make all types concerning palettes be floats, including PaletteTableWidgetItem.
-PaletteTableWidgetItem is no longer templated because all palettes are float.
-Include the source colors for user created gradients.
-Change parallel_for() calls to work with very old versions of TBB which are lingering on some systems.
-Split conditional out of accumulation loop on the CPU for better performance.
-Vectorize summing when doing density filter for better performance.
-Make all usage of palettes be of type float, double is pointless.
-Allow palettes to reside in multiple folders, while ensuring only one of each name is added.
-Refactor some palette path searching code.
-Make ReadFile() throw and catch an exception if the file operation fails.
-A little extra safety in foci and foci3D with a call to Zeps().
-Cast to (real_t) in the OpenCL string for the w variation, which was having trouble compiling on Mac.
-Fixing missing comma between paths in InitPaletteList().
-Move Xml and PaletteList classes into cpp to shorten build times when working on them.
-Remove default param values for IterOpenCLKernelCreator<T>::SharedDataIndexDefines in cpp file.
-Change more NULL to nullptr.
2017-02-26 03:02:21 -05:00
auto newprc = newmag / origmag ;
2018-09-15 06:11:12 -04:00
T endAngle = std : : atan2 ( relScaled . y , relScaled . x ) ;
--User changes
-Add a palette editor.
-Add support for reading .ugr/.gradient/.gradients palette files.
-Allow toggling on spinners whose minimum value is not zero.
-Allow toggling display of image, affines and grid.
-Add new variations: cylinder2, circlesplit, tile_log, truchet_fill, waves2_radial.
--Bug fixes
-cpow2 was wrong.
-Palettes with rapid changes in color would produce slightly different outputs from Apo/Chaotica. This was due to a long standing bug from flam3.
-Use exec() on Apple and show() on all other OSes for dialog boxes.
-Trying to render a sequence with no frames would crash.
-Selecting multiple xforms and rotating them would produce the wrong rotation.
-Better handling when parsing flames using different encoding, such as unicode and UTF-8.
-Switching between SP/DP didn't reselect the selected flame in the Library tab.
--Code changes
-Make all types concerning palettes be floats, including PaletteTableWidgetItem.
-PaletteTableWidgetItem is no longer templated because all palettes are float.
-Include the source colors for user created gradients.
-Change parallel_for() calls to work with very old versions of TBB which are lingering on some systems.
-Split conditional out of accumulation loop on the CPU for better performance.
-Vectorize summing when doing density filter for better performance.
-Make all usage of palettes be of type float, double is pointless.
-Allow palettes to reside in multiple folders, while ensuring only one of each name is added.
-Refactor some palette path searching code.
-Make ReadFile() throw and catch an exception if the file operation fails.
-A little extra safety in foci and foci3D with a call to Zeps().
-Cast to (real_t) in the OpenCL string for the w variation, which was having trouble compiling on Mac.
-Fixing missing comma between paths in InitPaletteList().
-Move Xml and PaletteList classes into cpp to shorten build times when working on them.
-Remove default param values for IterOpenCLKernelCreator<T>::SharedDataIndexDefines in cpp file.
-Change more NULL to nullptr.
2017-02-26 03:02:21 -05:00
T angle = startAngle - endAngle ;
--User changes
-No longer constrain pitch, yaw or depth spinners to -180 - 180.
--Bug fixes
-Properly set color index on padded xforms.
-Adding a padding final xform included a linear variation with a weight of zero to not appear empty. Made it have a weight of 1.
-Always write animate tag on final xform when saving to Xml.
-Motion was being applied to the wrong flame in SheepTools::Edge(), so apply it to the correct one.
-Prevent divide by zero when normalizing variation weights.
-Was accidentally adding the placeholder value of -9999 for motion_offset to varation weights and parameters when applying motion. Set to zero if no value present.
-Clamp flame rotation values to -180 - 180 when reading a flame from Xml.
-Events were not properly wired for user changes in the random rotations per blend controls in the sequencer.
-Fix major UI bugs with sequencer min/max random controls which made it nearly impossible to hand type values.
-Values from rotations per blend and rotations per blend max were not being saved to file between program runs.
-Checking animate for an xform was not applied to all flames even if Apply All was checked.
-Changing interpolation type, temporal filter width, temporal type, and affine interpolation type were not actually saving to the flame when changed.
-Grid on the main window was not being drawn at the right scale initially due to some OpenGL initialization occurring in the wrong order.
-Severe bugs in sequence generation code:
--Improperly detected padding xforms.
--When looking for specific variations during xform aligning, only presence was detected, when it should have been presence plus a weight greater than zero.
--When adding specific variations during xform aligning, must first remove any variations of that type.
--Two variables were unsigned when they should have been signed. This prevented large blocks of code from ever executing.
--When interpolating affines, an EPS that was too small was used, causing affine values to interpolate incorrectly. Instead use 1e-10 to ensure results equal to flam3.
--Code changes
-Modify FractoriumEmberController::UpdateXform() to pass the selected xform index as well as the absolute index to func().
2018-06-13 00:20:15 -04:00
m_FractoriumEmberController - > UpdateXform ( [ & ] ( Xform < T > * xform , size_t xfindex , size_t selIndex )
2016-02-12 00:38:21 -05:00
{
2019-06-19 00:29:58 -04:00
auto it = m_DragSrcPreTransforms . find ( xfindex ) ;
2014-07-08 03:11:14 -04:00
2019-06-21 20:51:20 -04:00
if ( it ! = m_DragSrcPreTransforms . end ( ) )
2018-09-15 06:11:12 -04:00
{
2019-06-19 00:29:58 -04:00
auto src = it - > second ;
auto & affine = xform - > m_Affine ;
if ( worldPivotShiftAlt )
{
src . X ( src . O ( ) + src . X ( ) ) ;
src . O ( v2T ( 0 ) ) ;
src . Rotate ( angle ) ;
affine . X ( src . X ( ) - affine . O ( ) ) ;
}
else if ( GetAlt ( ) )
{
affine . X ( v2T ( relScaled ) ) ; //Absolute, not ratio.
}
else
{
src . ScaleXY ( newprc ) ;
if ( m_Fractorium - > m_Settings - > RotateAndScale ( ) )
src . Rotate ( angle ) ;
affine = src ;
}
--User changes
-Add a palette editor.
-Add support for reading .ugr/.gradient/.gradients palette files.
-Allow toggling on spinners whose minimum value is not zero.
-Allow toggling display of image, affines and grid.
-Add new variations: cylinder2, circlesplit, tile_log, truchet_fill, waves2_radial.
--Bug fixes
-cpow2 was wrong.
-Palettes with rapid changes in color would produce slightly different outputs from Apo/Chaotica. This was due to a long standing bug from flam3.
-Use exec() on Apple and show() on all other OSes for dialog boxes.
-Trying to render a sequence with no frames would crash.
-Selecting multiple xforms and rotating them would produce the wrong rotation.
-Better handling when parsing flames using different encoding, such as unicode and UTF-8.
-Switching between SP/DP didn't reselect the selected flame in the Library tab.
--Code changes
-Make all types concerning palettes be floats, including PaletteTableWidgetItem.
-PaletteTableWidgetItem is no longer templated because all palettes are float.
-Include the source colors for user created gradients.
-Change parallel_for() calls to work with very old versions of TBB which are lingering on some systems.
-Split conditional out of accumulation loop on the CPU for better performance.
-Vectorize summing when doing density filter for better performance.
-Make all usage of palettes be of type float, double is pointless.
-Allow palettes to reside in multiple folders, while ensuring only one of each name is added.
-Refactor some palette path searching code.
-Make ReadFile() throw and catch an exception if the file operation fails.
-A little extra safety in foci and foci3D with a call to Zeps().
-Cast to (real_t) in the OpenCL string for the w variation, which was having trouble compiling on Mac.
-Fixing missing comma between paths in InitPaletteList().
-Move Xml and PaletteList classes into cpp to shorten build times when working on them.
-Remove default param values for IterOpenCLKernelCreator<T>::SharedDataIndexDefines in cpp file.
-Change more NULL to nullptr.
2017-02-26 03:02:21 -05:00
}
2019-06-19 00:29:58 -04:00
it = m_DragSrcPostTransforms . find ( xfindex ) ;
2019-06-21 20:51:20 -04:00
if ( it ! = m_DragSrcPostTransforms . end ( ) )
--User changes
-Add a palette editor.
-Add support for reading .ugr/.gradient/.gradients palette files.
-Allow toggling on spinners whose minimum value is not zero.
-Allow toggling display of image, affines and grid.
-Add new variations: cylinder2, circlesplit, tile_log, truchet_fill, waves2_radial.
--Bug fixes
-cpow2 was wrong.
-Palettes with rapid changes in color would produce slightly different outputs from Apo/Chaotica. This was due to a long standing bug from flam3.
-Use exec() on Apple and show() on all other OSes for dialog boxes.
-Trying to render a sequence with no frames would crash.
-Selecting multiple xforms and rotating them would produce the wrong rotation.
-Better handling when parsing flames using different encoding, such as unicode and UTF-8.
-Switching between SP/DP didn't reselect the selected flame in the Library tab.
--Code changes
-Make all types concerning palettes be floats, including PaletteTableWidgetItem.
-PaletteTableWidgetItem is no longer templated because all palettes are float.
-Include the source colors for user created gradients.
-Change parallel_for() calls to work with very old versions of TBB which are lingering on some systems.
-Split conditional out of accumulation loop on the CPU for better performance.
-Vectorize summing when doing density filter for better performance.
-Make all usage of palettes be of type float, double is pointless.
-Allow palettes to reside in multiple folders, while ensuring only one of each name is added.
-Refactor some palette path searching code.
-Make ReadFile() throw and catch an exception if the file operation fails.
-A little extra safety in foci and foci3D with a call to Zeps().
-Cast to (real_t) in the OpenCL string for the w variation, which was having trouble compiling on Mac.
-Fixing missing comma between paths in InitPaletteList().
-Move Xml and PaletteList classes into cpp to shorten build times when working on them.
-Remove default param values for IterOpenCLKernelCreator<T>::SharedDataIndexDefines in cpp file.
-Change more NULL to nullptr.
2017-02-26 03:02:21 -05:00
{
2019-06-19 00:29:58 -04:00
auto src = it - > second ;
auto & affine = xform - > m_Post ;
2018-09-15 06:11:12 -04:00
2019-06-19 00:29:58 -04:00
if ( worldPivotShiftAlt )
{
src . X ( src . O ( ) + src . X ( ) ) ;
src . O ( v2T ( 0 ) ) ;
2018-09-15 06:11:12 -04:00
src . Rotate ( angle ) ;
2019-06-19 00:29:58 -04:00
affine . X ( src . X ( ) - affine . O ( ) ) ;
}
else if ( GetAlt ( ) )
{
affine . X ( v2T ( relScaled ) ) ; //Absolute, not ratio.
}
else
{
src . ScaleXY ( newprc ) ;
if ( m_Fractorium - > m_Settings - > RotateAndScale ( ) )
src . Rotate ( angle ) ;
2018-09-15 06:11:12 -04:00
2019-06-19 00:29:58 -04:00
affine = src ;
}
--User changes
-Add a palette editor.
-Add support for reading .ugr/.gradient/.gradients palette files.
-Allow toggling on spinners whose minimum value is not zero.
-Allow toggling display of image, affines and grid.
-Add new variations: cylinder2, circlesplit, tile_log, truchet_fill, waves2_radial.
--Bug fixes
-cpow2 was wrong.
-Palettes with rapid changes in color would produce slightly different outputs from Apo/Chaotica. This was due to a long standing bug from flam3.
-Use exec() on Apple and show() on all other OSes for dialog boxes.
-Trying to render a sequence with no frames would crash.
-Selecting multiple xforms and rotating them would produce the wrong rotation.
-Better handling when parsing flames using different encoding, such as unicode and UTF-8.
-Switching between SP/DP didn't reselect the selected flame in the Library tab.
--Code changes
-Make all types concerning palettes be floats, including PaletteTableWidgetItem.
-PaletteTableWidgetItem is no longer templated because all palettes are float.
-Include the source colors for user created gradients.
-Change parallel_for() calls to work with very old versions of TBB which are lingering on some systems.
-Split conditional out of accumulation loop on the CPU for better performance.
-Vectorize summing when doing density filter for better performance.
-Make all usage of palettes be of type float, double is pointless.
-Allow palettes to reside in multiple folders, while ensuring only one of each name is added.
-Refactor some palette path searching code.
-Make ReadFile() throw and catch an exception if the file operation fails.
-A little extra safety in foci and foci3D with a call to Zeps().
-Cast to (real_t) in the OpenCL string for the w variation, which was having trouble compiling on Mac.
-Fixing missing comma between paths in InitPaletteList().
-Move Xml and PaletteList classes into cpp to shorten build times when working on them.
-Remove default param values for IterOpenCLKernelCreator<T>::SharedDataIndexDefines in cpp file.
-Change more NULL to nullptr.
2017-02-26 03:02:21 -05:00
}
2014-07-08 03:11:14 -04:00
2019-06-19 00:29:58 -04:00
auto & affine = pre ? xform - > m_Affine : xform - > m_Post ;
2016-02-12 00:38:21 -05:00
if ( xform = = m_FractoriumEmberController - > CurrentXform ( ) )
--User changes
-Add a palette editor.
-Add support for reading .ugr/.gradient/.gradients palette files.
-Allow toggling on spinners whose minimum value is not zero.
-Allow toggling display of image, affines and grid.
-Add new variations: cylinder2, circlesplit, tile_log, truchet_fill, waves2_radial.
--Bug fixes
-cpow2 was wrong.
-Palettes with rapid changes in color would produce slightly different outputs from Apo/Chaotica. This was due to a long standing bug from flam3.
-Use exec() on Apple and show() on all other OSes for dialog boxes.
-Trying to render a sequence with no frames would crash.
-Selecting multiple xforms and rotating them would produce the wrong rotation.
-Better handling when parsing flames using different encoding, such as unicode and UTF-8.
-Switching between SP/DP didn't reselect the selected flame in the Library tab.
--Code changes
-Make all types concerning palettes be floats, including PaletteTableWidgetItem.
-PaletteTableWidgetItem is no longer templated because all palettes are float.
-Include the source colors for user created gradients.
-Change parallel_for() calls to work with very old versions of TBB which are lingering on some systems.
-Split conditional out of accumulation loop on the CPU for better performance.
-Vectorize summing when doing density filter for better performance.
-Make all usage of palettes be of type float, double is pointless.
-Allow palettes to reside in multiple folders, while ensuring only one of each name is added.
-Refactor some palette path searching code.
-Make ReadFile() throw and catch an exception if the file operation fails.
-A little extra safety in foci and foci3D with a call to Zeps().
-Cast to (real_t) in the OpenCL string for the w variation, which was having trouble compiling on Mac.
-Fixing missing comma between paths in InitPaletteList().
-Move Xml and PaletteList classes into cpp to shorten build times when working on them.
-Remove default param values for IterOpenCLKernelCreator<T>::SharedDataIndexDefines in cpp file.
-Change more NULL to nullptr.
2017-02-26 03:02:21 -05:00
m_DragHandlePos = v3T ( ( affine . O ( ) + affine . X ( ) ) * worldToAffineScale , 0 ) ;
2019-06-21 20:51:20 -04:00
} , eXformUpdate : : UPDATE_SELECTED , false ) ;
2016-02-12 00:38:21 -05:00
}
2014-07-08 03:11:14 -04:00
}
/// <summary>
/// Calculate the new affine transform when dragging with the y axis with the left mouse button.
/// The value returned will depend on whether any modifier keys were held down.
2018-09-15 06:11:12 -04:00
/// None: Rotate only.
2014-07-08 03:11:14 -04:00
/// Local Pivot:
2018-09-15 06:11:12 -04:00
/// Shift: Scale and optionally Rotate about affine center.
/// Alt: Rotate single axis about affine center.
/// Shift + Alt: Free transform.
/// Control: Rotate, snapping to grid.
/// Control + Shift: Scale and optionally Rotate, snapping to grid.
/// Control + Alt: Rotate single axis about affine center, snapping to grid.
/// Control + Shift + Alt: Free transform, snapping to grid.
2014-07-08 03:11:14 -04:00
/// World Pivot:
/// Shift + Alt: Rotate single axis about world center.
/// Control + Shift + Alt: Rotate single axis about world center, snapping to grid.
/// All others are the same as local pivot.
/// </summary>
/// <returns>The new affine transform to be assigned to the selected xform</returns>
template < typename T >
2016-02-12 00:38:21 -05:00
void GLEmberController < T > : : CalcDragYAxis ( )
2014-07-08 03:11:14 -04:00
{
2020-01-14 23:08:27 -05:00
T affineToWorldScale = T ( m_FractoriumEmberController - > AffineScaleLockedToCurrent ( ) ) ;
T worldToAffineScale = T ( m_FractoriumEmberController - > AffineScaleCurrentToLocked ( ) ) ;
2016-02-12 00:38:21 -05:00
bool pre = m_AffineType = = eAffineType : : AffinePre ;
2016-01-04 19:50:15 -05:00
bool worldPivotShiftAlt = ! m_Fractorium - > LocalPivot ( ) & & GetShift ( ) & & GetAlt ( ) ;
2018-09-15 06:11:12 -04:00
auto worldRelAxisStartScaled = ( v2T ( m_HoverHandlePos ) * affineToWorldScale ) - m_DragSrcTransform . O ( ) ; //World axis start position, relative, scaled by the zoom.
T startAngle = std : : atan2 ( worldRelAxisStartScaled . y , worldRelAxisStartScaled . x ) ;
v3T relScaled = ( m_MouseWorldPos * affineToWorldScale ) - v3T ( m_DragSrcTransform . O ( ) , 0 ) ;
2014-07-08 03:11:14 -04:00
2018-09-15 06:11:12 -04:00
if ( ! GetShift ( ) )
2014-07-08 03:11:14 -04:00
{
2018-09-15 06:11:12 -04:00
if ( GetControl ( ) )
{
relScaled = SnapToNormalizedAngle ( relScaled , 24u ) ; //relScaled is using the relative scaled position of the axis.
}
T endAngle = std : : atan2 ( relScaled . y , relScaled . x ) ;
2016-02-12 00:38:21 -05:00
T angle = startAngle - endAngle ;
--User changes
-No longer constrain pitch, yaw or depth spinners to -180 - 180.
--Bug fixes
-Properly set color index on padded xforms.
-Adding a padding final xform included a linear variation with a weight of zero to not appear empty. Made it have a weight of 1.
-Always write animate tag on final xform when saving to Xml.
-Motion was being applied to the wrong flame in SheepTools::Edge(), so apply it to the correct one.
-Prevent divide by zero when normalizing variation weights.
-Was accidentally adding the placeholder value of -9999 for motion_offset to varation weights and parameters when applying motion. Set to zero if no value present.
-Clamp flame rotation values to -180 - 180 when reading a flame from Xml.
-Events were not properly wired for user changes in the random rotations per blend controls in the sequencer.
-Fix major UI bugs with sequencer min/max random controls which made it nearly impossible to hand type values.
-Values from rotations per blend and rotations per blend max were not being saved to file between program runs.
-Checking animate for an xform was not applied to all flames even if Apply All was checked.
-Changing interpolation type, temporal filter width, temporal type, and affine interpolation type were not actually saving to the flame when changed.
-Grid on the main window was not being drawn at the right scale initially due to some OpenGL initialization occurring in the wrong order.
-Severe bugs in sequence generation code:
--Improperly detected padding xforms.
--When looking for specific variations during xform aligning, only presence was detected, when it should have been presence plus a weight greater than zero.
--When adding specific variations during xform aligning, must first remove any variations of that type.
--Two variables were unsigned when they should have been signed. This prevented large blocks of code from ever executing.
--When interpolating affines, an EPS that was too small was used, causing affine values to interpolate incorrectly. Instead use 1e-10 to ensure results equal to flam3.
--Code changes
-Modify FractoriumEmberController::UpdateXform() to pass the selected xform index as well as the absolute index to func().
2018-06-13 00:20:15 -04:00
m_FractoriumEmberController - > UpdateXform ( [ & ] ( Xform < T > * xform , size_t xfindex , size_t selIndex )
2016-02-12 00:38:21 -05:00
{
2019-06-19 00:29:58 -04:00
auto it = m_DragSrcPreTransforms . find ( xfindex ) ;
2014-07-08 03:11:14 -04:00
2019-06-21 20:51:20 -04:00
if ( it ! = m_DragSrcPreTransforms . end ( ) )
2016-02-12 00:38:21 -05:00
{
2019-06-19 00:29:58 -04:00
auto src = it - > second ;
auto & affine = xform - > m_Affine ;
if ( GetAlt ( ) )
{
src . Rotate ( angle ) ;
affine . Y ( src . Y ( ) ) ;
}
else
{
src . Rotate ( angle ) ;
affine = src ;
}
2016-02-12 00:38:21 -05:00
}
2019-06-19 00:29:58 -04:00
it = m_DragSrcPostTransforms . find ( xfindex ) ;
2019-06-21 20:51:20 -04:00
if ( it ! = m_DragSrcPostTransforms . end ( ) )
2016-02-12 00:38:21 -05:00
{
2019-06-19 00:29:58 -04:00
auto src = it - > second ;
auto & affine = xform - > m_Post ;
if ( GetAlt ( ) )
{
src . Rotate ( angle ) ;
affine . Y ( src . Y ( ) ) ;
}
else
{
src . Rotate ( angle ) ;
affine = src ;
}
2016-02-12 00:38:21 -05:00
}
2014-07-08 03:11:14 -04:00
2019-06-19 00:29:58 -04:00
auto & affine = pre ? xform - > m_Affine : xform - > m_Post ;
2016-02-12 00:38:21 -05:00
if ( xform = = m_FractoriumEmberController - > CurrentXform ( ) )
--User changes
-Add a palette editor.
-Add support for reading .ugr/.gradient/.gradients palette files.
-Allow toggling on spinners whose minimum value is not zero.
-Allow toggling display of image, affines and grid.
-Add new variations: cylinder2, circlesplit, tile_log, truchet_fill, waves2_radial.
--Bug fixes
-cpow2 was wrong.
-Palettes with rapid changes in color would produce slightly different outputs from Apo/Chaotica. This was due to a long standing bug from flam3.
-Use exec() on Apple and show() on all other OSes for dialog boxes.
-Trying to render a sequence with no frames would crash.
-Selecting multiple xforms and rotating them would produce the wrong rotation.
-Better handling when parsing flames using different encoding, such as unicode and UTF-8.
-Switching between SP/DP didn't reselect the selected flame in the Library tab.
--Code changes
-Make all types concerning palettes be floats, including PaletteTableWidgetItem.
-PaletteTableWidgetItem is no longer templated because all palettes are float.
-Include the source colors for user created gradients.
-Change parallel_for() calls to work with very old versions of TBB which are lingering on some systems.
-Split conditional out of accumulation loop on the CPU for better performance.
-Vectorize summing when doing density filter for better performance.
-Make all usage of palettes be of type float, double is pointless.
-Allow palettes to reside in multiple folders, while ensuring only one of each name is added.
-Refactor some palette path searching code.
-Make ReadFile() throw and catch an exception if the file operation fails.
-A little extra safety in foci and foci3D with a call to Zeps().
-Cast to (real_t) in the OpenCL string for the w variation, which was having trouble compiling on Mac.
-Fixing missing comma between paths in InitPaletteList().
-Move Xml and PaletteList classes into cpp to shorten build times when working on them.
-Remove default param values for IterOpenCLKernelCreator<T>::SharedDataIndexDefines in cpp file.
-Change more NULL to nullptr.
2017-02-26 03:02:21 -05:00
m_DragHandlePos = v3T ( ( affine . O ( ) + affine . Y ( ) ) * worldToAffineScale , 0 ) ;
2019-06-21 20:51:20 -04:00
} , eXformUpdate : : UPDATE_SELECTED , false ) ; //Calling code will update renderer.
2014-07-08 03:11:14 -04:00
}
else
{
2018-09-15 06:11:12 -04:00
auto origmag = Zeps ( glm : : length ( m_DragSrcTransform . Y ( ) ) ) ; //Magnitude of original dragged axis before it was dragged.
2016-02-12 00:38:21 -05:00
2016-01-04 19:50:15 -05:00
if ( GetControl ( ) )
--User changes
-Add a palette editor.
-Add support for reading .ugr/.gradient/.gradients palette files.
-Allow toggling on spinners whose minimum value is not zero.
-Allow toggling display of image, affines and grid.
-Add new variations: cylinder2, circlesplit, tile_log, truchet_fill, waves2_radial.
--Bug fixes
-cpow2 was wrong.
-Palettes with rapid changes in color would produce slightly different outputs from Apo/Chaotica. This was due to a long standing bug from flam3.
-Use exec() on Apple and show() on all other OSes for dialog boxes.
-Trying to render a sequence with no frames would crash.
-Selecting multiple xforms and rotating them would produce the wrong rotation.
-Better handling when parsing flames using different encoding, such as unicode and UTF-8.
-Switching between SP/DP didn't reselect the selected flame in the Library tab.
--Code changes
-Make all types concerning palettes be floats, including PaletteTableWidgetItem.
-PaletteTableWidgetItem is no longer templated because all palettes are float.
-Include the source colors for user created gradients.
-Change parallel_for() calls to work with very old versions of TBB which are lingering on some systems.
-Split conditional out of accumulation loop on the CPU for better performance.
-Vectorize summing when doing density filter for better performance.
-Make all usage of palettes be of type float, double is pointless.
-Allow palettes to reside in multiple folders, while ensuring only one of each name is added.
-Refactor some palette path searching code.
-Make ReadFile() throw and catch an exception if the file operation fails.
-A little extra safety in foci and foci3D with a call to Zeps().
-Cast to (real_t) in the OpenCL string for the w variation, which was having trouble compiling on Mac.
-Fixing missing comma between paths in InitPaletteList().
-Move Xml and PaletteList classes into cpp to shorten build times when working on them.
-Remove default param values for IterOpenCLKernelCreator<T>::SharedDataIndexDefines in cpp file.
-Change more NULL to nullptr.
2017-02-26 03:02:21 -05:00
{
2018-09-15 06:11:12 -04:00
relScaled = SnapToGrid ( relScaled ) ;
--User changes
-Add a palette editor.
-Add support for reading .ugr/.gradient/.gradients palette files.
-Allow toggling on spinners whose minimum value is not zero.
-Allow toggling display of image, affines and grid.
-Add new variations: cylinder2, circlesplit, tile_log, truchet_fill, waves2_radial.
--Bug fixes
-cpow2 was wrong.
-Palettes with rapid changes in color would produce slightly different outputs from Apo/Chaotica. This was due to a long standing bug from flam3.
-Use exec() on Apple and show() on all other OSes for dialog boxes.
-Trying to render a sequence with no frames would crash.
-Selecting multiple xforms and rotating them would produce the wrong rotation.
-Better handling when parsing flames using different encoding, such as unicode and UTF-8.
-Switching between SP/DP didn't reselect the selected flame in the Library tab.
--Code changes
-Make all types concerning palettes be floats, including PaletteTableWidgetItem.
-PaletteTableWidgetItem is no longer templated because all palettes are float.
-Include the source colors for user created gradients.
-Change parallel_for() calls to work with very old versions of TBB which are lingering on some systems.
-Split conditional out of accumulation loop on the CPU for better performance.
-Vectorize summing when doing density filter for better performance.
-Make all usage of palettes be of type float, double is pointless.
-Allow palettes to reside in multiple folders, while ensuring only one of each name is added.
-Refactor some palette path searching code.
-Make ReadFile() throw and catch an exception if the file operation fails.
-A little extra safety in foci and foci3D with a call to Zeps().
-Cast to (real_t) in the OpenCL string for the w variation, which was having trouble compiling on Mac.
-Fixing missing comma between paths in InitPaletteList().
-Move Xml and PaletteList classes into cpp to shorten build times when working on them.
-Remove default param values for IterOpenCLKernelCreator<T>::SharedDataIndexDefines in cpp file.
-Change more NULL to nullptr.
2017-02-26 03:02:21 -05:00
}
2014-07-08 03:11:14 -04:00
2018-09-15 06:11:12 -04:00
auto newmag = glm : : length ( relScaled ) ;
--User changes
-Add a palette editor.
-Add support for reading .ugr/.gradient/.gradients palette files.
-Allow toggling on spinners whose minimum value is not zero.
-Allow toggling display of image, affines and grid.
-Add new variations: cylinder2, circlesplit, tile_log, truchet_fill, waves2_radial.
--Bug fixes
-cpow2 was wrong.
-Palettes with rapid changes in color would produce slightly different outputs from Apo/Chaotica. This was due to a long standing bug from flam3.
-Use exec() on Apple and show() on all other OSes for dialog boxes.
-Trying to render a sequence with no frames would crash.
-Selecting multiple xforms and rotating them would produce the wrong rotation.
-Better handling when parsing flames using different encoding, such as unicode and UTF-8.
-Switching between SP/DP didn't reselect the selected flame in the Library tab.
--Code changes
-Make all types concerning palettes be floats, including PaletteTableWidgetItem.
-PaletteTableWidgetItem is no longer templated because all palettes are float.
-Include the source colors for user created gradients.
-Change parallel_for() calls to work with very old versions of TBB which are lingering on some systems.
-Split conditional out of accumulation loop on the CPU for better performance.
-Vectorize summing when doing density filter for better performance.
-Make all usage of palettes be of type float, double is pointless.
-Allow palettes to reside in multiple folders, while ensuring only one of each name is added.
-Refactor some palette path searching code.
-Make ReadFile() throw and catch an exception if the file operation fails.
-A little extra safety in foci and foci3D with a call to Zeps().
-Cast to (real_t) in the OpenCL string for the w variation, which was having trouble compiling on Mac.
-Fixing missing comma between paths in InitPaletteList().
-Move Xml and PaletteList classes into cpp to shorten build times when working on them.
-Remove default param values for IterOpenCLKernelCreator<T>::SharedDataIndexDefines in cpp file.
-Change more NULL to nullptr.
2017-02-26 03:02:21 -05:00
auto newprc = newmag / origmag ;
2018-09-15 06:11:12 -04:00
T endAngle = std : : atan2 ( relScaled . y , relScaled . x ) ;
--User changes
-Add a palette editor.
-Add support for reading .ugr/.gradient/.gradients palette files.
-Allow toggling on spinners whose minimum value is not zero.
-Allow toggling display of image, affines and grid.
-Add new variations: cylinder2, circlesplit, tile_log, truchet_fill, waves2_radial.
--Bug fixes
-cpow2 was wrong.
-Palettes with rapid changes in color would produce slightly different outputs from Apo/Chaotica. This was due to a long standing bug from flam3.
-Use exec() on Apple and show() on all other OSes for dialog boxes.
-Trying to render a sequence with no frames would crash.
-Selecting multiple xforms and rotating them would produce the wrong rotation.
-Better handling when parsing flames using different encoding, such as unicode and UTF-8.
-Switching between SP/DP didn't reselect the selected flame in the Library tab.
--Code changes
-Make all types concerning palettes be floats, including PaletteTableWidgetItem.
-PaletteTableWidgetItem is no longer templated because all palettes are float.
-Include the source colors for user created gradients.
-Change parallel_for() calls to work with very old versions of TBB which are lingering on some systems.
-Split conditional out of accumulation loop on the CPU for better performance.
-Vectorize summing when doing density filter for better performance.
-Make all usage of palettes be of type float, double is pointless.
-Allow palettes to reside in multiple folders, while ensuring only one of each name is added.
-Refactor some palette path searching code.
-Make ReadFile() throw and catch an exception if the file operation fails.
-A little extra safety in foci and foci3D with a call to Zeps().
-Cast to (real_t) in the OpenCL string for the w variation, which was having trouble compiling on Mac.
-Fixing missing comma between paths in InitPaletteList().
-Move Xml and PaletteList classes into cpp to shorten build times when working on them.
-Remove default param values for IterOpenCLKernelCreator<T>::SharedDataIndexDefines in cpp file.
-Change more NULL to nullptr.
2017-02-26 03:02:21 -05:00
T angle = startAngle - endAngle ;
--User changes
-No longer constrain pitch, yaw or depth spinners to -180 - 180.
--Bug fixes
-Properly set color index on padded xforms.
-Adding a padding final xform included a linear variation with a weight of zero to not appear empty. Made it have a weight of 1.
-Always write animate tag on final xform when saving to Xml.
-Motion was being applied to the wrong flame in SheepTools::Edge(), so apply it to the correct one.
-Prevent divide by zero when normalizing variation weights.
-Was accidentally adding the placeholder value of -9999 for motion_offset to varation weights and parameters when applying motion. Set to zero if no value present.
-Clamp flame rotation values to -180 - 180 when reading a flame from Xml.
-Events were not properly wired for user changes in the random rotations per blend controls in the sequencer.
-Fix major UI bugs with sequencer min/max random controls which made it nearly impossible to hand type values.
-Values from rotations per blend and rotations per blend max were not being saved to file between program runs.
-Checking animate for an xform was not applied to all flames even if Apply All was checked.
-Changing interpolation type, temporal filter width, temporal type, and affine interpolation type were not actually saving to the flame when changed.
-Grid on the main window was not being drawn at the right scale initially due to some OpenGL initialization occurring in the wrong order.
-Severe bugs in sequence generation code:
--Improperly detected padding xforms.
--When looking for specific variations during xform aligning, only presence was detected, when it should have been presence plus a weight greater than zero.
--When adding specific variations during xform aligning, must first remove any variations of that type.
--Two variables were unsigned when they should have been signed. This prevented large blocks of code from ever executing.
--When interpolating affines, an EPS that was too small was used, causing affine values to interpolate incorrectly. Instead use 1e-10 to ensure results equal to flam3.
--Code changes
-Modify FractoriumEmberController::UpdateXform() to pass the selected xform index as well as the absolute index to func().
2018-06-13 00:20:15 -04:00
m_FractoriumEmberController - > UpdateXform ( [ & ] ( Xform < T > * xform , size_t xfindex , size_t selIndex )
2016-02-12 00:38:21 -05:00
{
2019-06-19 00:29:58 -04:00
auto it = m_DragSrcPreTransforms . find ( xfindex ) ;
2014-07-08 03:11:14 -04:00
2019-06-21 20:51:20 -04:00
if ( it ! = m_DragSrcPreTransforms . end ( ) )
--User changes
-Add a palette editor.
-Add support for reading .ugr/.gradient/.gradients palette files.
-Allow toggling on spinners whose minimum value is not zero.
-Allow toggling display of image, affines and grid.
-Add new variations: cylinder2, circlesplit, tile_log, truchet_fill, waves2_radial.
--Bug fixes
-cpow2 was wrong.
-Palettes with rapid changes in color would produce slightly different outputs from Apo/Chaotica. This was due to a long standing bug from flam3.
-Use exec() on Apple and show() on all other OSes for dialog boxes.
-Trying to render a sequence with no frames would crash.
-Selecting multiple xforms and rotating them would produce the wrong rotation.
-Better handling when parsing flames using different encoding, such as unicode and UTF-8.
-Switching between SP/DP didn't reselect the selected flame in the Library tab.
--Code changes
-Make all types concerning palettes be floats, including PaletteTableWidgetItem.
-PaletteTableWidgetItem is no longer templated because all palettes are float.
-Include the source colors for user created gradients.
-Change parallel_for() calls to work with very old versions of TBB which are lingering on some systems.
-Split conditional out of accumulation loop on the CPU for better performance.
-Vectorize summing when doing density filter for better performance.
-Make all usage of palettes be of type float, double is pointless.
-Allow palettes to reside in multiple folders, while ensuring only one of each name is added.
-Refactor some palette path searching code.
-Make ReadFile() throw and catch an exception if the file operation fails.
-A little extra safety in foci and foci3D with a call to Zeps().
-Cast to (real_t) in the OpenCL string for the w variation, which was having trouble compiling on Mac.
-Fixing missing comma between paths in InitPaletteList().
-Move Xml and PaletteList classes into cpp to shorten build times when working on them.
-Remove default param values for IterOpenCLKernelCreator<T>::SharedDataIndexDefines in cpp file.
-Change more NULL to nullptr.
2017-02-26 03:02:21 -05:00
{
2019-06-19 00:29:58 -04:00
auto src = it - > second ;
auto & affine = xform - > m_Affine ;
if ( worldPivotShiftAlt )
{
src . Y ( src . O ( ) + src . Y ( ) ) ;
src . O ( v2T ( 0 ) ) ;
src . Rotate ( angle ) ;
affine . Y ( src . Y ( ) - affine . O ( ) ) ;
}
else if ( GetAlt ( ) )
{
affine . Y ( v2T ( relScaled ) ) ; //Absolute, not ratio.
}
else
{
src . ScaleXY ( newprc ) ;
if ( m_Fractorium - > m_Settings - > RotateAndScale ( ) )
src . Rotate ( angle ) ;
affine = src ;
}
--User changes
-Add a palette editor.
-Add support for reading .ugr/.gradient/.gradients palette files.
-Allow toggling on spinners whose minimum value is not zero.
-Allow toggling display of image, affines and grid.
-Add new variations: cylinder2, circlesplit, tile_log, truchet_fill, waves2_radial.
--Bug fixes
-cpow2 was wrong.
-Palettes with rapid changes in color would produce slightly different outputs from Apo/Chaotica. This was due to a long standing bug from flam3.
-Use exec() on Apple and show() on all other OSes for dialog boxes.
-Trying to render a sequence with no frames would crash.
-Selecting multiple xforms and rotating them would produce the wrong rotation.
-Better handling when parsing flames using different encoding, such as unicode and UTF-8.
-Switching between SP/DP didn't reselect the selected flame in the Library tab.
--Code changes
-Make all types concerning palettes be floats, including PaletteTableWidgetItem.
-PaletteTableWidgetItem is no longer templated because all palettes are float.
-Include the source colors for user created gradients.
-Change parallel_for() calls to work with very old versions of TBB which are lingering on some systems.
-Split conditional out of accumulation loop on the CPU for better performance.
-Vectorize summing when doing density filter for better performance.
-Make all usage of palettes be of type float, double is pointless.
-Allow palettes to reside in multiple folders, while ensuring only one of each name is added.
-Refactor some palette path searching code.
-Make ReadFile() throw and catch an exception if the file operation fails.
-A little extra safety in foci and foci3D with a call to Zeps().
-Cast to (real_t) in the OpenCL string for the w variation, which was having trouble compiling on Mac.
-Fixing missing comma between paths in InitPaletteList().
-Move Xml and PaletteList classes into cpp to shorten build times when working on them.
-Remove default param values for IterOpenCLKernelCreator<T>::SharedDataIndexDefines in cpp file.
-Change more NULL to nullptr.
2017-02-26 03:02:21 -05:00
}
2019-06-19 00:29:58 -04:00
it = m_DragSrcPostTransforms . find ( xfindex ) ;
2019-06-21 20:51:20 -04:00
if ( it ! = m_DragSrcPostTransforms . end ( ) )
--User changes
-Add a palette editor.
-Add support for reading .ugr/.gradient/.gradients palette files.
-Allow toggling on spinners whose minimum value is not zero.
-Allow toggling display of image, affines and grid.
-Add new variations: cylinder2, circlesplit, tile_log, truchet_fill, waves2_radial.
--Bug fixes
-cpow2 was wrong.
-Palettes with rapid changes in color would produce slightly different outputs from Apo/Chaotica. This was due to a long standing bug from flam3.
-Use exec() on Apple and show() on all other OSes for dialog boxes.
-Trying to render a sequence with no frames would crash.
-Selecting multiple xforms and rotating them would produce the wrong rotation.
-Better handling when parsing flames using different encoding, such as unicode and UTF-8.
-Switching between SP/DP didn't reselect the selected flame in the Library tab.
--Code changes
-Make all types concerning palettes be floats, including PaletteTableWidgetItem.
-PaletteTableWidgetItem is no longer templated because all palettes are float.
-Include the source colors for user created gradients.
-Change parallel_for() calls to work with very old versions of TBB which are lingering on some systems.
-Split conditional out of accumulation loop on the CPU for better performance.
-Vectorize summing when doing density filter for better performance.
-Make all usage of palettes be of type float, double is pointless.
-Allow palettes to reside in multiple folders, while ensuring only one of each name is added.
-Refactor some palette path searching code.
-Make ReadFile() throw and catch an exception if the file operation fails.
-A little extra safety in foci and foci3D with a call to Zeps().
-Cast to (real_t) in the OpenCL string for the w variation, which was having trouble compiling on Mac.
-Fixing missing comma between paths in InitPaletteList().
-Move Xml and PaletteList classes into cpp to shorten build times when working on them.
-Remove default param values for IterOpenCLKernelCreator<T>::SharedDataIndexDefines in cpp file.
-Change more NULL to nullptr.
2017-02-26 03:02:21 -05:00
{
2019-06-19 00:29:58 -04:00
auto src = it - > second ;
auto & affine = xform - > m_Post ;
2018-09-15 06:11:12 -04:00
2019-06-19 00:29:58 -04:00
if ( worldPivotShiftAlt )
{
src . Y ( src . O ( ) + src . Y ( ) ) ;
src . O ( v2T ( 0 ) ) ;
2018-09-15 06:11:12 -04:00
src . Rotate ( angle ) ;
2019-06-19 00:29:58 -04:00
affine . Y ( src . Y ( ) - affine . O ( ) ) ;
}
else if ( GetAlt ( ) )
{
affine . Y ( v2T ( relScaled ) ) ; //Absolute, not ratio.
}
else
{
src . ScaleXY ( newprc ) ;
2018-09-15 06:11:12 -04:00
2019-06-19 00:29:58 -04:00
if ( m_Fractorium - > m_Settings - > RotateAndScale ( ) )
src . Rotate ( angle ) ;
affine = src ;
}
--User changes
-Add a palette editor.
-Add support for reading .ugr/.gradient/.gradients palette files.
-Allow toggling on spinners whose minimum value is not zero.
-Allow toggling display of image, affines and grid.
-Add new variations: cylinder2, circlesplit, tile_log, truchet_fill, waves2_radial.
--Bug fixes
-cpow2 was wrong.
-Palettes with rapid changes in color would produce slightly different outputs from Apo/Chaotica. This was due to a long standing bug from flam3.
-Use exec() on Apple and show() on all other OSes for dialog boxes.
-Trying to render a sequence with no frames would crash.
-Selecting multiple xforms and rotating them would produce the wrong rotation.
-Better handling when parsing flames using different encoding, such as unicode and UTF-8.
-Switching between SP/DP didn't reselect the selected flame in the Library tab.
--Code changes
-Make all types concerning palettes be floats, including PaletteTableWidgetItem.
-PaletteTableWidgetItem is no longer templated because all palettes are float.
-Include the source colors for user created gradients.
-Change parallel_for() calls to work with very old versions of TBB which are lingering on some systems.
-Split conditional out of accumulation loop on the CPU for better performance.
-Vectorize summing when doing density filter for better performance.
-Make all usage of palettes be of type float, double is pointless.
-Allow palettes to reside in multiple folders, while ensuring only one of each name is added.
-Refactor some palette path searching code.
-Make ReadFile() throw and catch an exception if the file operation fails.
-A little extra safety in foci and foci3D with a call to Zeps().
-Cast to (real_t) in the OpenCL string for the w variation, which was having trouble compiling on Mac.
-Fixing missing comma between paths in InitPaletteList().
-Move Xml and PaletteList classes into cpp to shorten build times when working on them.
-Remove default param values for IterOpenCLKernelCreator<T>::SharedDataIndexDefines in cpp file.
-Change more NULL to nullptr.
2017-02-26 03:02:21 -05:00
}
2014-07-08 03:11:14 -04:00
2019-06-19 00:29:58 -04:00
auto & affine = pre ? xform - > m_Affine : xform - > m_Post ;
2016-02-12 00:38:21 -05:00
if ( xform = = m_FractoriumEmberController - > CurrentXform ( ) )
--User changes
-Add a palette editor.
-Add support for reading .ugr/.gradient/.gradients palette files.
-Allow toggling on spinners whose minimum value is not zero.
-Allow toggling display of image, affines and grid.
-Add new variations: cylinder2, circlesplit, tile_log, truchet_fill, waves2_radial.
--Bug fixes
-cpow2 was wrong.
-Palettes with rapid changes in color would produce slightly different outputs from Apo/Chaotica. This was due to a long standing bug from flam3.
-Use exec() on Apple and show() on all other OSes for dialog boxes.
-Trying to render a sequence with no frames would crash.
-Selecting multiple xforms and rotating them would produce the wrong rotation.
-Better handling when parsing flames using different encoding, such as unicode and UTF-8.
-Switching between SP/DP didn't reselect the selected flame in the Library tab.
--Code changes
-Make all types concerning palettes be floats, including PaletteTableWidgetItem.
-PaletteTableWidgetItem is no longer templated because all palettes are float.
-Include the source colors for user created gradients.
-Change parallel_for() calls to work with very old versions of TBB which are lingering on some systems.
-Split conditional out of accumulation loop on the CPU for better performance.
-Vectorize summing when doing density filter for better performance.
-Make all usage of palettes be of type float, double is pointless.
-Allow palettes to reside in multiple folders, while ensuring only one of each name is added.
-Refactor some palette path searching code.
-Make ReadFile() throw and catch an exception if the file operation fails.
-A little extra safety in foci and foci3D with a call to Zeps().
-Cast to (real_t) in the OpenCL string for the w variation, which was having trouble compiling on Mac.
-Fixing missing comma between paths in InitPaletteList().
-Move Xml and PaletteList classes into cpp to shorten build times when working on them.
-Remove default param values for IterOpenCLKernelCreator<T>::SharedDataIndexDefines in cpp file.
-Change more NULL to nullptr.
2017-02-26 03:02:21 -05:00
m_DragHandlePos = v3T ( ( affine . O ( ) + affine . Y ( ) ) * worldToAffineScale , 0 ) ;
2019-06-21 20:51:20 -04:00
} , eXformUpdate : : UPDATE_SELECTED , false ) ;
2016-02-12 00:38:21 -05:00
}
2014-07-08 03:11:14 -04:00
}
/// <summary>
/// Calculate the new affine transform when dragging the center with the left mouse button.
/// The value returned will depend on whether any modifier keys were held down.
/// None: Free transform.
/// Local Pivot:
/// Shift: Rotate about world center, keeping orientation the same.
/// Control: Free transform, snapping to grid.
/// Control + Shift: Rotate about world center, keeping orientation the same, snapping to grid.
/// World Pivot:
/// Shift: Rotate about world center, rotating orientation.
/// Control + Shift: Rotate about world center, rotating orientation, snapping to grid.
/// All others are the same as local pivot.
/// </summary>
template < typename T >
2016-02-12 00:38:21 -05:00
void GLEmberController < T > : : CalcDragTranslation ( )
2014-07-08 03:11:14 -04:00
{
2020-01-14 23:08:27 -05:00
T affineToWorldScale = T ( m_FractoriumEmberController - > AffineScaleLockedToCurrent ( ) ) ;
T worldToAffineScale = T ( m_FractoriumEmberController - > AffineScaleCurrentToLocked ( ) ) ;
2016-01-04 19:50:15 -05:00
bool worldPivotShift = ! m_Fractorium - > LocalPivot ( ) & & GetShift ( ) ;
2016-02-12 00:38:21 -05:00
bool pre = m_AffineType = = eAffineType : : AffinePre ;
2014-07-08 03:11:14 -04:00
2016-01-04 19:50:15 -05:00
if ( GetShift ( ) )
2014-07-08 03:11:14 -04:00
{
2016-02-12 00:38:21 -05:00
v3T snapped = GetControl ( ) ? SnapToNormalizedAngle ( m_MouseWorldPos , 24 ) : m_MouseWorldPos ;
T startAngle = std : : atan2 ( m_DragSrcTransform . O ( ) . y , m_DragSrcTransform . O ( ) . x ) ;
T endAngle = std : : atan2 ( snapped . y , snapped . x ) ;
T angle = startAngle - endAngle ;
--User changes
-No longer constrain pitch, yaw or depth spinners to -180 - 180.
--Bug fixes
-Properly set color index on padded xforms.
-Adding a padding final xform included a linear variation with a weight of zero to not appear empty. Made it have a weight of 1.
-Always write animate tag on final xform when saving to Xml.
-Motion was being applied to the wrong flame in SheepTools::Edge(), so apply it to the correct one.
-Prevent divide by zero when normalizing variation weights.
-Was accidentally adding the placeholder value of -9999 for motion_offset to varation weights and parameters when applying motion. Set to zero if no value present.
-Clamp flame rotation values to -180 - 180 when reading a flame from Xml.
-Events were not properly wired for user changes in the random rotations per blend controls in the sequencer.
-Fix major UI bugs with sequencer min/max random controls which made it nearly impossible to hand type values.
-Values from rotations per blend and rotations per blend max were not being saved to file between program runs.
-Checking animate for an xform was not applied to all flames even if Apply All was checked.
-Changing interpolation type, temporal filter width, temporal type, and affine interpolation type were not actually saving to the flame when changed.
-Grid on the main window was not being drawn at the right scale initially due to some OpenGL initialization occurring in the wrong order.
-Severe bugs in sequence generation code:
--Improperly detected padding xforms.
--When looking for specific variations during xform aligning, only presence was detected, when it should have been presence plus a weight greater than zero.
--When adding specific variations during xform aligning, must first remove any variations of that type.
--Two variables were unsigned when they should have been signed. This prevented large blocks of code from ever executing.
--When interpolating affines, an EPS that was too small was used, causing affine values to interpolate incorrectly. Instead use 1e-10 to ensure results equal to flam3.
--Code changes
-Modify FractoriumEmberController::UpdateXform() to pass the selected xform index as well as the absolute index to func().
2018-06-13 00:20:15 -04:00
m_FractoriumEmberController - > UpdateXform ( [ & ] ( Xform < T > * xform , size_t xfindex , size_t selIndex )
2016-02-12 00:38:21 -05:00
{
2019-06-19 00:29:58 -04:00
auto it = m_DragSrcPreTransforms . find ( xfindex ) ;
2019-06-21 20:51:20 -04:00
if ( it ! = m_DragSrcPreTransforms . end ( ) )
2019-06-19 00:29:58 -04:00
{
auto src = it - > second ;
auto & affine = xform - > m_Affine ;
src . RotateTrans ( angle ) ;
if ( worldPivotShift )
{
src . Rotate ( angle ) ;
affine . X ( src . X ( ) ) ;
affine . Y ( src . Y ( ) ) ;
}
affine . O ( src . O ( ) ) ;
}
it = m_DragSrcPostTransforms . find ( xfindex ) ;
2016-01-04 19:50:15 -05:00
2019-06-21 20:51:20 -04:00
if ( it ! = m_DragSrcPostTransforms . end ( ) )
2016-02-12 00:38:21 -05:00
{
2019-06-19 00:29:58 -04:00
auto src = it - > second ;
auto & affine = xform - > m_Post ;
src . RotateTrans ( angle ) ;
if ( worldPivotShift )
{
src . Rotate ( angle ) ;
affine . X ( src . X ( ) ) ;
affine . Y ( src . Y ( ) ) ;
}
affine . O ( src . O ( ) ) ;
2016-02-12 00:38:21 -05:00
}
2016-01-04 19:50:15 -05:00
2019-06-19 00:29:58 -04:00
auto & affine = pre ? xform - > m_Affine : xform - > m_Post ;
2014-07-08 03:11:14 -04:00
2016-02-12 00:38:21 -05:00
if ( xform = = m_FractoriumEmberController - > CurrentXform ( ) )
2019-06-19 00:29:58 -04:00
m_DragHandlePos = v3T ( affine . O ( ) , 0 ) * worldToAffineScale ;
2019-06-21 20:51:20 -04:00
} , eXformUpdate : : UPDATE_SELECTED , false ) ; //Calling code will update renderer.
2014-07-08 03:11:14 -04:00
}
else
{
2016-02-12 00:38:21 -05:00
auto diff = m_MouseWorldPos - m_MouseDownWorldPos ;
2016-01-04 19:50:15 -05:00
if ( GetControl ( ) )
2016-02-02 20:51:58 -05:00
{
--User changes
-No longer constrain pitch, yaw or depth spinners to -180 - 180.
--Bug fixes
-Properly set color index on padded xforms.
-Adding a padding final xform included a linear variation with a weight of zero to not appear empty. Made it have a weight of 1.
-Always write animate tag on final xform when saving to Xml.
-Motion was being applied to the wrong flame in SheepTools::Edge(), so apply it to the correct one.
-Prevent divide by zero when normalizing variation weights.
-Was accidentally adding the placeholder value of -9999 for motion_offset to varation weights and parameters when applying motion. Set to zero if no value present.
-Clamp flame rotation values to -180 - 180 when reading a flame from Xml.
-Events were not properly wired for user changes in the random rotations per blend controls in the sequencer.
-Fix major UI bugs with sequencer min/max random controls which made it nearly impossible to hand type values.
-Values from rotations per blend and rotations per blend max were not being saved to file between program runs.
-Checking animate for an xform was not applied to all flames even if Apply All was checked.
-Changing interpolation type, temporal filter width, temporal type, and affine interpolation type were not actually saving to the flame when changed.
-Grid on the main window was not being drawn at the right scale initially due to some OpenGL initialization occurring in the wrong order.
-Severe bugs in sequence generation code:
--Improperly detected padding xforms.
--When looking for specific variations during xform aligning, only presence was detected, when it should have been presence plus a weight greater than zero.
--When adding specific variations during xform aligning, must first remove any variations of that type.
--Two variables were unsigned when they should have been signed. This prevented large blocks of code from ever executing.
--When interpolating affines, an EPS that was too small was used, causing affine values to interpolate incorrectly. Instead use 1e-10 to ensure results equal to flam3.
--Code changes
-Modify FractoriumEmberController::UpdateXform() to pass the selected xform index as well as the absolute index to func().
2018-06-13 00:20:15 -04:00
m_FractoriumEmberController - > UpdateXform ( [ & ] ( Xform < T > * xform , size_t xfindex , size_t selIndex )
2016-02-12 00:38:21 -05:00
{
2019-06-19 00:29:58 -04:00
auto it = m_DragSrcPreTransforms . find ( xfindex ) ;
2019-06-21 20:51:20 -04:00
if ( it ! = m_DragSrcPreTransforms . end ( ) )
2019-06-19 00:29:58 -04:00
{
auto & src = it - > second ;
auto & affine = xform - > m_Affine ;
auto offset = src . O ( ) + ( affineToWorldScale * v2T ( diff ) ) ;
auto snapped = SnapToGrid ( offset ) ;
affine . O ( v2T ( snapped . x , snapped . y ) ) ;
}
it = m_DragSrcPostTransforms . find ( xfindex ) ;
2019-06-21 20:51:20 -04:00
if ( it ! = m_DragSrcPostTransforms . end ( ) )
2019-06-19 00:29:58 -04:00
{
auto & src = it - > second ;
auto & affine = xform - > m_Post ;
auto offset = src . O ( ) + ( affineToWorldScale * v2T ( diff ) ) ;
auto snapped = SnapToGrid ( offset ) ;
affine . O ( v2T ( snapped . x , snapped . y ) ) ;
}
2016-05-24 10:02:05 -04:00
auto & affine = pre ? xform - > m_Affine : xform - > m_Post ;
--User changes
-Add a palette editor.
-Add support for reading .ugr/.gradient/.gradients palette files.
-Allow toggling on spinners whose minimum value is not zero.
-Allow toggling display of image, affines and grid.
-Add new variations: cylinder2, circlesplit, tile_log, truchet_fill, waves2_radial.
--Bug fixes
-cpow2 was wrong.
-Palettes with rapid changes in color would produce slightly different outputs from Apo/Chaotica. This was due to a long standing bug from flam3.
-Use exec() on Apple and show() on all other OSes for dialog boxes.
-Trying to render a sequence with no frames would crash.
-Selecting multiple xforms and rotating them would produce the wrong rotation.
-Better handling when parsing flames using different encoding, such as unicode and UTF-8.
-Switching between SP/DP didn't reselect the selected flame in the Library tab.
--Code changes
-Make all types concerning palettes be floats, including PaletteTableWidgetItem.
-PaletteTableWidgetItem is no longer templated because all palettes are float.
-Include the source colors for user created gradients.
-Change parallel_for() calls to work with very old versions of TBB which are lingering on some systems.
-Split conditional out of accumulation loop on the CPU for better performance.
-Vectorize summing when doing density filter for better performance.
-Make all usage of palettes be of type float, double is pointless.
-Allow palettes to reside in multiple folders, while ensuring only one of each name is added.
-Refactor some palette path searching code.
-Make ReadFile() throw and catch an exception if the file operation fails.
-A little extra safety in foci and foci3D with a call to Zeps().
-Cast to (real_t) in the OpenCL string for the w variation, which was having trouble compiling on Mac.
-Fixing missing comma between paths in InitPaletteList().
-Move Xml and PaletteList classes into cpp to shorten build times when working on them.
-Remove default param values for IterOpenCLKernelCreator<T>::SharedDataIndexDefines in cpp file.
-Change more NULL to nullptr.
2017-02-26 03:02:21 -05:00
if ( xform = = m_FractoriumEmberController - > CurrentXform ( ) )
m_DragHandlePos = v3T ( affine . O ( ) , 0 ) * worldToAffineScale ;
2016-02-12 00:38:21 -05:00
} , eXformUpdate : : UPDATE_CURRENT_AND_SELECTED , false ) ;
2016-02-02 20:51:58 -05:00
}
2014-07-08 03:11:14 -04:00
else
2016-02-02 20:51:58 -05:00
{
--User changes
-No longer constrain pitch, yaw or depth spinners to -180 - 180.
--Bug fixes
-Properly set color index on padded xforms.
-Adding a padding final xform included a linear variation with a weight of zero to not appear empty. Made it have a weight of 1.
-Always write animate tag on final xform when saving to Xml.
-Motion was being applied to the wrong flame in SheepTools::Edge(), so apply it to the correct one.
-Prevent divide by zero when normalizing variation weights.
-Was accidentally adding the placeholder value of -9999 for motion_offset to varation weights and parameters when applying motion. Set to zero if no value present.
-Clamp flame rotation values to -180 - 180 when reading a flame from Xml.
-Events were not properly wired for user changes in the random rotations per blend controls in the sequencer.
-Fix major UI bugs with sequencer min/max random controls which made it nearly impossible to hand type values.
-Values from rotations per blend and rotations per blend max were not being saved to file between program runs.
-Checking animate for an xform was not applied to all flames even if Apply All was checked.
-Changing interpolation type, temporal filter width, temporal type, and affine interpolation type were not actually saving to the flame when changed.
-Grid on the main window was not being drawn at the right scale initially due to some OpenGL initialization occurring in the wrong order.
-Severe bugs in sequence generation code:
--Improperly detected padding xforms.
--When looking for specific variations during xform aligning, only presence was detected, when it should have been presence plus a weight greater than zero.
--When adding specific variations during xform aligning, must first remove any variations of that type.
--Two variables were unsigned when they should have been signed. This prevented large blocks of code from ever executing.
--When interpolating affines, an EPS that was too small was used, causing affine values to interpolate incorrectly. Instead use 1e-10 to ensure results equal to flam3.
--Code changes
-Modify FractoriumEmberController::UpdateXform() to pass the selected xform index as well as the absolute index to func().
2018-06-13 00:20:15 -04:00
m_FractoriumEmberController - > UpdateXform ( [ & ] ( Xform < T > * xform , size_t xfindex , size_t selIndex )
2016-02-12 00:38:21 -05:00
{
2019-06-19 00:29:58 -04:00
auto it = m_DragSrcPreTransforms . find ( xfindex ) ;
2019-06-21 20:51:20 -04:00
if ( it ! = m_DragSrcPreTransforms . end ( ) )
2019-06-19 00:29:58 -04:00
{
auto & src = it - > second ;
auto & affine = xform - > m_Affine ;
affine . O ( src . O ( ) + ( affineToWorldScale * v2T ( diff ) ) ) ;
}
it = m_DragSrcPostTransforms . find ( xfindex ) ;
2019-06-21 20:51:20 -04:00
if ( it ! = m_DragSrcPostTransforms . end ( ) )
2019-06-19 00:29:58 -04:00
{
auto & src = it - > second ;
auto & affine = xform - > m_Post ;
affine . O ( src . O ( ) + ( affineToWorldScale * v2T ( diff ) ) ) ;
}
2016-05-24 10:02:05 -04:00
auto & affine = pre ? xform - > m_Affine : xform - > m_Post ;
--User changes
-Add a palette editor.
-Add support for reading .ugr/.gradient/.gradients palette files.
-Allow toggling on spinners whose minimum value is not zero.
-Allow toggling display of image, affines and grid.
-Add new variations: cylinder2, circlesplit, tile_log, truchet_fill, waves2_radial.
--Bug fixes
-cpow2 was wrong.
-Palettes with rapid changes in color would produce slightly different outputs from Apo/Chaotica. This was due to a long standing bug from flam3.
-Use exec() on Apple and show() on all other OSes for dialog boxes.
-Trying to render a sequence with no frames would crash.
-Selecting multiple xforms and rotating them would produce the wrong rotation.
-Better handling when parsing flames using different encoding, such as unicode and UTF-8.
-Switching between SP/DP didn't reselect the selected flame in the Library tab.
--Code changes
-Make all types concerning palettes be floats, including PaletteTableWidgetItem.
-PaletteTableWidgetItem is no longer templated because all palettes are float.
-Include the source colors for user created gradients.
-Change parallel_for() calls to work with very old versions of TBB which are lingering on some systems.
-Split conditional out of accumulation loop on the CPU for better performance.
-Vectorize summing when doing density filter for better performance.
-Make all usage of palettes be of type float, double is pointless.
-Allow palettes to reside in multiple folders, while ensuring only one of each name is added.
-Refactor some palette path searching code.
-Make ReadFile() throw and catch an exception if the file operation fails.
-A little extra safety in foci and foci3D with a call to Zeps().
-Cast to (real_t) in the OpenCL string for the w variation, which was having trouble compiling on Mac.
-Fixing missing comma between paths in InitPaletteList().
-Move Xml and PaletteList classes into cpp to shorten build times when working on them.
-Remove default param values for IterOpenCLKernelCreator<T>::SharedDataIndexDefines in cpp file.
-Change more NULL to nullptr.
2017-02-26 03:02:21 -05:00
if ( xform = = m_FractoriumEmberController - > CurrentXform ( ) )
m_DragHandlePos = v3T ( affine . O ( ) , 0 ) * worldToAffineScale ;
2019-06-21 20:51:20 -04:00
} , eXformUpdate : : UPDATE_SELECTED , false ) ;
2016-02-02 20:51:58 -05:00
}
2014-07-08 03:11:14 -04:00
}
}
/// <summary>
/// Thin wrapper to check if all controllers are ok and return a pointer to the GLController.
/// </summary>
/// <returns>A pointer to the GLController if everything is ok, else false.</returns>
GLEmberControllerBase * GLWidget : : GLController ( )
{
if ( m_Fractorium & & m_Fractorium - > ControllersOk ( ) )
return m_Fractorium - > m_Controller - > GLController ( ) ;
2015-01-02 18:11:36 -05:00
return nullptr ;
2014-07-08 03:11:14 -04:00
}
2014-12-11 00:50:15 -05:00
template class GLEmberController < float > ;
# ifdef DO_DOUBLE
--User changes
-Add a palette editor.
-Add support for reading .ugr/.gradient/.gradients palette files.
-Allow toggling on spinners whose minimum value is not zero.
-Allow toggling display of image, affines and grid.
-Add new variations: cylinder2, circlesplit, tile_log, truchet_fill, waves2_radial.
--Bug fixes
-cpow2 was wrong.
-Palettes with rapid changes in color would produce slightly different outputs from Apo/Chaotica. This was due to a long standing bug from flam3.
-Use exec() on Apple and show() on all other OSes for dialog boxes.
-Trying to render a sequence with no frames would crash.
-Selecting multiple xforms and rotating them would produce the wrong rotation.
-Better handling when parsing flames using different encoding, such as unicode and UTF-8.
-Switching between SP/DP didn't reselect the selected flame in the Library tab.
--Code changes
-Make all types concerning palettes be floats, including PaletteTableWidgetItem.
-PaletteTableWidgetItem is no longer templated because all palettes are float.
-Include the source colors for user created gradients.
-Change parallel_for() calls to work with very old versions of TBB which are lingering on some systems.
-Split conditional out of accumulation loop on the CPU for better performance.
-Vectorize summing when doing density filter for better performance.
-Make all usage of palettes be of type float, double is pointless.
-Allow palettes to reside in multiple folders, while ensuring only one of each name is added.
-Refactor some palette path searching code.
-Make ReadFile() throw and catch an exception if the file operation fails.
-A little extra safety in foci and foci3D with a call to Zeps().
-Cast to (real_t) in the OpenCL string for the w variation, which was having trouble compiling on Mac.
-Fixing missing comma between paths in InitPaletteList().
-Move Xml and PaletteList classes into cpp to shorten build times when working on them.
-Remove default param values for IterOpenCLKernelCreator<T>::SharedDataIndexDefines in cpp file.
-Change more NULL to nullptr.
2017-02-26 03:02:21 -05:00
template class GLEmberController < double > ;
2014-12-11 00:50:15 -05:00
# endif