aboutsummaryrefslogtreecommitdiff
path: root/Src/Plugins/Visualization/vis_milk2/state.h
diff options
context:
space:
mode:
authorJef <jef@targetspot.com>2024-09-24 08:54:57 -0400
committerJef <jef@targetspot.com>2024-09-24 08:54:57 -0400
commit20d28e80a5c861a9d5f449ea911ab75b4f37ad0d (patch)
tree12f17f78986871dd2cfb0a56e5e93b545c1ae0d0 /Src/Plugins/Visualization/vis_milk2/state.h
parent537bcbc86291b32fc04ae4133ce4d7cac8ebe9a7 (diff)
downloadwinamp-20d28e80a5c861a9d5f449ea911ab75b4f37ad0d.tar.gz
Initial community commit
Diffstat (limited to 'Src/Plugins/Visualization/vis_milk2/state.h')
-rw-r--r--Src/Plugins/Visualization/vis_milk2/state.h448
1 files changed, 448 insertions, 0 deletions
diff --git a/Src/Plugins/Visualization/vis_milk2/state.h b/Src/Plugins/Visualization/vis_milk2/state.h
new file mode 100644
index 00000000..968dd316
--- /dev/null
+++ b/Src/Plugins/Visualization/vis_milk2/state.h
@@ -0,0 +1,448 @@
+/*
+ LICENSE
+ -------
+Copyright 2005-2013 Nullsoft, Inc.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ * Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+ * Neither the name of Nullsoft nor the names of its contributors may be used to
+ endorse or promote products derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
+IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+#ifndef _MILKDROP_STATE_
+#define _MILKDROP_STATE_ 1
+
+#include <memory.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include "gstring.h"
+#include "texmgr.h"
+
+#include <d3dx9math.h> // for D3DXVECTOR3
+
+//#include "evallib/eval.h"
+#include "ns-eel2/ns-eel.h"
+#include "md_defines.h"
+
+// flags for CState::RecompileExpressions():
+#define RECOMPILE_PRESET_CODE 1
+#define RECOMPILE_WAVE_CODE 2
+#define RECOMPILE_SHAPE_CODE 4
+
+#define NUM_Q_VAR 32
+#define NUM_T_VAR 8
+
+#define MAX_BIGSTRING_LEN 32768
+
+class CBlendableFloat
+{
+public:
+ CBlendableFloat();
+ ~CBlendableFloat();
+
+ float operator = (float f) {
+ val = f;
+ m_bBlending = false;
+ return val;
+ };
+ float operator *= (float f) {
+ val *= f;
+ m_bBlending = false;
+ return val;
+ };
+ float operator /= (float f) {
+ val /= f;
+ m_bBlending = false;
+ return val;
+ };
+ float operator -= (float f) {
+ val -= f;
+ m_bBlending = false;
+ return val;
+ };
+ float operator += (float f) {
+ val += f;
+ m_bBlending = false;
+ return val;
+ };
+
+ float eval(float fTime); // call this from animation code. if fTime < 0, it will return unblended 'val'.
+ void StartBlendFrom(CBlendableFloat *f_from, float fAnimTime, float fDuration);
+
+protected:
+ float val;
+ bool m_bBlending;
+ float m_fBlendStartTime;
+ float m_fBlendDuration;
+ float m_fBlendFrom;
+};
+
+class CShape
+{
+public:
+ int Import(FILE* f, const wchar_t* szFile, int i);
+ int Export(FILE* f, const wchar_t* szFile, int i);
+
+ int enabled;
+ int sides;
+ int additive;
+ int thickOutline;
+ int textured;
+ int instances;
+ float x,y,rad,ang;
+ float r,g,b,a;
+ float r2,g2,b2,a2;
+ float border_r,border_g,border_b,border_a;
+ float tex_ang, tex_zoom;
+
+ char m_szInit[MAX_BIGSTRING_LEN]; // note: only executed once -> don't need to save codehandle
+ char m_szPerFrame[MAX_BIGSTRING_LEN];
+ //char m_szPerPoint[MAX_BIGSTRING_LEN];
+ NSEEL_CODEHANDLE m_pf_codehandle;
+ //int m_pp_codehandle;
+
+
+ // for per-frame expression evaluation:
+ NSEEL_VMCTX m_pf_eel;
+ double *var_pf_time, *var_pf_fps;
+ double *var_pf_frame;
+ double *var_pf_progress;
+ //double *var_pf_q1, *var_pf_q2, *var_pf_q3, *var_pf_q4, *var_pf_q5, *var_pf_q6, *var_pf_q7, *var_pf_q8;
+ //double *var_pf_t1, *var_pf_t2, *var_pf_t3, *var_pf_t4, *var_pf_t5, *var_pf_t6, *var_pf_t7, *var_pf_t8;
+ double* var_pf_q[NUM_Q_VAR];
+ double* var_pf_t[NUM_T_VAR];
+ double *var_pf_bass, *var_pf_mid, *var_pf_treb, *var_pf_bass_att, *var_pf_mid_att, *var_pf_treb_att;
+ double *var_pf_r, *var_pf_g, *var_pf_b, *var_pf_a;
+ double *var_pf_r2, *var_pf_g2, *var_pf_b2, *var_pf_a2;
+ double *var_pf_border_r, *var_pf_border_g, *var_pf_border_b, *var_pf_border_a;
+ double *var_pf_x, *var_pf_y, *var_pf_rad, *var_pf_ang;
+ double *var_pf_sides, *var_pf_textured, *var_pf_additive, *var_pf_thick, *var_pf_instances, *var_pf_instance;
+ double *var_pf_tex_zoom, *var_pf_tex_ang;
+
+ // for per-point expression evaluation:
+ /*
+ NSEEL_VMCTX m_pp_eel;
+ double *var_pp_time, *var_pp_fps;
+ double *var_pp_frame;
+ double *var_pp_progress;
+ double *var_pp_q1, *var_pp_q2, *var_pp_q3, *var_pp_q4, *var_pp_q5, *var_pp_q6, *var_pp_q7, *var_pp_q8;
+ double *var_pp_t1, *var_pp_t2, *var_pp_t3, *var_pp_t4, *var_pp_t5, *var_pp_t6, *var_pp_t7, *var_pp_t8;
+ double *var_pp_bass, *var_pp_mid, *var_pp_treb, *var_pp_bass_att, *var_pp_mid_att, *var_pp_treb_att;
+ double *var_pp_r, *var_pp_g, *var_pp_b, *var_pp_a;
+ double *var_pp_r2, *var_pp_g2, *var_pp_b2, *var_pp_a2;
+ double *var_pp_border_r, *var_pp_border_g, *var_pp_border_b, *var_pp_border_a;
+ double *var_pp_x, *var_pp_y, *var_pp_rad, *var_pp_ang, *var_pp_sides;
+ */
+
+ double t_values_after_init_code[NUM_T_VAR];
+};
+
+class CWave
+{
+public:
+ int Import(FILE* f, const wchar_t *szFile, int i);
+ int Export(FILE* f, const wchar_t* szFile, int i);
+
+ int enabled;
+ int samples;
+ int sep;
+ float scaling;
+ float smoothing;
+ float x,y,r,g,b,a;
+ int bSpectrum;
+ int bUseDots;
+ int bDrawThick;
+ int bAdditive;
+
+ char m_szInit[MAX_BIGSTRING_LEN]; // note: only executed once -> don't need to save codehandle
+ char m_szPerFrame[MAX_BIGSTRING_LEN];
+ char m_szPerPoint[MAX_BIGSTRING_LEN];
+ NSEEL_CODEHANDLE m_pf_codehandle;
+ NSEEL_CODEHANDLE m_pp_codehandle;
+
+ // for per-frame expression evaluation:
+ NSEEL_VMCTX m_pf_eel;
+ double *var_pf_time, *var_pf_fps;
+ double *var_pf_frame;
+ double *var_pf_progress;
+ //double *var_pf_q1, *var_pf_q2, *var_pf_q3, *var_pf_q4, *var_pf_q5, *var_pf_q6, *var_pf_q7, *var_pf_q8;
+ //double *var_pf_t1, *var_pf_t2, *var_pf_t3, *var_pf_t4, *var_pf_t5, *var_pf_t6, *var_pf_t7, *var_pf_t8;
+ double* var_pf_q[NUM_Q_VAR];
+ double* var_pf_t[NUM_T_VAR];
+ double *var_pf_bass, *var_pf_mid, *var_pf_treb, *var_pf_bass_att, *var_pf_mid_att, *var_pf_treb_att;
+ double *var_pf_r, *var_pf_g, *var_pf_b, *var_pf_a;
+ double *var_pf_samples;
+
+ // for per-point expression evaluation:
+ NSEEL_VMCTX m_pp_eel;
+ double *var_pp_time, *var_pp_fps;
+ double *var_pp_frame;
+ double *var_pp_progress;
+ //double *var_pp_q1, *var_pp_q2, *var_pp_q3, *var_pp_q4, *var_pp_q5, *var_pp_q6, *var_pp_q7, *var_pp_q8;
+ //double *var_pp_t1, *var_pp_t2, *var_pp_t3, *var_pp_t4, *var_pp_t5, *var_pp_t6, *var_pp_t7, *var_pp_t8;
+ double* var_pp_q[NUM_Q_VAR];
+ double* var_pp_t[NUM_T_VAR];
+ double *var_pp_bass, *var_pp_mid, *var_pp_treb, *var_pp_bass_att, *var_pp_mid_att, *var_pp_treb_att;
+ double *var_pp_sample, *var_pp_value1, *var_pp_value2;
+ double *var_pp_x, *var_pp_y, *var_pp_r, *var_pp_g, *var_pp_b, *var_pp_a;
+
+ double t_values_after_init_code[NUM_T_VAR];
+};
+
+typedef struct
+{
+ int type;
+ int in_var;
+ int out_var;
+ float constant;
+ float min;
+ float max;
+ float in_scale;
+ float amp; // for sine functions
+ float freq; // for sine functions
+ float freq2; // for sine functions
+ float phase; // for sine functions
+ float phase2; // for sine functions
+} td_modifier;
+
+//#define MAX_EVALS 8
+
+#define INVALID_PRESET_DESC L"<no description>" // this should contain invalid filename chars, so there is never a conflict...
+
+#define STATE_GENERAL 1 // and postproc (old presets) or blur, etc. (new presets)
+#define STATE_MOTION 2 // and equations
+#define STATE_WAVE 4 // waves, shapes, motion vectors
+#define STATE_WARP 8
+#define STATE_COMP 16
+#define STATE_ALL (32-1)
+
+#define CUR_MILKDROP_PRESET_VERSION 201
+// 200: milkdrop 2
+// 201: instead of just 1 variable for shader version, it tracks 2 (comp and warp) separately.
+
+class CState
+{
+public:
+ CState();
+ ~CState();
+
+ void Default(DWORD ApplyFlags=STATE_ALL);
+ void Randomize(int nMode);
+ void StartBlendFrom(CState *s_from, float fAnimTime, float fTimespan);
+ bool Import(const wchar_t *szIniFile, float fTime, CState* pOldState, DWORD ApplyFlags=STATE_ALL);
+ bool Export(const wchar_t *szIniFile);
+ void RecompileExpressions(int flags=0xFFFFFFFF, int bReInit=1);
+ void GenDefaultWarpShader();
+ void GenDefaultCompShader();
+
+ wchar_t m_szDesc[512]; // this is just the filename, without a path or extension.
+ //char m_szSection[256];
+
+ int m_nMinPSVersion; // the min of the warp & comp values...
+ int m_nMaxPSVersion; // the max of the warp & comp values...
+ int m_nWarpPSVersion; // 0 = milkdrop 1 era (no PS), 2 = ps_2_0, 3 = ps_3_0
+ int m_nCompPSVersion; // 0 = milkdrop 1 era (no PS), 2 = ps_2_0, 3 = ps_3_0
+ float m_fRating; // 0..5
+ // post-processing:
+ CBlendableFloat m_fGammaAdj; // +0 -> +1.0 (double), +2.0 (triple)...
+ CBlendableFloat m_fVideoEchoZoom;
+ CBlendableFloat m_fVideoEchoAlpha;
+ float m_fVideoEchoAlphaOld;
+ int m_nVideoEchoOrientation;
+ int m_nVideoEchoOrientationOld;
+
+ // fps-dependant:
+ CBlendableFloat m_fDecay; // 1.0 = none, 0.95 = heavy decay
+
+ // other:
+ int m_nWaveMode;
+ int m_nOldWaveMode;
+ bool m_bAdditiveWaves;
+ CBlendableFloat m_fWaveAlpha;
+ CBlendableFloat m_fWaveScale;
+ CBlendableFloat m_fWaveSmoothing;
+ bool m_bWaveDots;
+ bool m_bWaveThick;
+ CBlendableFloat m_fWaveParam; // -1..1; 0 is normal
+ bool m_bModWaveAlphaByVolume;
+ CBlendableFloat m_fModWaveAlphaStart; // when relative volume hits this level, alpha -> 0
+ CBlendableFloat m_fModWaveAlphaEnd; // when relative volume hits this level, alpha -> 1
+ float m_fWarpAnimSpeed; // 1.0 = normal, 2.0 = double, 0.5 = half, etc.
+ CBlendableFloat m_fWarpScale;
+ CBlendableFloat m_fZoomExponent;
+ CBlendableFloat m_fShader; // 0 = no color shader, 1 = full color shader
+ bool m_bMaximizeWaveColor;
+ bool m_bTexWrap;
+ bool m_bDarkenCenter;
+ bool m_bRedBlueStereo;
+ bool m_bBrighten;
+ bool m_bDarken;
+ bool m_bSolarize;
+ bool m_bInvert;
+ /*
+ bool m_bPlates;
+ int m_nPlates;
+ CBlendableFloat m_fPlateAlpha; // 0 = off, 0.1 = barely visible, 1.0 = solid
+ CBlendableFloat m_fPlateR;
+ CBlendableFloat m_fPlateG;
+ CBlendableFloat m_fPlateB;
+ CBlendableFloat m_fPlateWidth; // 1.0=normal, 2.0=double, etc.
+ CBlendableFloat m_fPlateLength; // 1.0=normal, 2.0=double, etc.
+ float m_fPlateSpeed; // 1.0=normal, 2.0=double, etc.
+ bool m_bPlatesAdditive;
+ */
+
+ // map controls:
+ CBlendableFloat m_fZoom;
+ CBlendableFloat m_fRot;
+ CBlendableFloat m_fRotCX;
+ CBlendableFloat m_fRotCY;
+ CBlendableFloat m_fXPush;
+ CBlendableFloat m_fYPush;
+ CBlendableFloat m_fWarpAmount;
+ CBlendableFloat m_fStretchX;
+ CBlendableFloat m_fStretchY;
+ CBlendableFloat m_fWaveR;
+ CBlendableFloat m_fWaveG;
+ CBlendableFloat m_fWaveB;
+ CBlendableFloat m_fWaveX;
+ CBlendableFloat m_fWaveY;
+ CBlendableFloat m_fOuterBorderSize;
+ CBlendableFloat m_fOuterBorderR;
+ CBlendableFloat m_fOuterBorderG;
+ CBlendableFloat m_fOuterBorderB;
+ CBlendableFloat m_fOuterBorderA;
+ CBlendableFloat m_fInnerBorderSize;
+ CBlendableFloat m_fInnerBorderR;
+ CBlendableFloat m_fInnerBorderG;
+ CBlendableFloat m_fInnerBorderB;
+ CBlendableFloat m_fInnerBorderA;
+ CBlendableFloat m_fMvX;
+ CBlendableFloat m_fMvY;
+ CBlendableFloat m_fMvDX;
+ CBlendableFloat m_fMvDY;
+ CBlendableFloat m_fMvL;
+ CBlendableFloat m_fMvR;
+ CBlendableFloat m_fMvG;
+ CBlendableFloat m_fMvB;
+ CBlendableFloat m_fMvA;
+ CBlendableFloat m_fBlur1Min;
+ CBlendableFloat m_fBlur2Min;
+ CBlendableFloat m_fBlur3Min;
+ CBlendableFloat m_fBlur1Max;
+ CBlendableFloat m_fBlur2Max;
+ CBlendableFloat m_fBlur3Max;
+ CBlendableFloat m_fBlur1EdgeDarken;
+
+ CShape m_shape[MAX_CUSTOM_SHAPES];
+ CWave m_wave[MAX_CUSTOM_WAVES];
+
+ // some random stuff for driving shaders:
+ void RandomizePresetVars();
+ D3DXVECTOR4 m_rand_preset; // 4 random floats (0..1); randomized @ preset load; fed to pixel shaders. --FIXME (blending)
+ D3DXVECTOR3 m_xlate[20];
+ D3DXVECTOR3 m_rot_base[20];
+ D3DXVECTOR3 m_rot_speed[20];
+
+ //COscillator m_waveR;
+ //COscillator m_waveG;
+ //COscillator m_waveB;
+ //COscillator m_wavePosX; // 0 = centered
+ //COscillator m_wavePosY; // 0 = centered
+
+ // for arbitrary function evaluation:
+ NSEEL_CODEHANDLE m_pf_codehandle;
+ NSEEL_CODEHANDLE m_pp_codehandle;
+ char m_szPerFrameInit[MAX_BIGSTRING_LEN];
+ char m_szPerFrameExpr[MAX_BIGSTRING_LEN];
+ char m_szPerPixelExpr[MAX_BIGSTRING_LEN];
+ char m_szWarpShadersText[MAX_BIGSTRING_LEN]; // pixel shader code
+ char m_szCompShadersText[MAX_BIGSTRING_LEN]; // pixel shader code
+ void FreeVarsAndCode(bool bFree = true);
+ void RegisterBuiltInVariables(int flags);
+ void StripLinefeedCharsAndComments(char *src, char *dest);
+
+ bool m_bBlending;
+ float m_fBlendStartTime;
+ float m_fBlendDuration;
+ float m_fBlendProgress; // 0..1; updated every frame based on StartTime and Duration.
+
+ // for once-per-frame expression evaluation: [although, these vars are also shared w/preset init expr eval]
+ NSEEL_VMCTX m_pf_eel;
+ double *var_pf_zoom, *var_pf_zoomexp, *var_pf_rot, *var_pf_warp, *var_pf_cx, *var_pf_cy, *var_pf_dx, *var_pf_dy, *var_pf_sx, *var_pf_sy;
+ double *var_pf_time, *var_pf_fps;
+ double *var_pf_bass, *var_pf_mid, *var_pf_treb, *var_pf_bass_att, *var_pf_mid_att, *var_pf_treb_att;
+ double *var_pf_wave_a, *var_pf_wave_r, *var_pf_wave_g, *var_pf_wave_b, *var_pf_wave_x, *var_pf_wave_y, *var_pf_wave_mystery, *var_pf_wave_mode;
+ double *var_pf_decay;
+ double *var_pf_frame;
+ //double *var_pf_q1, *var_pf_q2, *var_pf_q3, *var_pf_q4, *var_pf_q5, *var_pf_q6, *var_pf_q7, *var_pf_q8;
+ double* var_pf_q[NUM_Q_VAR];
+ double *var_pf_progress;
+ double *var_pf_ob_size, *var_pf_ob_r, *var_pf_ob_g, *var_pf_ob_b, *var_pf_ob_a;
+ double *var_pf_ib_size, *var_pf_ib_r, *var_pf_ib_g, *var_pf_ib_b, *var_pf_ib_a;
+ double *var_pf_mv_x;
+ double *var_pf_mv_y;
+ double *var_pf_mv_dx;
+ double *var_pf_mv_dy;
+ double *var_pf_mv_l;
+ double *var_pf_mv_r;
+ double *var_pf_mv_g;
+ double *var_pf_mv_b;
+ double *var_pf_mv_a;
+ double *var_pf_monitor;
+ double *var_pf_echo_zoom, *var_pf_echo_alpha, *var_pf_echo_orient;
+ // new in v1.04:
+ double *var_pf_wave_usedots, *var_pf_wave_thick, *var_pf_wave_additive, *var_pf_wave_brighten;
+ double *var_pf_darken_center, *var_pf_gamma, *var_pf_wrap;
+ double *var_pf_invert, *var_pf_brighten, *var_pf_darken, *var_pf_solarize;
+ double *var_pf_meshx, *var_pf_meshy;
+ double *var_pf_pixelsx, *var_pf_pixelsy;
+ double *var_pf_aspectx, *var_pf_aspecty;
+ double *var_pf_blur1min;
+ double *var_pf_blur2min;
+ double *var_pf_blur3min;
+ double *var_pf_blur1max;
+ double *var_pf_blur2max;
+ double *var_pf_blur3max;
+ double *var_pf_blur1_edge_darken;
+
+ // for per-vertex expression evaluation:
+ NSEEL_VMCTX m_pv_eel;
+ double *var_pv_zoom, *var_pv_zoomexp, *var_pv_rot, *var_pv_warp, *var_pv_cx, *var_pv_cy, *var_pv_dx, *var_pv_dy, *var_pv_sx, *var_pv_sy;
+ double *var_pv_time, *var_pv_fps;
+ double *var_pv_bass, *var_pv_mid, *var_pv_treb, *var_pv_bass_att, *var_pv_mid_att, *var_pv_treb_att;
+ double *var_pv_x, *var_pv_y, *var_pv_rad, *var_pv_ang;
+ double *var_pv_frame;
+ //double *var_pv_q1, *var_pv_q2, *var_pv_q3, *var_pv_q4, *var_pv_q5, *var_pv_q6, *var_pv_q7, *var_pv_q8;
+ double* var_pv_q[NUM_Q_VAR];
+ double *var_pv_progress;
+ double *var_pv_meshx, *var_pv_meshy;
+ double *var_pv_pixelsx, *var_pv_pixelsy;
+ double *var_pv_aspectx, *var_pv_aspecty;
+
+ double q_values_after_init_code[NUM_Q_VAR];
+ double monitor_after_init_code;
+
+ float GetPresetStartTime() { return m_fPresetStartTime; }
+ float m_fPresetStartTime;
+};
+
+#endif \ No newline at end of file