From 20d28e80a5c861a9d5f449ea911ab75b4f37ad0d Mon Sep 17 00:00:00 2001 From: Jef Date: Tue, 24 Sep 2024 14:54:57 +0200 Subject: Initial community commit --- Src/Plugins/Visualization/vis_milk2/state.cpp | 1961 +++++++++++++++++++++++++ 1 file changed, 1961 insertions(+) create mode 100644 Src/Plugins/Visualization/vis_milk2/state.cpp (limited to 'Src/Plugins/Visualization/vis_milk2/state.cpp') diff --git a/Src/Plugins/Visualization/vis_milk2/state.cpp b/Src/Plugins/Visualization/vis_milk2/state.cpp new file mode 100644 index 00000000..68b060f3 --- /dev/null +++ b/Src/Plugins/Visualization/vis_milk2/state.cpp @@ -0,0 +1,1961 @@ +/* + 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. +*/ + +#include "api__vis_milk2.h" +#include "state.h" +#include "support.h" +#include "ns-eel2/ns-eel.h" +#include "plugin.h" +#include "utility.h" +#include +#include +#include "resource.h" +#include +#include + +extern CPlugin g_plugin; // declared in main.cpp + +#define FRAND ((rand() % 7381)/7380.0f) + + + +// These are intended to replace GetPrivateProfileInt/FloatString, which are very slow +// for large files (they always start from the top). (really slow - some preset loads +// were taking 90 ms because of these!) +// The trick here is that we assume the file will be ordered correctly. If not - if +// the next line doesn't have the expected token - we rescan from the top. If the line +// is never found, we use the default value, and leave MyGetPos untouched. + +#include "gstring.h" + +typedef std::vector VarNameList; +typedef std::vector IntList; + + +FILE* fLastFilePtr = NULL; +void GetFast_CLEAR() { fLastFilePtr = NULL; } +bool _GetLineByName(FILE* f, const char* szVarName, char* szRet, int nMaxRetChars) +{ + // lines in the file look like this: szVarName=szRet + // OR: szVarName szRet + // the part of the line after the '=' sign (or space) goes into szRet. + // szVarName can't have any spaces in it. + + static int MyLineNum = 0; + static VarNameList line_varName; + static IntList line_value_bytepos; + + if (f != fLastFilePtr) + { + fLastFilePtr = f; + MyLineNum = 0; + line_varName.clear(); + line_value_bytepos.clear(); + + // start from beginning of file + fseek(f, 0, SEEK_SET); + + // scan each line in the file for "szVarName=value" pairs, and store info about them. + #define MAX_VARNAME_LEN 128 + char szThisLineVarName[MAX_VARNAME_LEN]; + while (1) + { + char ch; + int pos = 0; + do + { + ch = fgetc(f); + if (pos < MAX_VARNAME_LEN-3) + szThisLineVarName[pos++] = ch; + } + while ( ch != '\r' && + ch != '\n' && + ch != ' ' && + ch != '=' && + ch != EOF ); + if (ch == EOF) + break; + + if (ch == '=' || ch == ' ') + { + szThisLineVarName[pos-1] = 0; // replace '=' with a null char. + int bytepos = ftell(f); + + //add an entry + line_varName.push_back(szThisLineVarName); + line_value_bytepos.push_back( bytepos ); + + // eat chars up to linefeed or EOF + /* + do + { + ch = fgetc(f); + } + while (ch != '\r' && ch != '\n' && ch != EOF); + */ + fgets(szRet, nMaxRetChars-3, f); // reads chars up til the next linefeed. + } + if (ch == EOF) + break; + + // eat any extra linefeed chars. + do + { + ch = fgetc(f); + } + while ((ch == '\r' || ch == '\n') && ch != EOF); + if (ch == EOF) + break; + + // back up one char + fseek(f, -1, SEEK_CUR); + + // on to next line... + } + } + + // if current line isn't the one, check all the others... + if (MyLineNum < 0 || (size_t)MyLineNum >= line_varName.size() || strcmp(line_varName[MyLineNum].c_str(), szVarName) != 0) + { + int N = line_varName.size(); + int i = 0; + for (i=0; i 0 + m_fModWaveAlphaEnd = 0.95f; // when relative volume hits this level, alpha -> 1 + m_fWaveR = 1.0f; + m_fWaveG = 1.0f; + m_fWaveB = 1.0f; + m_fWaveX = 0.5f; + m_fWaveY = 0.5f; + m_bMaximizeWaveColor = true; + m_fMvX = 12.0f; + m_fMvY = 9.0f; + m_fMvDX = 0.0f; + m_fMvDY = 0.0f; + m_fMvL = 0.9f; + m_fMvR = 1.0f; + m_fMvG = 1.0f; + m_fMvB = 1.0f; + m_fMvA = 1.0f; + + int i = 0; + for (i=0; im_fVideoEchoAlphaOld = s_from->m_fVideoEchoAlpha.eval(-1); + s_to->m_nVideoEchoOrientationOld = s_from->m_nVideoEchoOrientation; + s_to->m_nOldWaveMode = s_from->m_nWaveMode; + + /* + s_to->m_fVideoEchoAlphaOld = s_from->m_fVideoEchoAlpha.eval(-1); + s_to->m_nVideoEchoOrientationOld = s_from->m_nVideoEchoOrientation; + + s_to->m_nOldWaveMode = s_from->m_nWaveMode; + s_to->m_nWaveMode = s_from->m_nWaveMode; + s_to->m_bAdditiveWaves = s_from->m_bAdditiveWaves; + s_to->m_nVideoEchoOrientation = s_from->m_nVideoEchoOrientation; + s_to->m_fWarpAnimSpeed = s_from->m_fWarpAnimSpeed; // would req. 10 phase-matches to blend this one!!! + s_to->m_bWaveDots = s_from->m_bWaveDots; + s_to->m_bWaveThick = s_from->m_bWaveThick; + s_to->m_bModWaveAlphaByVolume = s_from->m_bModWaveAlphaByVolume; + s_to->m_bMaximizeWaveColor = s_from->m_bMaximizeWaveColor; + s_to->m_bTexWrap = s_from->m_bTexWrap; + s_to->m_bDarkenCenter = s_from->m_bDarkenCenter; + s_to->m_bRedBlueStereo = s_from->m_bRedBlueStereo; + s_to->m_bBrighten = s_from->m_bBrighten; + s_to->m_bDarken = s_from->m_bDarken; + s_to->m_bSolarize = s_from->m_bSolarize; + s_to->m_bInvert = s_from->m_bInvert; + s_to->m_fRating = s_from->m_fRating; + */ + + // expr. eval. also copies over immediately (replaces prev.) + m_bBlending = true; + m_fBlendStartTime = fAnimTime; + m_fBlendDuration = fTimespan; + + /* + //for (int e=0; em_szPerFrameExpr); + lstrcpy(s_to->m_szPerFrameExpr, szTemp); + + lstrcpy(szTemp, m_szPerPixelExpr); + lstrcpy(m_szPerPixelExpr, s_to->m_szPerPixelExpr); + lstrcpy(s_to->m_szPerPixelExpr, szTemp); + + lstrcpy(szTemp, m_szPerFrameInit); + lstrcpy(m_szPerFrameInit, s_to->m_szPerFrameInit); + lstrcpy(s_to->m_szPerFrameInit, szTemp); + } + RecompileExpressions(); + s_to->RecompileExpressions(); + + lstrcpy(m_szDesc, s_to->m_szDesc); + //lstrcpy(m_szSection, s_to->m_szSection); + */ + + // CBlendableFloats & SuperValues blend over time + m_fGammaAdj .StartBlendFrom(&s_from->m_fGammaAdj , fAnimTime, fTimespan); + m_fVideoEchoZoom .StartBlendFrom(&s_from->m_fVideoEchoZoom , fAnimTime, fTimespan); + m_fVideoEchoAlpha.StartBlendFrom(&s_from->m_fVideoEchoAlpha, fAnimTime, fTimespan); + m_fDecay .StartBlendFrom(&s_from->m_fDecay , fAnimTime, fTimespan); + m_fWaveAlpha .StartBlendFrom(&s_from->m_fWaveAlpha , fAnimTime, fTimespan); + m_fWaveScale .StartBlendFrom(&s_from->m_fWaveScale , fAnimTime, fTimespan); + m_fWaveSmoothing .StartBlendFrom(&s_from->m_fWaveSmoothing , fAnimTime, fTimespan); + m_fWaveParam .StartBlendFrom(&s_from->m_fWaveParam , fAnimTime, fTimespan); + m_fWarpScale .StartBlendFrom(&s_from->m_fWarpScale , fAnimTime, fTimespan); + m_fZoomExponent .StartBlendFrom(&s_from->m_fZoomExponent , fAnimTime, fTimespan); + m_fShader .StartBlendFrom(&s_from->m_fShader , fAnimTime, fTimespan); + m_fModWaveAlphaStart.StartBlendFrom(&s_from->m_fModWaveAlphaStart, fAnimTime, fTimespan); + m_fModWaveAlphaEnd .StartBlendFrom(&s_from->m_fModWaveAlphaEnd, fAnimTime, fTimespan); + + m_fZoom .StartBlendFrom(&s_from->m_fZoom , fAnimTime, fTimespan); + m_fRot .StartBlendFrom(&s_from->m_fRot , fAnimTime, fTimespan); + m_fRotCX .StartBlendFrom(&s_from->m_fRotCX , fAnimTime, fTimespan); + m_fRotCY .StartBlendFrom(&s_from->m_fRotCY , fAnimTime, fTimespan); + m_fXPush .StartBlendFrom(&s_from->m_fXPush , fAnimTime, fTimespan); + m_fYPush .StartBlendFrom(&s_from->m_fYPush , fAnimTime, fTimespan); + m_fWarpAmount.StartBlendFrom(&s_from->m_fWarpAmount,fAnimTime, fTimespan); + m_fStretchX .StartBlendFrom(&s_from->m_fStretchX , fAnimTime, fTimespan); + m_fStretchY .StartBlendFrom(&s_from->m_fStretchY , fAnimTime, fTimespan); + m_fWaveR .StartBlendFrom(&s_from->m_fWaveR , fAnimTime, fTimespan); + m_fWaveG .StartBlendFrom(&s_from->m_fWaveG , fAnimTime, fTimespan); + m_fWaveB .StartBlendFrom(&s_from->m_fWaveB , fAnimTime, fTimespan); + m_fWaveX .StartBlendFrom(&s_from->m_fWaveX , fAnimTime, fTimespan); + m_fWaveY .StartBlendFrom(&s_from->m_fWaveY , fAnimTime, fTimespan); + m_fOuterBorderSize .StartBlendFrom(&s_from->m_fOuterBorderSize , fAnimTime, fTimespan); + m_fOuterBorderR .StartBlendFrom(&s_from->m_fOuterBorderR , fAnimTime, fTimespan); + m_fOuterBorderG .StartBlendFrom(&s_from->m_fOuterBorderG , fAnimTime, fTimespan); + m_fOuterBorderB .StartBlendFrom(&s_from->m_fOuterBorderB , fAnimTime, fTimespan); + m_fOuterBorderA .StartBlendFrom(&s_from->m_fOuterBorderA , fAnimTime, fTimespan); + m_fInnerBorderSize .StartBlendFrom(&s_from->m_fInnerBorderSize , fAnimTime, fTimespan); + m_fInnerBorderR .StartBlendFrom(&s_from->m_fInnerBorderR , fAnimTime, fTimespan); + m_fInnerBorderG .StartBlendFrom(&s_from->m_fInnerBorderG , fAnimTime, fTimespan); + m_fInnerBorderB .StartBlendFrom(&s_from->m_fInnerBorderB , fAnimTime, fTimespan); + m_fInnerBorderA .StartBlendFrom(&s_from->m_fInnerBorderA , fAnimTime, fTimespan); + m_fMvX .StartBlendFrom(&s_from->m_fMvX , fAnimTime, fTimespan); + m_fMvY .StartBlendFrom(&s_from->m_fMvY , fAnimTime, fTimespan); + m_fMvDX .StartBlendFrom(&s_from->m_fMvDX , fAnimTime, fTimespan); + m_fMvDY .StartBlendFrom(&s_from->m_fMvDY , fAnimTime, fTimespan); + m_fMvL .StartBlendFrom(&s_from->m_fMvL , fAnimTime, fTimespan); + m_fMvR .StartBlendFrom(&s_from->m_fMvR , fAnimTime, fTimespan); + m_fMvG .StartBlendFrom(&s_from->m_fMvG , fAnimTime, fTimespan); + m_fMvB .StartBlendFrom(&s_from->m_fMvB , fAnimTime, fTimespan); + m_fMvA .StartBlendFrom(&s_from->m_fMvA , fAnimTime, fTimespan); + m_fBlur1Min .StartBlendFrom(&s_from->m_fBlur1Min , fAnimTime, fTimespan); + m_fBlur2Min .StartBlendFrom(&s_from->m_fBlur2Min , fAnimTime, fTimespan); + m_fBlur3Min .StartBlendFrom(&s_from->m_fBlur3Min , fAnimTime, fTimespan); + m_fBlur1Max .StartBlendFrom(&s_from->m_fBlur1Max , fAnimTime, fTimespan); + m_fBlur2Max .StartBlendFrom(&s_from->m_fBlur2Max , fAnimTime, fTimespan); + m_fBlur3Max .StartBlendFrom(&s_from->m_fBlur3Max , fAnimTime, fTimespan); + m_fBlur1EdgeDarken .StartBlendFrom(&s_from->m_fBlur1EdgeDarken , fAnimTime, fTimespan); + + // if motion vectors were transparent before, don't morph the # in X and Y - just + // start in the right place, and fade them in. + bool bOldStateTransparent = (s_from->m_fMvA.eval(-1) < 0.001f); + bool bNewStateTransparent = (s_to->m_fMvA.eval(-1) < 0.001f); + if (!bOldStateTransparent && bNewStateTransparent) + { + s_from->m_fMvX = s_to->m_fMvX.eval(fAnimTime); + s_from->m_fMvY = s_to->m_fMvY.eval(fAnimTime); + s_from->m_fMvDX = s_to->m_fMvDX.eval(fAnimTime); + s_from->m_fMvDY = s_to->m_fMvDY.eval(fAnimTime); + s_from->m_fMvL = s_to->m_fMvL.eval(fAnimTime); + s_from->m_fMvR = s_to->m_fMvR.eval(fAnimTime); + s_from->m_fMvG = s_to->m_fMvG.eval(fAnimTime); + s_from->m_fMvB = s_to->m_fMvB.eval(fAnimTime); + } + if (bNewStateTransparent && !bOldStateTransparent) + { + s_to->m_fMvX = s_from->m_fMvX.eval(fAnimTime); + s_to->m_fMvY = s_from->m_fMvY.eval(fAnimTime); + s_to->m_fMvDX = s_from->m_fMvDX.eval(fAnimTime); + s_to->m_fMvDY = s_from->m_fMvDY.eval(fAnimTime); + s_to->m_fMvL = s_from->m_fMvL.eval(fAnimTime); + s_to->m_fMvR = s_from->m_fMvR.eval(fAnimTime); + s_to->m_fMvG = s_from->m_fMvG.eval(fAnimTime); + s_to->m_fMvB = s_from->m_fMvB.eval(fAnimTime); + } + +} + +void WriteCode(FILE* fOut, int i, char* pStr, char* prefix, bool bPrependApostrophe = false) +{ + char szLineName[32]; + int line = 1; + int start_pos = 0; + int char_pos = 0; + + while (pStr[start_pos] != 0) + { + while ( pStr[char_pos] != 0 && + pStr[char_pos] != LINEFEED_CONTROL_CHAR) + char_pos++; + + sprintf(szLineName, "%s%d", prefix, line); + + char ch = pStr[char_pos]; + pStr[char_pos] = 0; + //if (!WritePrivateProfileString(szSectionName,szLineName,&pStr[start_pos],szIniFile)) return false; + fprintf(fOut, "%s=%s%s\n", szLineName, bPrependApostrophe ? "`" : "", &pStr[start_pos]); + pStr[char_pos] = ch; + + if (pStr[char_pos] != 0) char_pos++; + start_pos = char_pos; + line++; + } +} + +bool CState::Export(const wchar_t *szIniFile) +{ + FILE *fOut = _wfopen(szIniFile, L"w"); + if (!fOut) return false; + + // IMPORTANT: THESE MUST BE THE FIRST TWO LINES. Otherwise it is assumed to be a MilkDrop 1-era preset. + if (m_nMaxPSVersion > 0) + { + fprintf(fOut, "MILKDROP_PRESET_VERSION=%d\n", CUR_MILKDROP_PRESET_VERSION); + fprintf(fOut, "PSVERSION=%d\n" ,m_nMaxPSVersion); // the max + fprintf(fOut, "PSVERSION_WARP=%d\n",m_nWarpPSVersion); + fprintf(fOut, "PSVERSION_COMP=%d\n",m_nCompPSVersion); + } + + // just for backwards compatibility; MilkDrop 1 can read MilkDrop 2 presets, minus the new features. + // (...this section name allows the GetPrivateProfile*() functions to still work on milkdrop 1) + fprintf(fOut, "[preset00]\n"); + + fprintf(fOut, "%s=%.3f\n", "fRating", m_fRating); + fprintf(fOut, "%s=%.3f\n", "fGammaAdj", m_fGammaAdj.eval(-1)); + fprintf(fOut, "%s=%.3f\n", "fDecay", m_fDecay.eval(-1)); + fprintf(fOut, "%s=%.3f\n", "fVideoEchoZoom", m_fVideoEchoZoom.eval(-1)); + fprintf(fOut, "%s=%.3f\n", "fVideoEchoAlpha", m_fVideoEchoAlpha.eval(-1)); + fprintf(fOut, "%s=%d\n", "nVideoEchoOrientation", m_nVideoEchoOrientation); + + fprintf(fOut, "%s=%d\n", "nWaveMode", m_nWaveMode); + fprintf(fOut, "%s=%d\n", "bAdditiveWaves", m_bAdditiveWaves); + fprintf(fOut, "%s=%d\n", "bWaveDots", m_bWaveDots); + fprintf(fOut, "%s=%d\n", "bWaveThick", m_bWaveThick); + fprintf(fOut, "%s=%d\n", "bModWaveAlphaByVolume", m_bModWaveAlphaByVolume); + fprintf(fOut, "%s=%d\n", "bMaximizeWaveColor", m_bMaximizeWaveColor); + fprintf(fOut, "%s=%d\n", "bTexWrap", m_bTexWrap ); + fprintf(fOut, "%s=%d\n", "bDarkenCenter", m_bDarkenCenter ); + fprintf(fOut, "%s=%d\n", "bRedBlueStereo", m_bRedBlueStereo ); + fprintf(fOut, "%s=%d\n", "bBrighten", m_bBrighten ); + fprintf(fOut, "%s=%d\n", "bDarken", m_bDarken ); + fprintf(fOut, "%s=%d\n", "bSolarize", m_bSolarize ); + fprintf(fOut, "%s=%d\n", "bInvert", m_bInvert ); + + fprintf(fOut, "%s=%.3f\n", "fWaveAlpha", m_fWaveAlpha.eval(-1)); + fprintf(fOut, "%s=%.3f\n", "fWaveScale", m_fWaveScale.eval(-1)); + fprintf(fOut, "%s=%.3f\n", "fWaveSmoothing", m_fWaveSmoothing.eval(-1)); + fprintf(fOut, "%s=%.3f\n", "fWaveParam", m_fWaveParam.eval(-1)); + fprintf(fOut, "%s=%.3f\n", "fModWaveAlphaStart", m_fModWaveAlphaStart.eval(-1)); + fprintf(fOut, "%s=%.3f\n", "fModWaveAlphaEnd", m_fModWaveAlphaEnd.eval(-1)); + fprintf(fOut, "%s=%.3f\n", "fWarpAnimSpeed", m_fWarpAnimSpeed); + fprintf(fOut, "%s=%.3f\n", "fWarpScale", m_fWarpScale.eval(-1)); + fprintf(fOut, "%s=%.5f\n", "fZoomExponent", m_fZoomExponent.eval(-1)); + fprintf(fOut, "%s=%.3f\n", "fShader", m_fShader.eval(-1)); + + fprintf(fOut, "%s=%.5f\n", "zoom", m_fZoom .eval(-1)); + fprintf(fOut, "%s=%.5f\n", "rot", m_fRot .eval(-1)); + fprintf(fOut, "%s=%.3f\n", "cx", m_fRotCX .eval(-1)); + fprintf(fOut, "%s=%.3f\n", "cy", m_fRotCY .eval(-1)); + fprintf(fOut, "%s=%.5f\n", "dx", m_fXPush .eval(-1)); + fprintf(fOut, "%s=%.5f\n", "dy", m_fYPush .eval(-1)); + fprintf(fOut, "%s=%.5f\n", "warp", m_fWarpAmount.eval(-1)); + fprintf(fOut, "%s=%.5f\n", "sx", m_fStretchX .eval(-1)); + fprintf(fOut, "%s=%.5f\n", "sy", m_fStretchY .eval(-1)); + fprintf(fOut, "%s=%.3f\n", "wave_r", m_fWaveR .eval(-1)); + fprintf(fOut, "%s=%.3f\n", "wave_g", m_fWaveG .eval(-1)); + fprintf(fOut, "%s=%.3f\n", "wave_b", m_fWaveB .eval(-1)); + fprintf(fOut, "%s=%.3f\n", "wave_x", m_fWaveX .eval(-1)); + fprintf(fOut, "%s=%.3f\n", "wave_y", m_fWaveY .eval(-1)); + + fprintf(fOut, "%s=%.3f\n", "ob_size", m_fOuterBorderSize.eval(-1)); + fprintf(fOut, "%s=%.3f\n", "ob_r", m_fOuterBorderR.eval(-1)); + fprintf(fOut, "%s=%.3f\n", "ob_g", m_fOuterBorderG.eval(-1)); + fprintf(fOut, "%s=%.3f\n", "ob_b", m_fOuterBorderB.eval(-1)); + fprintf(fOut, "%s=%.3f\n", "ob_a", m_fOuterBorderA.eval(-1)); + fprintf(fOut, "%s=%.3f\n", "ib_size", m_fInnerBorderSize.eval(-1)); + fprintf(fOut, "%s=%.3f\n", "ib_r", m_fInnerBorderR.eval(-1)); + fprintf(fOut, "%s=%.3f\n", "ib_g", m_fInnerBorderG.eval(-1)); + fprintf(fOut, "%s=%.3f\n", "ib_b", m_fInnerBorderB.eval(-1)); + fprintf(fOut, "%s=%.3f\n", "ib_a", m_fInnerBorderA.eval(-1)); + fprintf(fOut, "%s=%.3f\n", "nMotionVectorsX", m_fMvX.eval(-1)); + fprintf(fOut, "%s=%.3f\n", "nMotionVectorsY", m_fMvY.eval(-1)); + fprintf(fOut, "%s=%.3f\n", "mv_dx", m_fMvDX.eval(-1)); + fprintf(fOut, "%s=%.3f\n", "mv_dy", m_fMvDY.eval(-1)); + fprintf(fOut, "%s=%.3f\n", "mv_l", m_fMvL.eval(-1)); + fprintf(fOut, "%s=%.3f\n", "mv_r", m_fMvR.eval(-1)); + fprintf(fOut, "%s=%.3f\n", "mv_g", m_fMvG.eval(-1)); + fprintf(fOut, "%s=%.3f\n", "mv_b", m_fMvB.eval(-1)); + fprintf(fOut, "%s=%.3f\n", "mv_a", m_fMvA.eval(-1)); + fprintf(fOut, "%s=%.3f\n", "b1n", m_fBlur1Min.eval(-1)); + fprintf(fOut, "%s=%.3f\n", "b2n", m_fBlur2Min.eval(-1)); + fprintf(fOut, "%s=%.3f\n", "b3n", m_fBlur3Min.eval(-1)); + fprintf(fOut, "%s=%.3f\n", "b1x", m_fBlur1Max.eval(-1)); + fprintf(fOut, "%s=%.3f\n", "b2x", m_fBlur2Max.eval(-1)); + fprintf(fOut, "%s=%.3f\n", "b3x", m_fBlur3Max.eval(-1)); + fprintf(fOut, "%s=%.3f\n", "b1ed", m_fBlur1EdgeDarken.eval(-1)); + + int i = 0; + for (i=0; i= MD2_PS_2_0) + WriteCode(fOut, i, m_szWarpShadersText, "warp_", true); + if (m_nCompPSVersion >= MD2_PS_2_0) + WriteCode(fOut, i, m_szCompShadersText, "comp_", true); + + fclose(fOut); + + return true; +} + +int CWave::Export(FILE* fOut, const wchar_t *szFile, int i) +{ + FILE* f2 = fOut; + if (!fOut) + { + f2 = _wfopen(szFile, L"w"); + if (!f2) return 0; + } + + fprintf(f2, "wavecode_%d_%s=%d\n", i, "enabled", enabled); + fprintf(f2, "wavecode_%d_%s=%d\n", i, "samples", samples); + fprintf(f2, "wavecode_%d_%s=%d\n", i, "sep", sep ); + fprintf(f2, "wavecode_%d_%s=%d\n", i, "bSpectrum", bSpectrum); + fprintf(f2, "wavecode_%d_%s=%d\n", i, "bUseDots", bUseDots); + fprintf(f2, "wavecode_%d_%s=%d\n", i, "bDrawThick", bDrawThick); + fprintf(f2, "wavecode_%d_%s=%d\n", i, "bAdditive", bAdditive); + fprintf(f2, "wavecode_%d_%s=%.5f\n", i, "scaling", scaling); + fprintf(f2, "wavecode_%d_%s=%.5f\n", i, "smoothing", smoothing); + fprintf(f2, "wavecode_%d_%s=%.3f\n", i, "r", r); + fprintf(f2, "wavecode_%d_%s=%.3f\n", i, "g", g); + fprintf(f2, "wavecode_%d_%s=%.3f\n", i, "b", b); + fprintf(f2, "wavecode_%d_%s=%.3f\n", i, "a", a); + + // READ THE CODE IN + char prefix[64]; + sprintf(prefix, "wave_%d_init", i); WriteCode(f2, i, m_szInit, prefix); + sprintf(prefix, "wave_%d_per_frame", i); WriteCode(f2, i, m_szPerFrame, prefix); + sprintf(prefix, "wave_%d_per_point", i); WriteCode(f2, i, m_szPerPoint, prefix); + + if (!fOut) + fclose(f2); // [sic] + + return 1; +} + +int CShape::Export(FILE* fOut, const wchar_t *szFile, int i) +{ + FILE* f2 = fOut; + if (!fOut) + { + f2 = _wfopen(szFile, L"w"); + if (!f2) return 0; + //fprintf(f2, "[%s]\n", szSection); + } + + fprintf(f2, "shapecode_%d_%s=%d\n", i, "enabled", enabled); + fprintf(f2, "shapecode_%d_%s=%d\n", i, "sides", sides); + fprintf(f2, "shapecode_%d_%s=%d\n", i, "additive", additive); + fprintf(f2, "shapecode_%d_%s=%d\n", i, "thickOutline",thickOutline); + fprintf(f2, "shapecode_%d_%s=%d\n", i, "textured", textured); + fprintf(f2, "shapecode_%d_%s=%d\n", i, "num_inst", instances); + fprintf(f2, "shapecode_%d_%s=%.3f\n", i, "x", x); + fprintf(f2, "shapecode_%d_%s=%.3f\n", i, "y", y); + fprintf(f2, "shapecode_%d_%s=%.5f\n", i, "rad", rad); + fprintf(f2, "shapecode_%d_%s=%.5f\n", i, "ang", ang); + fprintf(f2, "shapecode_%d_%s=%.5f\n", i, "tex_ang", tex_ang); + fprintf(f2, "shapecode_%d_%s=%.5f\n", i, "tex_zoom", tex_zoom); + fprintf(f2, "shapecode_%d_%s=%.3f\n", i, "r", r); + fprintf(f2, "shapecode_%d_%s=%.3f\n", i, "g", g); + fprintf(f2, "shapecode_%d_%s=%.3f\n", i, "b", b); + fprintf(f2, "shapecode_%d_%s=%.3f\n", i, "a", a); + fprintf(f2, "shapecode_%d_%s=%.3f\n", i, "r2", r2); + fprintf(f2, "shapecode_%d_%s=%.3f\n", i, "g2", g2); + fprintf(f2, "shapecode_%d_%s=%.3f\n", i, "b2", b2); + fprintf(f2, "shapecode_%d_%s=%.3f\n", i, "a2", a2); + fprintf(f2, "shapecode_%d_%s=%.3f\n", i, "border_r", border_r); + fprintf(f2, "shapecode_%d_%s=%.3f\n", i, "border_g", border_g); + fprintf(f2, "shapecode_%d_%s=%.3f\n", i, "border_b", border_b); + fprintf(f2, "shapecode_%d_%s=%.3f\n", i, "border_a", border_a); + + char prefix[64]; + sprintf(prefix, "shape_%d_init", i); WriteCode(f2, i, m_szInit, prefix); + sprintf(prefix, "shape_%d_per_frame", i); WriteCode(f2, i, m_szPerFrame, prefix); + //sprintf(prefix, "shape_%d_per_point", i); WriteCode(f2, i, m_szPerPoint, prefix); + + if (!fOut) + fclose(f2); // [sic] + + return 1; +} + +void ReadCode(FILE* f, char* pStr, char* prefix) +{ + if (!pStr) + return; + pStr[0] = 0; + + // read in & compile arbitrary expressions + char szLineName[32]; + char szLine[MAX_BIGSTRING_LEN]; + int len; + + int line = 1; + int char_pos = 0; + bool bDone = false; + + while (!bDone) + { + sprintf(szLineName, "%s%d", prefix, line); + + GetFastString(szLineName, "~!@#$", szLine, MAX_BIGSTRING_LEN, f); // fixme + len = strlen(szLine); + + if ((strcmp(szLine, "~!@#$")==0) || // if the key was missing, + (len >= MAX_BIGSTRING_LEN-1-char_pos-1)) // or if we're out of space + { + bDone = true; + } + else + { + sprintf(&pStr[char_pos], "%s%c", (szLine[0]=='`') ? &szLine[1] : szLine, LINEFEED_CONTROL_CHAR); + if (szLine[0] == '`') + len--; + } + + char_pos += len + 1; + line++; + } + pStr[char_pos++] = 0; // null-terminate + + // read in & compile arbitrary expressions + /* + int n2 = 3 + MAX_CUSTOM_WAVES*3 + MAX_CUSTOM_SHAPES*2; + for (int n=0; n= MAX_BIGSTRING_LEN-1-char_pos-1)) // or if we're out of space + { + bDone = true; + } + else + { + sprintf(&pStr[char_pos], "%s%c", szLine, LINEFEED_CONTROL_CHAR); + } + + char_pos += len + 1; + line++; + } + pStr[char_pos++] = 0; // null-terminate + } + */ +} + +int CWave::Import(FILE* f, const wchar_t* szFile, int i) +{ + FILE* f2 = f; + if (!f) + { + f2 = _wfopen(szFile, L"rb"); + if (!f2) return 0; + GetFast_CLEAR(); + } + + char buf[64]; + sprintf(buf, "wavecode_%d_%s", i, "enabled" ); enabled = GetFastInt (buf, enabled , f2); + sprintf(buf, "wavecode_%d_%s", i, "samples" ); samples = GetFastInt (buf, samples , f2); + sprintf(buf, "wavecode_%d_%s", i, "sep" ); sep = GetFastInt (buf, sep , f2); + sprintf(buf, "wavecode_%d_%s", i, "bSpectrum" ); bSpectrum = GetFastInt (buf, bSpectrum , f2); + sprintf(buf, "wavecode_%d_%s", i, "bUseDots" ); bUseDots = GetFastInt (buf, bUseDots , f2); + sprintf(buf, "wavecode_%d_%s", i, "bDrawThick"); bDrawThick = GetFastInt (buf, bDrawThick, f2); + sprintf(buf, "wavecode_%d_%s", i, "bAdditive" ); bAdditive = GetFastInt (buf, bAdditive , f2); + sprintf(buf, "wavecode_%d_%s", i, "scaling" ); scaling = GetFastFloat(buf, scaling , f2); + sprintf(buf, "wavecode_%d_%s", i, "smoothing" ); smoothing = GetFastFloat(buf, smoothing , f2); + sprintf(buf, "wavecode_%d_%s", i, "r" ); r = GetFastFloat(buf, r , f2); + sprintf(buf, "wavecode_%d_%s", i, "g" ); g = GetFastFloat(buf, g , f2); + sprintf(buf, "wavecode_%d_%s", i, "b" ); b = GetFastFloat(buf, b , f2); + sprintf(buf, "wavecode_%d_%s", i, "a" ); a = GetFastFloat(buf, a , f2); + + // READ THE CODE IN + char prefix[64]; + sprintf(prefix, "wave_%d_init", i); ReadCode(f2, m_szInit, prefix); + sprintf(prefix, "wave_%d_per_frame", i); ReadCode(f2, m_szPerFrame, prefix); + sprintf(prefix, "wave_%d_per_point", i); ReadCode(f2, m_szPerPoint, prefix); + + if (!f) + fclose(f2); // [sic] + + return 1; +} + +int CShape::Import(FILE* f, const wchar_t* szFile, int i) +{ + FILE* f2 = f; + if (!f) + { + f2 = _wfopen(szFile, L"rb"); + if (!f2) return 0; + GetFast_CLEAR(); + } + + char buf[64]; + sprintf(buf, "shapecode_%d_%s", i, "enabled" ); enabled = GetFastInt (buf, enabled , f2); + sprintf(buf, "shapecode_%d_%s", i, "sides" ); sides = GetFastInt (buf, sides , f2); + sprintf(buf, "shapecode_%d_%s", i, "additive" ); additive = GetFastInt (buf, additive , f2); + sprintf(buf, "shapecode_%d_%s", i, "thickOutline"); thickOutline = GetFastInt (buf, thickOutline, f2); + sprintf(buf, "shapecode_%d_%s", i, "textured" ); textured = GetFastInt (buf, textured , f2); + sprintf(buf, "shapecode_%d_%s", i, "num_inst" ); instances = GetFastInt (buf, instances , f2); + sprintf(buf, "shapecode_%d_%s", i, "x" ); x = GetFastFloat(buf, x , f2); + sprintf(buf, "shapecode_%d_%s", i, "y" ); y = GetFastFloat(buf, y , f2); + sprintf(buf, "shapecode_%d_%s", i, "rad" ); rad = GetFastFloat(buf, rad , f2); + sprintf(buf, "shapecode_%d_%s", i, "ang" ); ang = GetFastFloat(buf, ang , f2); + sprintf(buf, "shapecode_%d_%s", i, "tex_ang" ); tex_ang = GetFastFloat(buf, tex_ang , f2); + sprintf(buf, "shapecode_%d_%s", i, "tex_zoom" ); tex_zoom = GetFastFloat(buf, tex_zoom , f2); + sprintf(buf, "shapecode_%d_%s", i, "r" ); r = GetFastFloat(buf, r , f2); + sprintf(buf, "shapecode_%d_%s", i, "g" ); g = GetFastFloat(buf, g , f2); + sprintf(buf, "shapecode_%d_%s", i, "b" ); b = GetFastFloat(buf, b , f2); + sprintf(buf, "shapecode_%d_%s", i, "a" ); a = GetFastFloat(buf, a , f2); + sprintf(buf, "shapecode_%d_%s", i, "r2" ); r2 = GetFastFloat(buf, r2 , f2); + sprintf(buf, "shapecode_%d_%s", i, "g2" ); g2 = GetFastFloat(buf, g2 , f2); + sprintf(buf, "shapecode_%d_%s", i, "b2" ); b2 = GetFastFloat(buf, b2 , f2); + sprintf(buf, "shapecode_%d_%s", i, "a2" ); a2 = GetFastFloat(buf, a2 , f2); + sprintf(buf, "shapecode_%d_%s", i, "border_r" ); border_r = GetFastFloat(buf, border_r , f2); + sprintf(buf, "shapecode_%d_%s", i, "border_g" ); border_g = GetFastFloat(buf, border_g , f2); + sprintf(buf, "shapecode_%d_%s", i, "border_b" ); border_b = GetFastFloat(buf, border_b , f2); + sprintf(buf, "shapecode_%d_%s", i, "border_a" ); border_a = GetFastFloat(buf, border_a , f2); + + // READ THE CODE IN + char prefix[64]; + sprintf(prefix, "shape_%d_init", i); ReadCode(f2, m_szInit, prefix); + sprintf(prefix, "shape_%d_per_frame", i); ReadCode(f2, m_szPerFrame, prefix); + + if (!f) + fclose(f2); // [sic] + + return 1; +} + +bool CState::Import(const wchar_t *szIniFile, float fTime, CState* pOldState, DWORD ApplyFlags) +{ + // if any ApplyFlags are missing, the settings will be copied from pOldState. =) + + if (!pOldState) + ApplyFlags = STATE_ALL; + + if (ApplyFlags!=STATE_ALL && this != pOldState) + { + assert(pOldState); + // in order to copy the old state, we have to byte copy it. + memcpy(this, pOldState, sizeof(CState)); + // clear all the copied code pointers, WITHOUT actually freeing it (since ptrs were copied) + // so that the Default() call below won't release pOldState's copied pointers. + // [all expressions will be recompiled @ end of this fn, whether we updated them or not] + FreeVarsAndCode(false); + } + + // apply defaults for the stuff we will overwrite. + Default(ApplyFlags);//RandomizePresetVars(); + + GetFast_CLEAR(); + + if ( (ApplyFlags & STATE_GENERAL) && // check for these 3 @ same time, + (ApplyFlags & STATE_MOTION) && // so a preset switch w/ warp/comp lock + (ApplyFlags & STATE_WAVE) // updates the name, but mash-ups don't. + ) + { + m_fPresetStartTime = fTime; + + // extract a description of the preset from the filename + { + // copy get the filename (without the path) + const wchar_t *p = wcsrchr(szIniFile, '\\'); + if (p==NULL) p = szIniFile; + lstrcpyW(m_szDesc, p+1); + + // next remove the extension + RemoveExtension(m_szDesc); + } + } + + FILE* f = _wfopen(szIniFile, L"rb"); + if (!f) + return false; + + int nMilkdropPresetVersion = GetFastInt("MILKDROP_PRESET_VERSION",100,f); + //if (ApplyFlags != STATE_ALL) + // nMilkdropPresetVersion = CUR_MILKDROP_PRESET_VERSION; //if we're mashing up, force it up to now + + + int nWarpPSVersionInFile; + int nCompPSVersionInFile; + if (nMilkdropPresetVersion < 200) { + nWarpPSVersionInFile = 0; + nCompPSVersionInFile = 0; + } + else if (nMilkdropPresetVersion == 200) { + nWarpPSVersionInFile = GetFastInt("PSVERSION", 2, f); + nCompPSVersionInFile = nWarpPSVersionInFile; + } + else { + nWarpPSVersionInFile = GetFastInt("PSVERSION_WARP", 2, f); + nCompPSVersionInFile = GetFastInt("PSVERSION_COMP", 2, f); + } + + // general: + if (ApplyFlags & STATE_GENERAL) + { + m_fRating = GetFastFloat("fRating",m_fRating,f); + m_fDecay = GetFastFloat("fDecay",m_fDecay.eval(-1),f); + m_fGammaAdj = GetFastFloat("fGammaAdj" ,m_fGammaAdj.eval(-1),f); + m_fVideoEchoZoom = GetFastFloat("fVideoEchoZoom",m_fVideoEchoZoom.eval(-1),f); + m_fVideoEchoAlpha = GetFastFloat("fVideoEchoAlpha",m_fVideoEchoAlpha.eval(-1),f); + m_nVideoEchoOrientation = GetFastInt ("nVideoEchoOrientation",m_nVideoEchoOrientation,f); + m_bRedBlueStereo = (GetFastInt ("bRedBlueStereo", m_bRedBlueStereo,f) != 0); + m_bBrighten = (GetFastInt ("bBrighten",m_bBrighten ,f) != 0); + m_bDarken = (GetFastInt ("bDarken" ,m_bDarken ,f) != 0); + m_bSolarize = (GetFastInt ("bSolarize",m_bSolarize ,f) != 0); + m_bInvert = (GetFastInt ("bInvert" ,m_bInvert ,f) != 0); + m_fShader = GetFastFloat("fShader",m_fShader.eval(-1),f); + m_fBlur1Min = GetFastFloat("b1n", m_fBlur1Min.eval(-1),f); + m_fBlur2Min = GetFastFloat("b2n", m_fBlur2Min.eval(-1),f); + m_fBlur3Min = GetFastFloat("b3n", m_fBlur3Min.eval(-1),f); + m_fBlur1Max = GetFastFloat("b1x", m_fBlur1Max.eval(-1),f); + m_fBlur2Max = GetFastFloat("b2x", m_fBlur2Max.eval(-1),f); + m_fBlur3Max = GetFastFloat("b3x", m_fBlur3Max.eval(-1),f); + m_fBlur1EdgeDarken = GetFastFloat("b1ed", m_fBlur1EdgeDarken.eval(-1),f); + } + + // wave: + if (ApplyFlags & STATE_WAVE) + { + m_nWaveMode = GetFastInt ("nWaveMode",m_nWaveMode,f); + m_bAdditiveWaves = (GetFastInt ("bAdditiveWaves",m_bAdditiveWaves,f) != 0); + m_bWaveDots = (GetFastInt ("bWaveDots",m_bWaveDots,f) != 0); + m_bWaveThick = (GetFastInt ("bWaveThick",m_bWaveThick,f) != 0); + m_bModWaveAlphaByVolume = (GetFastInt ("bModWaveAlphaByVolume",m_bModWaveAlphaByVolume,f) != 0); + m_bMaximizeWaveColor = (GetFastInt ("bMaximizeWaveColor" ,m_bMaximizeWaveColor,f) != 0); + m_fWaveAlpha = GetFastFloat("fWaveAlpha",m_fWaveAlpha.eval(-1),f); + m_fWaveScale = GetFastFloat("fWaveScale",m_fWaveScale.eval(-1),f); + m_fWaveSmoothing = GetFastFloat("fWaveSmoothing",m_fWaveSmoothing.eval(-1),f); + m_fWaveParam = GetFastFloat("fWaveParam",m_fWaveParam.eval(-1),f); + m_fModWaveAlphaStart = GetFastFloat("fModWaveAlphaStart",m_fModWaveAlphaStart.eval(-1),f); + m_fModWaveAlphaEnd = GetFastFloat("fModWaveAlphaEnd",m_fModWaveAlphaEnd.eval(-1),f); + m_fWaveR = GetFastFloat("wave_r",m_fRot.eval(-1),f); + m_fWaveG = GetFastFloat("wave_g",m_fRot.eval(-1),f); + m_fWaveB = GetFastFloat("wave_b",m_fRot.eval(-1),f); + m_fWaveX = GetFastFloat("wave_x",m_fRot.eval(-1),f); + m_fWaveY = GetFastFloat("wave_y",m_fRot.eval(-1),f); + m_fMvX = GetFastFloat("nMotionVectorsX", m_fMvX.eval(-1),f); + m_fMvY = GetFastFloat("nMotionVectorsY", m_fMvY.eval(-1),f); + m_fMvDX = GetFastFloat("mv_dx", m_fMvDX.eval(-1),f); + m_fMvDY = GetFastFloat("mv_dy", m_fMvDY.eval(-1),f); + m_fMvL = GetFastFloat("mv_l", m_fMvL.eval(-1),f); + m_fMvR = GetFastFloat("mv_r", m_fMvR.eval(-1),f); + m_fMvG = GetFastFloat("mv_g", m_fMvG.eval(-1),f); + m_fMvB = GetFastFloat("mv_b", m_fMvB.eval(-1),f); + m_fMvA = (GetFastInt ("bMotionVectorsOn",false,f) == 0) ? 0.0f : 1.0f; // for backwards compatibility + m_fMvA = GetFastFloat("mv_a", m_fMvA.eval(-1),f); + + int i = 0; + for (i=0; i0) + g_plugin.GenWarpPShaderText(m_szWarpShadersText, m_fDecay.eval(-1), m_bTexWrap); +} +void CState::GenDefaultCompShader() +{ + if (m_nCompPSVersion>0) + g_plugin.GenCompPShaderText(m_szCompShadersText, m_fGammaAdj.eval(-1), m_fVideoEchoAlpha.eval(-1), m_fVideoEchoZoom.eval(-1), m_nVideoEchoOrientation, m_fShader.eval(-1), m_bBrighten, m_bDarken, m_bSolarize, m_bInvert); +} + +void CState::FreeVarsAndCode(bool bFree) +{ + // free the compiled expressions + if (m_pf_codehandle) + { + if (bFree) + NSEEL_code_free(m_pf_codehandle); + m_pf_codehandle = NULL; + } + if (m_pp_codehandle) + { + if (bFree) + NSEEL_code_free(m_pp_codehandle); + m_pp_codehandle = NULL; + } + + int i = 0; + for (i=0; i= sizeof(src). + + int i2 = 0; + int len = strlen(src); + int bComment = false; + for (int i=0; i m_fBlendStartTime + m_fBlendDuration) || (fTime < m_fBlendStartTime)) + { + m_bBlending = false; + } + + if (!m_bBlending) + { + return val; + } + else + { + float mix = (fTime - m_fBlendStartTime) / m_fBlendDuration; + return (m_fBlendFrom*(1.0f - mix) + val*mix); + } +} + +//-------------------------------------------------------------------------------- + +void CBlendableFloat::StartBlendFrom(CBlendableFloat *f_from, float fAnimTime, float fDuration) +{ + if (fDuration < 0.001f) + return; + + m_fBlendFrom = f_from->eval(fAnimTime); + m_bBlending = true; + m_fBlendStartTime = fAnimTime; + m_fBlendDuration = fDuration; +} \ No newline at end of file -- cgit