mirror of
https://github.com/projectM-visualizer/projectm.git
synced 2026-03-01 21:16:01 +00:00
I must apologize to our users. The state of projectM in trunk has been dismal until late. The preset merging code was a mess. A fundamental flaw in the way we were handling Milkdrop preset state was preventing smooth switching from achieving correct behavior. Some confusing trace led me to the culprit, MilkdropPresetFactory. HE would reuse the same PresetOutputs struct for every preset, leading our Pipeline infrastructure astray at every turn. A simple adjustment should suffice. Some extra thought was put into PipelineMerger on top of these corrections. A release is now imminent. Preset Merging is still nascent in this release, but now it is worth looking at.
git-svn-id: https://projectm.svn.sourceforge.net/svnroot/projectm/trunk@1250 6778bc44-b910-0410-a7a0-be141de4315d
This commit is contained in:
@ -17,14 +17,16 @@
|
||||
#include "IdlePreset.hpp"
|
||||
#include "PresetFrameIO.hpp"
|
||||
|
||||
MilkdropPresetFactory::MilkdropPresetFactory(int gx, int gy) {
|
||||
MilkdropPresetFactory::MilkdropPresetFactory(int gx, int gy): _usePresetOutputs(false)
|
||||
{
|
||||
/* Initializes the builtin function database */
|
||||
BuiltinFuncs::init_builtin_func_db();
|
||||
|
||||
/* Initializes all infix operators */
|
||||
Eval::init_infix_ops();
|
||||
|
||||
initializePresetOutputs(gx,gy);
|
||||
_presetOutputs = createPresetOutputs(gx,gy);
|
||||
_presetOutputs2 = createPresetOutputs(gx, gy);
|
||||
}
|
||||
|
||||
MilkdropPresetFactory::~MilkdropPresetFactory() {
|
||||
@ -35,120 +37,129 @@ MilkdropPresetFactory::~MilkdropPresetFactory() {
|
||||
BuiltinFuncs::destroy_builtin_func_db();
|
||||
std::cerr << "[~MilkdropPresetFactory] delete preset out puts" << std::endl;
|
||||
delete(_presetOutputs);
|
||||
delete(_presetOutputs2);
|
||||
std::cerr << "[~MilkdropPresetFactory] done" << std::endl;
|
||||
|
||||
}
|
||||
|
||||
/* Reinitializes the engine variables to a default (conservative and sane) value */
|
||||
void MilkdropPresetFactory::reset()
|
||||
void resetPresetOutputs(PresetOutputs *presetOutputs)
|
||||
{
|
||||
|
||||
_presetOutputs->zoom=1.0;
|
||||
_presetOutputs->zoomexp = 1.0;
|
||||
_presetOutputs->rot= 0.0;
|
||||
_presetOutputs->warp= 0.0;
|
||||
presetOutputs->zoom=1.0;
|
||||
presetOutputs->zoomexp = 1.0;
|
||||
presetOutputs->rot= 0.0;
|
||||
presetOutputs->warp= 0.0;
|
||||
|
||||
_presetOutputs->sx= 1.0;
|
||||
_presetOutputs->sy= 1.0;
|
||||
_presetOutputs->dx= 0.0;
|
||||
_presetOutputs->dy= 0.0;
|
||||
_presetOutputs->cx= 0.5;
|
||||
_presetOutputs->cy= 0.5;
|
||||
presetOutputs->sx= 1.0;
|
||||
presetOutputs->sy= 1.0;
|
||||
presetOutputs->dx= 0.0;
|
||||
presetOutputs->dy= 0.0;
|
||||
presetOutputs->cx= 0.5;
|
||||
presetOutputs->cy= 0.5;
|
||||
|
||||
_presetOutputs->screenDecay=.98;
|
||||
presetOutputs->screenDecay=.98;
|
||||
|
||||
_presetOutputs->wave.r= 1.0;
|
||||
_presetOutputs->wave.g= 0.2;
|
||||
_presetOutputs->wave.b= 0.0;
|
||||
_presetOutputs->wave.x= 0.5;
|
||||
_presetOutputs->wave.y= 0.5;
|
||||
_presetOutputs->wave.mystery= 0.0;
|
||||
presetOutputs->wave.r= 1.0;
|
||||
presetOutputs->wave.g= 0.2;
|
||||
presetOutputs->wave.b= 0.0;
|
||||
presetOutputs->wave.x= 0.5;
|
||||
presetOutputs->wave.y= 0.5;
|
||||
presetOutputs->wave.mystery= 0.0;
|
||||
|
||||
_presetOutputs->border.outer_size= 0.0;
|
||||
_presetOutputs->border.outer_r= 0.0;
|
||||
_presetOutputs->border.outer_g= 0.0;
|
||||
_presetOutputs->border.outer_b= 0.0;
|
||||
_presetOutputs->border.outer_a= 0.0;
|
||||
presetOutputs->border.outer_size= 0.0;
|
||||
presetOutputs->border.outer_r= 0.0;
|
||||
presetOutputs->border.outer_g= 0.0;
|
||||
presetOutputs->border.outer_b= 0.0;
|
||||
presetOutputs->border.outer_a= 0.0;
|
||||
|
||||
_presetOutputs->border.inner_size = 0.0;
|
||||
_presetOutputs->border.inner_r = 0.0;
|
||||
_presetOutputs->border.inner_g = 0.0;
|
||||
_presetOutputs->border.inner_b = 0.0;
|
||||
_presetOutputs->border.inner_a = 0.0;
|
||||
presetOutputs->border.inner_size = 0.0;
|
||||
presetOutputs->border.inner_r = 0.0;
|
||||
presetOutputs->border.inner_g = 0.0;
|
||||
presetOutputs->border.inner_b = 0.0;
|
||||
presetOutputs->border.inner_a = 0.0;
|
||||
|
||||
_presetOutputs->mv.a = 0.0;
|
||||
_presetOutputs->mv.r = 0.0;
|
||||
_presetOutputs->mv.g = 0.0;
|
||||
_presetOutputs->mv.b = 0.0;
|
||||
_presetOutputs->mv.length = 1.0;
|
||||
_presetOutputs->mv.x_num = 16.0;
|
||||
_presetOutputs->mv.y_num = 12.0;
|
||||
_presetOutputs->mv.x_offset = 0.02;
|
||||
_presetOutputs->mv.y_offset = 0.02;
|
||||
presetOutputs->mv.a = 0.0;
|
||||
presetOutputs->mv.r = 0.0;
|
||||
presetOutputs->mv.g = 0.0;
|
||||
presetOutputs->mv.b = 0.0;
|
||||
presetOutputs->mv.length = 1.0;
|
||||
presetOutputs->mv.x_num = 16.0;
|
||||
presetOutputs->mv.y_num = 12.0;
|
||||
presetOutputs->mv.x_offset = 0.02;
|
||||
presetOutputs->mv.y_offset = 0.02;
|
||||
|
||||
|
||||
/* PER_FRAME CONSTANTS END */
|
||||
_presetOutputs->fRating = 0;
|
||||
_presetOutputs->fGammaAdj = 1.0;
|
||||
_presetOutputs->videoEcho.zoom = 1.0;
|
||||
_presetOutputs->videoEcho.a = 0;
|
||||
_presetOutputs->videoEcho.orientation = Normal;
|
||||
/* PER_FRAME CONSTANTS END */
|
||||
presetOutputs->fRating = 0;
|
||||
presetOutputs->fGammaAdj = 1.0;
|
||||
presetOutputs->videoEcho.zoom = 1.0;
|
||||
presetOutputs->videoEcho.a = 0;
|
||||
presetOutputs->videoEcho.orientation = Normal;
|
||||
|
||||
_presetOutputs->wave.additive = false;
|
||||
_presetOutputs->wave.dots = false;
|
||||
_presetOutputs->wave.thick = false;
|
||||
_presetOutputs->wave.modulateAlphaByVolume = 0;
|
||||
_presetOutputs->wave.maximizeColors = 0;
|
||||
_presetOutputs->textureWrap = 0;
|
||||
_presetOutputs->bDarkenCenter = 0;
|
||||
_presetOutputs->bRedBlueStereo = 0;
|
||||
_presetOutputs->bBrighten = 0;
|
||||
_presetOutputs->bDarken = 0;
|
||||
_presetOutputs->bSolarize = 0;
|
||||
_presetOutputs->bInvert = 0;
|
||||
_presetOutputs->bMotionVectorsOn = 1;
|
||||
presetOutputs->wave.additive = false;
|
||||
presetOutputs->wave.dots = false;
|
||||
presetOutputs->wave.thick = false;
|
||||
presetOutputs->wave.modulateAlphaByVolume = 0;
|
||||
presetOutputs->wave.maximizeColors = 0;
|
||||
presetOutputs->textureWrap = 0;
|
||||
presetOutputs->bDarkenCenter = 0;
|
||||
presetOutputs->bRedBlueStereo = 0;
|
||||
presetOutputs->bBrighten = 0;
|
||||
presetOutputs->bDarken = 0;
|
||||
presetOutputs->bSolarize = 0;
|
||||
presetOutputs->bInvert = 0;
|
||||
presetOutputs->bMotionVectorsOn = 1;
|
||||
|
||||
_presetOutputs->wave.a =1.0;
|
||||
_presetOutputs->wave.scale = 1.0;
|
||||
_presetOutputs->wave.smoothing = 0;
|
||||
_presetOutputs->wave.mystery = 0;
|
||||
_presetOutputs->wave.modOpacityEnd = 0;
|
||||
_presetOutputs->wave.modOpacityStart = 0;
|
||||
_presetOutputs->fWarpAnimSpeed = 0;
|
||||
_presetOutputs->fWarpScale = 0;
|
||||
_presetOutputs->fShader = 0;
|
||||
presetOutputs->wave.a =1.0;
|
||||
presetOutputs->wave.scale = 1.0;
|
||||
presetOutputs->wave.smoothing = 0;
|
||||
presetOutputs->wave.mystery = 0;
|
||||
presetOutputs->wave.modOpacityEnd = 0;
|
||||
presetOutputs->wave.modOpacityStart = 0;
|
||||
presetOutputs->fWarpAnimSpeed = 0;
|
||||
presetOutputs->fWarpScale = 0;
|
||||
presetOutputs->fShader = 0;
|
||||
|
||||
/* PER_PIXEL CONSTANT END */
|
||||
/* Q VARIABLES START */
|
||||
/* PER_PIXEL CONSTANT END */
|
||||
/* Q VARIABLES START */
|
||||
|
||||
for (int i = 0;i< 32;i++)
|
||||
_presetOutputs->q[i] = 0;
|
||||
for (int i = 0;i< 32;i++)
|
||||
presetOutputs->q[i] = 0;
|
||||
|
||||
/* Q VARIABLES END */
|
||||
/* Q VARIABLES END */
|
||||
|
||||
}
|
||||
|
||||
void MilkdropPresetFactory::initializePresetOutputs(int gx, int gy)
|
||||
|
||||
/* Reinitializes the engine variables to a default (conservative and sane) value */
|
||||
void MilkdropPresetFactory::reset()
|
||||
{
|
||||
resetPresetOutputs(_presetOutputs);
|
||||
resetPresetOutputs(_presetOutputs2);
|
||||
}
|
||||
|
||||
PresetOutputs* MilkdropPresetFactory::createPresetOutputs(int gx, int gy)
|
||||
{
|
||||
|
||||
_presetOutputs = new PresetOutputs();
|
||||
PresetOutputs *presetOutputs = new PresetOutputs();
|
||||
|
||||
_presetOutputs->Initialize(gx,gy);
|
||||
presetOutputs->Initialize(gx,gy);
|
||||
|
||||
/* PER FRAME CONSTANTS BEGIN */
|
||||
_presetOutputs->zoom=1.0;
|
||||
_presetOutputs->zoomexp = 1.0;
|
||||
_presetOutputs->rot= 0.0;
|
||||
_presetOutputs->warp= 0.0;
|
||||
presetOutputs->zoom=1.0;
|
||||
presetOutputs->zoomexp = 1.0;
|
||||
presetOutputs->rot= 0.0;
|
||||
presetOutputs->warp= 0.0;
|
||||
|
||||
_presetOutputs->sx= 1.0;
|
||||
_presetOutputs->sy= 1.0;
|
||||
_presetOutputs->dx= 0.0;
|
||||
_presetOutputs->dy= 0.0;
|
||||
_presetOutputs->cx= 0.5;
|
||||
_presetOutputs->cy= 0.5;
|
||||
presetOutputs->sx= 1.0;
|
||||
presetOutputs->sy= 1.0;
|
||||
presetOutputs->dx= 0.0;
|
||||
presetOutputs->dy= 0.0;
|
||||
presetOutputs->cx= 0.5;
|
||||
presetOutputs->cy= 0.5;
|
||||
|
||||
_presetOutputs->screenDecay=.98;
|
||||
presetOutputs->screenDecay=.98;
|
||||
|
||||
|
||||
//_presetInputs.meshx = 0;
|
||||
@ -156,24 +167,24 @@ void MilkdropPresetFactory::initializePresetOutputs(int gx, int gy)
|
||||
|
||||
|
||||
/* PER_FRAME CONSTANTS END */
|
||||
_presetOutputs->fRating = 0;
|
||||
_presetOutputs->fGammaAdj = 1.0;
|
||||
_presetOutputs->videoEcho.zoom = 1.0;
|
||||
_presetOutputs->videoEcho.a = 0;
|
||||
_presetOutputs->videoEcho.orientation = Normal;
|
||||
presetOutputs->fRating = 0;
|
||||
presetOutputs->fGammaAdj = 1.0;
|
||||
presetOutputs->videoEcho.zoom = 1.0;
|
||||
presetOutputs->videoEcho.a = 0;
|
||||
presetOutputs->videoEcho.orientation = Normal;
|
||||
|
||||
_presetOutputs->textureWrap = 0;
|
||||
_presetOutputs->bDarkenCenter = 0;
|
||||
_presetOutputs->bRedBlueStereo = 0;
|
||||
_presetOutputs->bBrighten = 0;
|
||||
_presetOutputs->bDarken = 0;
|
||||
_presetOutputs->bSolarize = 0;
|
||||
_presetOutputs->bInvert = 0;
|
||||
_presetOutputs->bMotionVectorsOn = 1;
|
||||
presetOutputs->textureWrap = 0;
|
||||
presetOutputs->bDarkenCenter = 0;
|
||||
presetOutputs->bRedBlueStereo = 0;
|
||||
presetOutputs->bBrighten = 0;
|
||||
presetOutputs->bDarken = 0;
|
||||
presetOutputs->bSolarize = 0;
|
||||
presetOutputs->bInvert = 0;
|
||||
presetOutputs->bMotionVectorsOn = 1;
|
||||
|
||||
_presetOutputs->fWarpAnimSpeed = 0;
|
||||
_presetOutputs->fWarpScale = 0;
|
||||
_presetOutputs->fShader = 0;
|
||||
presetOutputs->fWarpAnimSpeed = 0;
|
||||
presetOutputs->fWarpScale = 0;
|
||||
presetOutputs->fShader = 0;
|
||||
|
||||
/* PER_PIXEL CONSTANTS BEGIN */
|
||||
|
||||
@ -182,22 +193,24 @@ void MilkdropPresetFactory::initializePresetOutputs(int gx, int gy)
|
||||
/* Q AND T VARIABLES START */
|
||||
|
||||
for (int i = 0;i<NUM_Q_VARIABLES;i++)
|
||||
_presetOutputs->q[i] = 0;
|
||||
presetOutputs->q[i] = 0;
|
||||
|
||||
|
||||
/* Q AND T VARIABLES END */
|
||||
|
||||
return presetOutputs;
|
||||
}
|
||||
|
||||
|
||||
std::auto_ptr<Preset> MilkdropPresetFactory::allocate(const std::string & url, const std::string & name, const std::string & author) {
|
||||
|
||||
_presetOutputs->customWaves.clear();
|
||||
_presetOutputs->customShapes.clear();
|
||||
PresetOutputs *presetOutputs = _usePresetOutputs ? _presetOutputs : _presetOutputs2;
|
||||
_usePresetOutputs = !_usePresetOutputs;
|
||||
presetOutputs->customWaves.clear();
|
||||
presetOutputs->customShapes.clear();
|
||||
|
||||
std::string path;
|
||||
if (PresetFactory::protocol(url, path) == PresetFactory::IDLE_PRESET_PROTOCOL) {
|
||||
return IdlePresets::allocate(path, *_presetOutputs);
|
||||
return IdlePresets::allocate(path, *presetOutputs);
|
||||
} else
|
||||
return std::auto_ptr<Preset>(new MilkdropPreset(url, name, *_presetOutputs));
|
||||
return std::auto_ptr<Preset>(new MilkdropPreset(url, name, *presetOutputs));
|
||||
}
|
||||
|
||||
@ -1,7 +1,7 @@
|
||||
//
|
||||
// C++ Interface: MilkdropPresetFactory
|
||||
//
|
||||
// Description:
|
||||
// Description:
|
||||
//
|
||||
//
|
||||
// Author: Carmelo Piccione <carmelo.piccione@gmail.com>, (C) 2008
|
||||
@ -21,7 +21,7 @@ class DLLEXPORT PresetInputs;
|
||||
class MilkdropPresetFactory : public PresetFactory {
|
||||
|
||||
public:
|
||||
|
||||
|
||||
MilkdropPresetFactory(int gx, int gy);
|
||||
|
||||
virtual ~MilkdropPresetFactory();
|
||||
@ -32,9 +32,11 @@ public:
|
||||
std::string supportedExtensions() const { return "milk prjm"; }
|
||||
|
||||
private:
|
||||
void initializePresetOutputs(int gx, int gy);
|
||||
static PresetOutputs* createPresetOutputs(int gx, int gy);
|
||||
void reset();
|
||||
PresetOutputs * _presetOutputs;
|
||||
PresetOutputs * _presetOutputs2;
|
||||
bool _usePresetOutputs;
|
||||
//PresetInputs _presetInputs;
|
||||
};
|
||||
|
||||
|
||||
@ -10,26 +10,46 @@ void PipelineMerger::mergePipelines(const Pipeline & a, const Pipeline & b, Pipe
|
||||
out.textureWrap = (ratio < 0.5) ? a.textureWrap : b.textureWrap;
|
||||
|
||||
out.screenDecay = lerp( b.screenDecay, a.screenDecay, ratio);
|
||||
out.drawables.clear();
|
||||
|
||||
out.drawables.clear();
|
||||
out.compositeDrawables.clear();
|
||||
|
||||
for (std::vector<RenderItem*>::const_iterator pos = a.drawables.begin();
|
||||
pos != a.drawables.end(); ++pos)
|
||||
{
|
||||
(*pos)->masterAlpha = invratio;
|
||||
(*pos)->masterAlpha = invratio;
|
||||
out.drawables.push_back(*pos);
|
||||
}
|
||||
|
||||
for (std::vector<RenderItem*>::const_iterator pos = b.drawables.begin();
|
||||
for (std::vector<RenderItem*>::const_iterator pos = b.drawables.begin();
|
||||
pos != b.drawables.end();++pos)
|
||||
{
|
||||
(*pos)->masterAlpha = ratio;
|
||||
(*pos)->masterAlpha = ratio;
|
||||
out.drawables.push_back(*pos);
|
||||
}
|
||||
|
||||
|
||||
if (ratio < 0.5)
|
||||
{
|
||||
for (std::vector<RenderItem*>::const_iterator pos = a.compositeDrawables.begin();
|
||||
pos != a.compositeDrawables.end(); ++pos)
|
||||
{
|
||||
//(*pos)->masterAlpha = invratio;
|
||||
out.compositeDrawables.push_back(*pos);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
for (std::vector<RenderItem*>::const_iterator pos = b.compositeDrawables.begin();
|
||||
pos != b.compositeDrawables.end();++pos)
|
||||
{
|
||||
//(*pos)->masterAlpha = ratio;
|
||||
out.compositeDrawables.push_back(*pos);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
for (RenderItemMatchList::iterator pos = results.matches.begin(); pos != results.matches.end(); ++pos) {
|
||||
|
||||
for (RenderItemMatchList::iterator pos = results.matches.begin(); pos != results.matches.end(); ++pos) {
|
||||
|
||||
RenderItem * itemA = pos->first;
|
||||
RenderItem * itemB = pos->second;
|
||||
|
||||
@ -40,11 +60,11 @@ void PipelineMerger::mergePipelines(const Pipeline & a, const Pipeline & b, Pipe
|
||||
out.drawables.push_back(itemA);
|
||||
itemB->masterAlpha = invratio;
|
||||
out.drawables.push_back(itemB);
|
||||
} else
|
||||
} else
|
||||
out.drawables.push_back(itemC);
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
for (std::vector<RenderItem*>::const_iterator pos = results.unmatchedLeft.begin();
|
||||
pos != results.unmatchedLeft.end(); ++pos)
|
||||
|
||||
@ -4,6 +4,7 @@
|
||||
* Created on: Jun 25, 2008
|
||||
* Author: pete
|
||||
*/
|
||||
#include <iostream>
|
||||
|
||||
#ifdef LINUX
|
||||
#include <GL/gl.h>
|
||||
@ -156,7 +157,6 @@ void MilkdropWaveform::MaximizeColors(RenderContext &context)
|
||||
{
|
||||
glColor4f(r, g, b, temp_a * masterAlpha);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
@ -162,7 +162,9 @@ void Renderer::RenderItems(const Pipeline &pipeline, const PipelineContext &pipe
|
||||
renderContext.beatDetect = beatDetect;
|
||||
|
||||
for (std::vector<RenderItem*>::const_iterator pos = pipeline.drawables.begin(); pos != pipeline.drawables.end(); ++pos)
|
||||
{
|
||||
(*pos)->Draw(renderContext);
|
||||
}
|
||||
}
|
||||
|
||||
void Renderer::FinishPass1()
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@ -250,6 +250,7 @@ public:
|
||||
}
|
||||
void *thread_func(void *vptr_args);
|
||||
PipelineContext & pipelineContext() { return *_pipelineContext; }
|
||||
PipelineContext & pipelineContext2() { return *_pipelineContext2; }
|
||||
|
||||
private:
|
||||
PCM * _pcm;
|
||||
@ -257,6 +258,7 @@ private:
|
||||
BeatDetect * beatDetect;
|
||||
Renderer *renderer;
|
||||
PipelineContext * _pipelineContext;
|
||||
PipelineContext * _pipelineContext2;
|
||||
Settings _settings;
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user