mirror of
https://github.com/clementine-player/Clementine
synced 2024-12-24 00:31:36 +01:00
232 lines
6.9 KiB
C++
232 lines
6.9 KiB
C++
|
|
/**
|
|
* projectM -- Milkdrop-esque visualisation SDK
|
|
* Copyright (C)2003-2007 projectM Team
|
|
*
|
|
* This library is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Lesser General Public
|
|
* License as published by the Free Software Foundation; either
|
|
* version 2.1 of the License, or (at your option) any later version.
|
|
*
|
|
* This library is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with this library; if not, write to the Free Software
|
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
* See 'LICENSE.txt' included within this release
|
|
*
|
|
*/
|
|
/**
|
|
* $Id$
|
|
*
|
|
* MilkdropPreset
|
|
*
|
|
* $Log$
|
|
*/
|
|
|
|
#ifndef _MilkdropPreset_HPP
|
|
#define _MilkdropPreset_HPP
|
|
|
|
#include "Common.hpp"
|
|
#include <string>
|
|
#include <cassert>
|
|
#include <map>
|
|
|
|
#define MILKDROP_PRESET_DEBUG 0 /* 0 for no debugging, 1 for normal, 2 for insane */
|
|
|
|
#include "CustomShape.hpp"
|
|
#include "CustomWave.hpp"
|
|
#include "Expr.hpp"
|
|
#include "PerPixelEqn.hpp"
|
|
#include "PerFrameEqn.hpp"
|
|
#include "BuiltinParams.hpp"
|
|
#include "PresetFrameIO.hpp"
|
|
#include "InitCond.hpp"
|
|
#include "Preset.hpp"
|
|
|
|
class CustomWave;
|
|
class CustomShape;
|
|
class InitCond;
|
|
|
|
|
|
class MilkdropPreset : public Preset
|
|
{
|
|
|
|
public:
|
|
|
|
|
|
/// Load a MilkdropPreset by filename with input and output buffers specified.
|
|
/// \param absoluteFilePath the absolute file path of a MilkdropPreset to load from the file system
|
|
/// \param MilkdropPresetName a descriptive name for the MilkdropPreset. Usually just the file name
|
|
/// \param MilkdropPresetInputs a reference to read only projectM engine variables
|
|
/// \param MilkdropPresetOutputs initialized and filled with data parsed from a MilkdropPreset
|
|
MilkdropPreset(const std::string & absoluteFilePath, const std::string & milkdropPresetName, PresetOutputs & presetOutputs);
|
|
|
|
/// Load a MilkdropPreset from an input stream with input and output buffers specified.
|
|
/// \param in an already initialized input stream to read the MilkdropPreset file from
|
|
/// \param MilkdropPresetName a descriptive name for the MilkdropPreset. Usually just the file name
|
|
/// \param MilkdropPresetInputs a reference to read only projectM engine variables
|
|
/// \param MilkdropPresetOutputs initialized and filled with data parsed from a MilkdropPreset
|
|
MilkdropPreset(std::istream & in, const std::string & milkdropPresetName, PresetOutputs & presetOutputs);
|
|
|
|
~MilkdropPreset();
|
|
|
|
/// All "builtin" parameters for this MilkdropPreset. Anything *but* user defined parameters and
|
|
/// custom waves / shapes objects go here.
|
|
/// @bug encapsulate
|
|
BuiltinParams builtinParams;
|
|
|
|
|
|
/// Used by parser to find/create custom waves and shapes. May be refactored
|
|
template <class CustomObject>
|
|
static CustomObject * find_custom_object(int id, std::vector<CustomObject*> & customObjects);
|
|
|
|
|
|
int per_pixel_eqn_string_index;
|
|
int per_frame_eqn_string_index;
|
|
int per_frame_init_eqn_string_index;
|
|
|
|
int per_frame_eqn_count,
|
|
per_frame_init_eqn_count;
|
|
|
|
|
|
/// Used by parser
|
|
/// @bug refactor
|
|
int add_per_pixel_eqn( char *name, GenExpr *gen_expr );
|
|
|
|
/// Accessor method to retrieve the absolute file path of the loaded MilkdropPreset
|
|
/// \returns a file path string
|
|
std::string absoluteFilePath() const
|
|
{
|
|
return _absoluteFilePath;
|
|
}
|
|
|
|
|
|
/// Accessor method for the MilkdropPreset outputs instance associated with this MilkdropPreset
|
|
/// \returns A MilkdropPreset output instance with values computed from most recent evaluateFrame()
|
|
PresetOutputs & presetOutputs() const
|
|
{
|
|
|
|
return _presetOutputs;
|
|
}
|
|
|
|
const PresetInputs & presetInputs() const
|
|
{
|
|
|
|
return _presetInputs;
|
|
}
|
|
|
|
|
|
// @bug encapsulate
|
|
|
|
PresetOutputs::cwave_container customWaves;
|
|
PresetOutputs::cshape_container customShapes;
|
|
|
|
/// @bug encapsulate
|
|
/* Data structures that contain equation and initial condition information */
|
|
std::vector<PerFrameEqn*> per_frame_eqn_tree; /* per frame equations */
|
|
std::map<int, PerPixelEqn*> per_pixel_eqn_tree; /* per pixel equation tree */
|
|
std::map<std::string,InitCond*> per_frame_init_eqn_tree; /* per frame initial equations */
|
|
std::map<std::string,InitCond*> init_cond_tree; /* initial conditions */
|
|
std::map<std::string,Param*> user_param_tree; /* user parameter splay tree */
|
|
|
|
|
|
PresetOutputs & pipeline() { return _presetOutputs; }
|
|
|
|
void Render(const BeatDetect &music, const PipelineContext &context);
|
|
const std::string & name() const;
|
|
const std::string & filename() const { return _filename; }
|
|
private:
|
|
std::string _filename;
|
|
PresetInputs _presetInputs;
|
|
/// Evaluates the MilkdropPreset for a frame given the current values of MilkdropPreset inputs / outputs
|
|
/// All calculated values are stored in the associated MilkdropPreset outputs instance
|
|
void evaluateFrame();
|
|
|
|
// The absolute file path of the MilkdropPreset
|
|
std::string _absoluteFilePath;
|
|
|
|
// The absolute path of the MilkdropPreset
|
|
std::string _absolutePath;
|
|
|
|
void initialize(const std::string & pathname);
|
|
void initialize(std::istream & in);
|
|
|
|
int loadPresetFile(const std::string & pathname);
|
|
|
|
void loadBuiltinParamsUnspecInitConds();
|
|
void loadCustomWaveUnspecInitConds();
|
|
void loadCustomShapeUnspecInitConds();
|
|
|
|
void evalCustomWavePerFrameEquations();
|
|
void evalCustomShapePerFrameEquations();
|
|
void evalPerFrameInitEquations();
|
|
void evalCustomWaveInitConditions();
|
|
void evalCustomShapeInitConditions();
|
|
void evalPerPixelEqns();
|
|
void evalPerFrameEquations();
|
|
void initialize_PerPixelMeshes();
|
|
int readIn(std::istream & fs);
|
|
|
|
void preloadInitialize();
|
|
void postloadInitialize();
|
|
|
|
PresetOutputs & _presetOutputs;
|
|
|
|
template <class CustomObject>
|
|
void transfer_q_variables(std::vector<CustomObject*> & customObjects);
|
|
};
|
|
|
|
|
|
template <class CustomObject>
|
|
void MilkdropPreset::transfer_q_variables(std::vector<CustomObject*> & customObjects)
|
|
{
|
|
CustomObject * custom_object;
|
|
|
|
for (typename std::vector<CustomObject*>::iterator pos = customObjects.begin(); pos != customObjects.end();++pos) {
|
|
|
|
custom_object = *pos;
|
|
for (unsigned int i = 0; i < NUM_Q_VARIABLES; i++)
|
|
custom_object->q[i] = _presetOutputs.q[i];
|
|
}
|
|
|
|
|
|
}
|
|
|
|
template <class CustomObject>
|
|
CustomObject * MilkdropPreset::find_custom_object(int id, std::vector<CustomObject*> & customObjects)
|
|
{
|
|
|
|
CustomObject * custom_object = NULL;
|
|
|
|
|
|
for (typename std::vector<CustomObject*>::iterator pos = customObjects.begin(); pos != customObjects.end();++pos) {
|
|
if ((*pos)->id == id) {
|
|
custom_object = *pos;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (custom_object == NULL)
|
|
{
|
|
|
|
if ((custom_object = new CustomObject(id)) == NULL)
|
|
{
|
|
return NULL;
|
|
}
|
|
|
|
customObjects.push_back(custom_object);
|
|
|
|
}
|
|
|
|
assert(custom_object);
|
|
return custom_object;
|
|
}
|
|
|
|
|
|
|
|
#endif /** !_MilkdropPreset_HPP */
|