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:
psperl
2009-07-28 04:26:52 +00:00
parent 2b8fd5d365
commit 69feaf00f7
7 changed files with 683 additions and 639 deletions

View File

@ -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));
}

View File

@ -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;
};

View File

@ -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)

View File

@ -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);
}
}

View File

@ -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

View File

@ -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;