implement .gpla animation

pull/241/head
DJLevel3 2024-04-15 13:54:25 -06:00 zatwierdzone przez James H Ball
rodzic 0615a46c5d
commit d23216ac51
12 zmienionych plików z 477 dodań i 137 usunięć

Wyświetl plik

@ -0,0 +1,45 @@
#include "LineArtComponent.h"
#include "PluginEditor.h"
LineArtComponent::LineArtComponent(OscirenderAudioProcessor& p, OscirenderAudioProcessorEditor& editor) : audioProcessor(p), pluginEditor(editor) {
setText("Line Art Settings");
addAndMakeVisible(animate);
addAndMakeVisible(sync);
addAndMakeVisible(rate);
rate.setText("10", false);
rate.setInputRestrictions(6, "0123456789.");
update();
auto updateAnimation = [this]() {
audioProcessor.animateLineArt = animate.getToggleState();
audioProcessor.syncMIDIAnimation = sync.getToggleState();
try {
audioProcessor.animationRate = std::stof(rate.getText().toStdString());
}
catch (std::exception e) {
audioProcessor.animationRate = 10.f;
}
audioProcessor.openFile(audioProcessor.currentFile);
};
animate.onClick = updateAnimation;
sync.onClick = updateAnimation;
rate.onFocusLost = updateAnimation;
}
void LineArtComponent::resized() {
auto area = getLocalBounds().withTrimmedTop(20).reduced(20);
double rowHeight = 30;
animate.setBounds(area.removeFromTop(rowHeight));
sync.setBounds(area.removeFromTop(rowHeight));
rate.setBounds(area.removeFromTop(rowHeight));
}
void LineArtComponent::update() {
rate.setText(juce::String(audioProcessor.animationRate));
animate.setToggleState(audioProcessor.animateLineArt, false);
sync.setToggleState(audioProcessor.syncMIDIAnimation, false);
}

Wyświetl plik

@ -0,0 +1,22 @@
#pragma once
#include <JuceHeader.h>
#include "PluginProcessor.h"
class OscirenderAudioProcessorEditor;
class LineArtComponent : public juce::GroupComponent, public juce::MouseListener {
public:
LineArtComponent(OscirenderAudioProcessor&, OscirenderAudioProcessorEditor&);
void resized() override;
void update();
private:
OscirenderAudioProcessor& audioProcessor;
OscirenderAudioProcessorEditor& pluginEditor;
juce::ToggleButton animate{"Animate"};
juce::ToggleButton sync{"MIDI Sync"};
juce::TextEditor rate{"Framerate"};
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(LineArtComponent)
};

Wyświetl plik

@ -10,7 +10,7 @@ MainComponent::MainComponent(OscirenderAudioProcessor& p, OscirenderAudioProcess
fileButton.setButtonText("Choose File(s)");
fileButton.onClick = [this] {
chooser = std::make_unique<juce::FileChooser>("Open", juce::File::getSpecialLocation(juce::File::userHomeDirectory), "*.obj;*.svg;*.lua;*.txt");
chooser = std::make_unique<juce::FileChooser>("Open", juce::File::getSpecialLocation(juce::File::userHomeDirectory), "*.obj;*.svg;*.lua;*.txt;*.gpla");
auto flags = juce::FileBrowserComponent::openMode | juce::FileBrowserComponent::canSelectMultipleItems |
juce::FileBrowserComponent::canSelectFiles;

Wyświetl plik

@ -545,8 +545,34 @@ void OscirenderAudioProcessor::setObjectServerRendering(bool enabled) {
void OscirenderAudioProcessor::processBlock(juce::AudioBuffer<float>& buffer, juce::MidiBuffer& midiMessages) {
juce::ScopedNoDenormals noDenormals;
auto totalNumInputChannels = getTotalNumInputChannels();
auto totalNumOutputChannels = getTotalNumOutputChannels();
// Audio info variables
int totalNumInputChannels = getTotalNumInputChannels();
int totalNumOutputChannels = getTotalNumOutputChannels();
double sampleRate = getSampleRate();
// MIDI transport info variables (defaults to 120bpm, 4/4 time signature at zero seconds and not playing)
double bpm = 120;
double playTimeSeconds = 0;
bool isPlaying = false;
int timeSigNum = 4;
int timeSigDen = 4;
// Get MIDI transport info
playHead = this->getPlayHead();
if (playHead->getCurrentPosition(currentPositionInfo)) {
bpm = currentPositionInfo.bpm;
playTimeSeconds = currentPositionInfo.timeInSeconds;
isPlaying = currentPositionInfo.isPlaying;
timeSigNum = currentPositionInfo.timeSigNumerator;
timeSigDen = currentPositionInfo.timeSigDenominator;
}
// Calculated number of beats
double playTimeBeats = bpm * playTimeSeconds / 60;
// Calculated time per sample in seconds and beats
double sTimeSec = 1.f / sampleRate;
double sTimeBeats = bpm * sTimeSec / 60;
// merge keyboard state and midi messages
keyboardState.processNextMidiBuffer(midiMessages, 0, buffer.getNumSamples(), true);
@ -610,8 +636,20 @@ void OscirenderAudioProcessor::processBlock(juce::AudioBuffer<float>& buffer, ju
midiMessages.clear();
auto* channelData = buffer.getArrayOfWritePointers();
// Update line art animation
if (animateLineArt) {
if (syncMIDIAnimation) animationTime = playTimeBeats;
else animationTime = playTimeSeconds;
if ((currentFile >= 0) ? (sounds[currentFile]->parser->isAnimatable) : false) {
int animFrame = (int)(animationTime * animationRate);
sounds[currentFile]->parser->getLineArt()->setFrame(animFrame);
}
}
for (auto sample = 0; sample < buffer.getNumSamples(); ++sample) {
auto left = 0.0;
auto right = 0.0;
if (totalNumInputChannels >= 2) {
@ -679,6 +717,11 @@ void OscirenderAudioProcessor::processBlock(juce::AudioBuffer<float>& buffer, ju
consumer->notifyIfFull();
}
}
if (isPlaying) {
playTimeSeconds += sTimeSec;
playTimeBeats += sTimeBeats;
}
}
// used for any callback that must guarantee all audio is recieved (e.g. when recording to a file)

Wyświetl plik

@ -198,6 +198,11 @@ public:
IntParameter* voices = new IntParameter("Voices", "voices", VERSION_HINT, 4, 1, 16);
bool animateLineArt = false;
bool syncMIDIAnimation = false;
float animationRate = 10.f;
double animationTime = 0.f;
private:
juce::SpinLock consumerLock;
std::vector<std::shared_ptr<BufferConsumer>> consumers;
@ -279,6 +284,9 @@ private:
const double MIN_LENGTH_INCREMENT = 0.000001;
juce::AudioPlayHead* playHead;
juce::AudioPlayHead::CurrentPositionInfo currentPositionInfo;
//==============================================================================
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (OscirenderAudioProcessor)
};

Wyświetl plik

@ -9,6 +9,7 @@ SettingsComponent::SettingsComponent(OscirenderAudioProcessor& p, OscirenderAudi
addAndMakeVisible(mainResizerBar);
addAndMakeVisible(midi);
addChildComponent(txt);
addChildComponent(gpla);
midiLayout.setItemLayout(0, -0.1, -1.0, -1.0);
midiLayout.setItemLayout(1, pluginEditor.RESIZER_BAR_SIZE, pluginEditor.RESIZER_BAR_SIZE, pluginEditor.RESIZER_BAR_SIZE);
@ -46,6 +47,8 @@ void SettingsComponent::resized() {
if (txt.isVisible()) {
effectSettings = &txt;
} else if (gpla.isVisible()) {
effectSettings = &gpla;
}
auto dummyBounds = dummy.getBounds();
@ -63,17 +66,22 @@ void SettingsComponent::resized() {
void SettingsComponent::fileUpdated(juce::String fileName) {
juce::String extension = fileName.fromLastOccurrenceOf(".", true, false);
txt.setVisible(false);
gpla.setVisible(false);
if (fileName.isEmpty() || audioProcessor.objectServerRendering) {
// do nothing
} if (extension == ".txt") {
} else if (extension == ".txt") {
txt.setVisible(true);
}
else if (extension == ".gpla") {
gpla.setVisible(true);
}
main.updateFileLabel();
resized();
}
void SettingsComponent::update() {
txt.update();
gpla.update();
}
void SettingsComponent::mouseMove(const juce::MouseEvent& event) {

Wyświetl plik

@ -3,6 +3,7 @@
#include <JuceHeader.h>
#include "PluginProcessor.h"
#include "MainComponent.h"
#include "LineArtComponent.h"
#include "LuaComponent.h"
#include "PerspectiveComponent.h"
#include "TxtComponent.h"
@ -27,6 +28,7 @@ private:
MainComponent main{audioProcessor, pluginEditor};
PerspectiveComponent perspective{audioProcessor, pluginEditor};
TxtComponent txt{audioProcessor, pluginEditor};
LineArtComponent gpla{ audioProcessor, pluginEditor };
EffectsComponent effects{audioProcessor, pluginEditor};
MidiComponent midi{audioProcessor, pluginEditor};

Wyświetl plik

@ -0,0 +1,166 @@
#include "LineArtParser.h"
LineArtParser::LineArtParser(juce::String json) {
parseJsonFrames(json);
}
LineArtParser::~LineArtParser() {
frames.clear();
}
void LineArtParser::parseJsonFrames(juce::String jsonStr) {
frames.clear();
numFrames = 0;
// format of json is:
// {
// "frames":[
// "objects": [
// {
// "name": "Line Art",
// "vertices": [
// [
// {
// "x": double value,
// "y": double value,
// "z": double value
// },
// ...
// ],
// ...
// ],
// "matrix": [
// 16 double values
// ]
// }
// ],
// "focalLength": double value
// },
// ...
// ]
// }
auto json = juce::JSON::parse(jsonStr);
auto jsonFrames = *json.getProperty("frames", juce::Array<juce::var>()).getArray();
numFrames = jsonFrames.size();
for (int f = 0; f < numFrames; f++) {
auto objects = *jsonFrames[f].getProperty("objects", juce::Array<juce::var>()).getArray();
std::vector<std::vector<double>> allMatrices;
std::vector<std::vector<std::vector<Point>>> allVertices;
double focalLength = jsonFrames[f].getProperty("focalLength", 1);
for (int i = 0; i < objects.size(); i++) {
auto verticesArray = *objects[i].getProperty("vertices", juce::Array<juce::var>()).getArray();
std::vector<std::vector<Point>> vertices;
for (auto& vertexArrayVar : verticesArray) {
vertices.push_back(std::vector<Point>());
auto& vertexArray = *vertexArrayVar.getArray();
for (auto& vertex : vertexArray) {
double x = vertex.getProperty("x", 0);
double y = vertex.getProperty("y", 0);
double z = vertex.getProperty("z", 0);
vertices[vertices.size() - 1].push_back(Point(x, y, z));
}
}
auto matrix = *objects[i].getProperty("matrix", juce::Array<juce::var>()).getArray();
allMatrices.push_back(std::vector<double>());
for (auto& value : matrix) {
allMatrices[i].push_back(value);
}
std::vector<std::vector<Point>> reorderedVertices;
if (vertices.size() > 0 && matrix.size() == 16) {
std::vector<bool> visited = std::vector<bool>(vertices.size(), false);
std::vector<int> order = std::vector<int>(vertices.size(), 0);
visited[0] = true;
auto endPoint = vertices[0].back();
for (int i = 1; i < vertices.size(); i++) {
int minPath = 0;
double minDistance = 9999999;
for (int j = 0; j < vertices.size(); j++) {
if (!visited[j]) {
auto startPoint = vertices[j][0];
double diffX = endPoint.x - startPoint.x;
double diffY = endPoint.y - startPoint.y;
double diffZ = endPoint.z - startPoint.z;
double distance = std::sqrt(diffX * diffX + diffY * diffY + diffZ * diffZ);
if (distance < minDistance) {
minPath = j;
minDistance = distance;
}
}
}
visited[minPath] = true;
order[i] = minPath;
endPoint = vertices[minPath].back();
}
for (int i = 0; i < vertices.size(); i++) {
std::vector<Point> reorderedVertex;
int index = order[i];
for (int j = 0; j < vertices[index].size(); j++) {
reorderedVertex.push_back(vertices[index][j]);
}
reorderedVertices.push_back(reorderedVertex);
}
}
allVertices.push_back(reorderedVertices);
}
// generate a frame from the vertices and matrix
std::vector<Line> frame;
for (int i = 0; i < objects.size(); i++) {
for (int j = 0; j < allVertices[i].size(); j++) {
for (int k = 0; k < allVertices[i][j].size() - 1; k++) {
auto start = allVertices[i][j][k];
auto end = allVertices[i][j][k + 1];
// multiply the start and end points by the matrix
double rotatedX = start.x * allMatrices[i][0] + start.y * allMatrices[i][1] + start.z * allMatrices[i][2] + allMatrices[i][3];
double rotatedY = start.x * allMatrices[i][4] + start.y * allMatrices[i][5] + start.z * allMatrices[i][6] + allMatrices[i][7];
double rotatedZ = start.x * allMatrices[i][8] + start.y * allMatrices[i][9] + start.z * allMatrices[i][10] + allMatrices[i][11];
double rotatedX2 = end.x * allMatrices[i][0] + end.y * allMatrices[i][1] + end.z * allMatrices[i][2] + allMatrices[i][3];
double rotatedY2 = end.x * allMatrices[i][4] + end.y * allMatrices[i][5] + end.z * allMatrices[i][6] + allMatrices[i][7];
double rotatedZ2 = end.x * allMatrices[i][8] + end.y * allMatrices[i][9] + end.z * allMatrices[i][10] + allMatrices[i][11];
double x = rotatedX * focalLength / rotatedZ;
double y = rotatedY * focalLength / rotatedZ;
double x2 = rotatedX2 * focalLength / rotatedZ2;
double y2 = rotatedY2 * focalLength / rotatedZ2;
frame.push_back(Line(x, y, x2, y2));
}
}
}
frames.push_back(frame);
}
}
void LineArtParser::setFrame(int fNum) {
frameNumber = fNum % numFrames;
}
std::vector<std::unique_ptr<Shape>> LineArtParser::draw() {
std::vector<std::unique_ptr<Shape>> tempShapes;
for (Line shape : frames[frameNumber]) {
tempShapes.push_back(shape.clone());
}
return tempShapes;
}

Wyświetl plik

@ -0,0 +1,21 @@
#pragma once
#include "../shape/Point.h"
#include <JuceHeader.h>
#include "../shape/Shape.h"
#include "../svg/SvgParser.h"
#include "../shape/Line.h"
class LineArtParser {
public:
LineArtParser(juce::String json);
~LineArtParser();
void setFrame(int fNum);
std::vector<std::unique_ptr<Shape>> draw();
private:
void parseJsonFrames(juce::String jsonStr);
int frameNumber = 0;
std::vector<std::vector<Line>> frames;
int numFrames = 0;
};

Wyświetl plik

@ -15,7 +15,9 @@ void FileParser::parse(juce::String fileName, juce::String extension, std::uniqu
object = nullptr;
svg = nullptr;
text = nullptr;
gpla = nullptr;
lua = nullptr;
isAnimatable = false;
if (extension == ".obj") {
object = std::make_shared<WorldObject>(stream->readEntireStreamAsString().toStdString());
@ -25,6 +27,9 @@ void FileParser::parse(juce::String fileName, juce::String extension, std::uniqu
text = std::make_shared<TextParser>(stream->readEntireStreamAsString(), font);
} else if (extension == ".lua") {
lua = std::make_shared<LuaParser>(fileName, stream->readEntireStreamAsString(), errorCallback, fallbackLuaScript);
} else if (extension == ".gpla") {
isAnimatable = true;
gpla = std::make_shared<LineArtParser>(stream->readEntireStreamAsString());
}
sampleSource = lua != nullptr;
@ -39,6 +44,8 @@ std::vector<std::unique_ptr<Shape>> FileParser::nextFrame() {
return svg->draw();
} else if (text != nullptr) {
return text->draw();
} else if (gpla != nullptr) {
return gpla->draw();
}
auto tempShapes = std::vector<std::unique_ptr<Shape>>();
// return a square
@ -98,6 +105,10 @@ std::shared_ptr<TextParser> FileParser::getText() {
return text;
}
std::shared_ptr<LineArtParser> FileParser::getLineArt() {
return gpla;
}
std::shared_ptr<LuaParser> FileParser::getLua() {
return lua;
}

Wyświetl plik

@ -5,13 +5,14 @@
#include "../obj/WorldObject.h"
#include "../svg/SvgParser.h"
#include "../txt/TextParser.h"
#include "../gpla/LineArtParser.h"
#include "../lua/LuaParser.h"
class FileParser {
public:
FileParser(std::function<void(int, juce::String, juce::String)> errorCallback = nullptr);
void parse(juce::String fileName, juce::String extension, std::unique_ptr<juce::InputStream>, juce::Font);
void parse(juce::String fileName, juce::String extension, std::unique_ptr<juce::InputStream> stream, juce::Font font);
std::vector<std::unique_ptr<Shape>> nextFrame();
Point nextSample(lua_State*& L, LuaVariables& vars);
void closeLua(lua_State*& L);
@ -23,8 +24,11 @@ public:
std::shared_ptr<WorldObject> getObject();
std::shared_ptr<SvgParser> getSvg();
std::shared_ptr<TextParser> getText();
std::shared_ptr<LineArtParser> getLineArt();
std::shared_ptr<LuaParser> getLua();
bool isAnimatable = false;
private:
bool active = true;
bool sampleSource = false;
@ -34,6 +38,7 @@ private:
std::shared_ptr<WorldObject> object;
std::shared_ptr<SvgParser> svg;
std::shared_ptr<TextParser> text;
std::shared_ptr<LineArtParser> gpla;
std::shared_ptr<LuaParser> lua;
juce::String fallbackLuaScript = "return { 0.0, 0.0 }";

Wyświetl plik

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<JUCERPROJECT id="HH2E72" name="osci-render" projectType="audioplug" useAppConfig="0"
addUsingNamespaceToJuceHeader="0" displaySplashScreen="0" jucerFormatVersion="1"
addUsingNamespaceToJuceHeader="0" displaySplashScreen="1" jucerFormatVersion="1"
pluginCharacteristicsValue="pluginWantsMidiIn" pluginManufacturer="jameshball"
aaxIdentifier="sh.ball.oscirender" cppLanguageStandard="20" projectLineFeed="&#10;"
headerPath="./include" version="2.1.6" companyName="James H Ball"
@ -39,98 +39,6 @@
</GROUP>
</GROUP>
<GROUP id="{75439074-E50C-362F-1EDF-8B4BE9011259}" name="Source">
<GROUP id="{50F56072-D264-AC8C-EAC9-A073059CDE27}" name="mathter">
<GROUP id="{60CE44FE-26F8-4CE0-3BFF-5475F8E0BD75}" name="Common">
<FILE id="XY4AlJ" name="Approx.hpp" compile="0" resource="0" file="Source/mathter/Common/Approx.hpp"/>
<FILE id="LeuGwE" name="Definitions.hpp" compile="0" resource="0" file="Source/mathter/Common/Definitions.hpp"/>
<FILE id="HcUnQp" name="DeterministicInitializer.hpp" compile="0" resource="0"
file="Source/mathter/Common/DeterministicInitializer.hpp"/>
<FILE id="qvzdH7" name="MathUtil.hpp" compile="0" resource="0" file="Source/mathter/Common/MathUtil.hpp"/>
<FILE id="wy5V3L" name="Range.hpp" compile="0" resource="0" file="Source/mathter/Common/Range.hpp"/>
<FILE id="hsfx9V" name="Traits.hpp" compile="0" resource="0" file="Source/mathter/Common/Traits.hpp"/>
</GROUP>
<GROUP id="{AA5719C4-2684-8629-96C2-ACCCC846741E}" name="Decompositions">
<FILE id="mqUNTZ" name="DecomposeLU.hpp" compile="0" resource="0" file="Source/mathter/Decompositions/DecomposeLU.hpp"/>
<FILE id="bajVyN" name="DecomposeQR.hpp" compile="0" resource="0" file="Source/mathter/Decompositions/DecomposeQR.hpp"/>
<FILE id="LVojfW" name="DecomposeSVD.hpp" compile="0" resource="0"
file="Source/mathter/Decompositions/DecomposeSVD.hpp"/>
</GROUP>
<GROUP id="{5223A16D-BBB0-7277-2DA2-5F83E36AF6D7}" name="Matrix">
<FILE id="NiMdHn" name="MatrixArithmetic.hpp" compile="0" resource="0"
file="Source/mathter/Matrix/MatrixArithmetic.hpp"/>
<FILE id="OG3XE0" name="MatrixCast.hpp" compile="0" resource="0" file="Source/mathter/Matrix/MatrixCast.hpp"/>
<FILE id="hzHEZU" name="MatrixCompare.hpp" compile="0" resource="0"
file="Source/mathter/Matrix/MatrixCompare.hpp"/>
<FILE id="TKewDV" name="MatrixFunction.hpp" compile="0" resource="0"
file="Source/mathter/Matrix/MatrixFunction.hpp"/>
<FILE id="az9Zbs" name="MatrixImpl.hpp" compile="0" resource="0" file="Source/mathter/Matrix/MatrixImpl.hpp"/>
<FILE id="ZApObW" name="MatrixVectorArithmetic.hpp" compile="0" resource="0"
file="Source/mathter/Matrix/MatrixVectorArithmetic.hpp"/>
</GROUP>
<GROUP id="{9ED17B79-C8AF-B25C-1B0D-01C8A868E93B}" name="Quaternion">
<FILE id="Pg5bBV" name="QuaternionArithmetic.hpp" compile="0" resource="0"
file="Source/mathter/Quaternion/QuaternionArithmetic.hpp"/>
<FILE id="Q40Fdf" name="QuaternionCompare.hpp" compile="0" resource="0"
file="Source/mathter/Quaternion/QuaternionCompare.hpp"/>
<FILE id="lnp7Lb" name="QuaternionFunction.hpp" compile="0" resource="0"
file="Source/mathter/Quaternion/QuaternionFunction.hpp"/>
<FILE id="qDNOvo" name="QuaternionImpl.hpp" compile="0" resource="0"
file="Source/mathter/Quaternion/QuaternionImpl.hpp"/>
<FILE id="eXgZ46" name="QuaternionLiterals.hpp" compile="0" resource="0"
file="Source/mathter/Quaternion/QuaternionLiterals.hpp"/>
<FILE id="oMB7Jr" name="QuaternionVectorArithmetic.hpp" compile="0"
resource="0" file="Source/mathter/Quaternion/QuaternionVectorArithmetic.hpp"/>
</GROUP>
<GROUP id="{D82CFD72-F5BE-1024-94AB-5C2503423E4D}" name="Swizzle">
<FILE id="CeOGVV" name="Swizzle_1.inc.hpp" compile="0" resource="0"
file="Source/mathter/Swizzle/Swizzle_1.inc.hpp"/>
<FILE id="jwhhIz" name="Swizzle_2.inc.hpp" compile="0" resource="0"
file="Source/mathter/Swizzle/Swizzle_2.inc.hpp"/>
<FILE id="fPNnzc" name="Swizzle_3.inc.hpp" compile="0" resource="0"
file="Source/mathter/Swizzle/Swizzle_3.inc.hpp"/>
<FILE id="gU43mt" name="Swizzle_4.inc.hpp" compile="0" resource="0"
file="Source/mathter/Swizzle/Swizzle_4.inc.hpp"/>
</GROUP>
<GROUP id="{2F08F8FD-A6D7-6DE3-CAD4-564E35A9F0B9}" name="Transforms">
<FILE id="pltHW9" name="IdentityBuilder.hpp" compile="0" resource="0"
file="Source/mathter/Transforms/IdentityBuilder.hpp"/>
<FILE id="g2kgGu" name="OrthographicBuilder.hpp" compile="0" resource="0"
file="Source/mathter/Transforms/OrthographicBuilder.hpp"/>
<FILE id="DBDXmX" name="PerspectiveBuilder.hpp" compile="0" resource="0"
file="Source/mathter/Transforms/PerspectiveBuilder.hpp"/>
<FILE id="Gj9MnE" name="Rotation2DBuilder.hpp" compile="0" resource="0"
file="Source/mathter/Transforms/Rotation2DBuilder.hpp"/>
<FILE id="Hq0ZLD" name="Rotation3DBuilder.hpp" compile="0" resource="0"
file="Source/mathter/Transforms/Rotation3DBuilder.hpp"/>
<FILE id="An6eDN" name="ScaleBuilder.hpp" compile="0" resource="0"
file="Source/mathter/Transforms/ScaleBuilder.hpp"/>
<FILE id="xzgGHN" name="ShearBuilder.hpp" compile="0" resource="0"
file="Source/mathter/Transforms/ShearBuilder.hpp"/>
<FILE id="OVvc6Z" name="TranslationBuilder.hpp" compile="0" resource="0"
file="Source/mathter/Transforms/TranslationBuilder.hpp"/>
<FILE id="TzGfIt" name="ViewBuilder.hpp" compile="0" resource="0" file="Source/mathter/Transforms/ViewBuilder.hpp"/>
<FILE id="VTTCpk" name="ZeroBuilder.hpp" compile="0" resource="0" file="Source/mathter/Transforms/ZeroBuilder.hpp"/>
</GROUP>
<GROUP id="{BA088AC1-AC2B-B70C-582E-EDF9E38ABC20}" name="Vector">
<FILE id="KDVsvP" name="VectorArithmetic.hpp" compile="0" resource="0"
file="Source/mathter/Vector/VectorArithmetic.hpp"/>
<FILE id="qBpF7X" name="VectorCompare.hpp" compile="0" resource="0"
file="Source/mathter/Vector/VectorCompare.hpp"/>
<FILE id="IinHSU" name="VectorConcat.hpp" compile="0" resource="0"
file="Source/mathter/Vector/VectorConcat.hpp"/>
<FILE id="aVRyP9" name="VectorFunction.hpp" compile="0" resource="0"
file="Source/mathter/Vector/VectorFunction.hpp"/>
<FILE id="af10kl" name="VectorImpl.hpp" compile="0" resource="0" file="Source/mathter/Vector/VectorImpl.hpp"/>
</GROUP>
<FILE id="vOLhwO" name="CMakeLists.txt" compile="0" resource="1" file="Source/mathter/CMakeLists.txt"/>
<FILE id="d4t0xm" name="Geometry.hpp" compile="0" resource="0" file="Source/mathter/Geometry.hpp"/>
<FILE id="AZxH75" name="IoStream.hpp" compile="0" resource="0" file="Source/mathter/IoStream.hpp"/>
<FILE id="ev6gxl" name="Mathter.natvis" compile="0" resource="1" file="Source/mathter/Mathter.natvis"/>
<FILE id="VBewvB" name="Matrix.hpp" compile="0" resource="0" file="Source/mathter/Matrix.hpp"/>
<FILE id="vlSQrm" name="Quaternion.hpp" compile="0" resource="0" file="Source/mathter/Quaternion.hpp"/>
<FILE id="Aos8s3" name="Utility.hpp" compile="0" resource="0" file="Source/mathter/Utility.hpp"/>
<FILE id="T6rqIo" name="Vector.hpp" compile="0" resource="0" file="Source/mathter/Vector.hpp"/>
</GROUP>
<GROUP id="{85A33213-D880-BD92-70D8-1901DA6D23F0}" name="audio">
<FILE id="WDV6eI" name="AudioWebSocketServer.cpp" compile="1" resource="0"
file="Source/audio/AudioWebSocketServer.cpp"/>
@ -254,10 +162,11 @@
<FILE id="WQ2W15" name="BufferConsumer.h" compile="0" resource="0"
file="Source/concurrency/BufferConsumer.h"/>
</GROUP>
<FILE id="I44EdJ" name="EffectsComponent.cpp" compile="1" resource="0"
file="Source/EffectsComponent.cpp"/>
<FILE id="qxxNX3" name="EffectsComponent.h" compile="0" resource="0"
file="Source/EffectsComponent.h"/>
<GROUP id="{A3E24187-62A5-AB8D-8837-14043B89A640}" name="gpla">
<FILE id="KvDV8j" name="LineArtParser.cpp" compile="1" resource="0"
file="Source/gpla/LineArtParser.cpp"/>
<FILE id="t008RG" name="LineArtParser.h" compile="0" resource="0" file="Source/gpla/LineArtParser.h"/>
</GROUP>
<GROUP id="{D0D95F57-3D9D-46D9-C126-25C3C7459AC5}" name="ixwebsocket">
<FILE id="pPOkoj" name="IXBase64.h" compile="0" resource="0" file="Source/ixwebsocket/IXBase64.h"/>
<FILE id="qVI3x2" name="IXBench.cpp" compile="1" resource="0" file="Source/ixwebsocket/IXBench.cpp"/>
@ -356,6 +265,8 @@
<FILE id="ZXs1Pm" name="IXUserAgent.h" compile="0" resource="0" file="Source/ixwebsocket/IXUserAgent.h"/>
<FILE id="GQ7boW" name="IXUtf8Validator.h" compile="0" resource="0"
file="Source/ixwebsocket/IXUtf8Validator.h"/>
<FILE id="NkmVRB" name="IXWebSocketOpenInfo.h" compile="0" resource="0"
file="Source/ixwebsocket/IXWebSocketOpenInfo.h"/>
<FILE id="rnALh0" name="IXUuid.cpp" compile="1" resource="0" file="Source/ixwebsocket/IXUuid.cpp"/>
<FILE id="WcfqnP" name="IXUuid.h" compile="0" resource="0" file="Source/ixwebsocket/IXUuid.h"/>
<FILE id="P6VcmE" name="IXWebSocket.cpp" compile="1" resource="0" file="Source/ixwebsocket/IXWebSocket.cpp"/>
@ -384,8 +295,6 @@
file="Source/ixwebsocket/IXWebSocketMessage.h"/>
<FILE id="Zibknu" name="IXWebSocketMessageType.h" compile="0" resource="0"
file="Source/ixwebsocket/IXWebSocketMessageType.h"/>
<FILE id="NkmVRB" name="IXWebSocketOpenInfo.h" compile="0" resource="0"
file="Source/ixwebsocket/IXWebSocketOpenInfo.h"/>
<FILE id="ulTERZ" name="IXWebSocketPerMessageDeflate.cpp" compile="1"
resource="0" file="Source/ixwebsocket/IXWebSocketPerMessageDeflate.cpp"/>
<FILE id="k27DKW" name="IXWebSocketPerMessageDeflate.h" compile="0"
@ -417,10 +326,6 @@
<FILE id="eAqAle" name="IXWebSocketVersion.h" compile="0" resource="0"
file="Source/ixwebsocket/IXWebSocketVersion.h"/>
</GROUP>
<FILE id="uyOdTl" name="LegacyProject.cpp" compile="1" resource="0"
file="Source/LegacyProject.cpp"/>
<FILE id="d2zFqF" name="LookAndFeel.cpp" compile="1" resource="0" file="Source/LookAndFeel.cpp"/>
<FILE id="TJDqWs" name="LookAndFeel.h" compile="0" resource="0" file="Source/LookAndFeel.h"/>
<GROUP id="{75F6236A-68A5-85DA-EDAE-23D1621601DB}" name="lua">
<FILE id="X5i9iw" name="lapi.c" compile="1" resource="0" file="Source/lua/lapi.c"/>
<FILE id="J62WSE" name="lapi.h" compile="0" resource="0" file="Source/lua/lapi.h"/>
@ -490,16 +395,98 @@
<FILE id="vYPcZP" name="lzio.h" compile="0" resource="0" file="Source/lua/lzio.h"/>
<FILE id="ktpcF1" name="onelua.c" compile="1" resource="0" file="Source/lua/onelua.c"/>
</GROUP>
<FILE id="X26RjJ" name="LuaComponent.cpp" compile="1" resource="0"
file="Source/LuaComponent.cpp"/>
<FILE id="g5xRHT" name="LuaComponent.h" compile="0" resource="0" file="Source/LuaComponent.h"/>
<FILE id="GKBQ8j" name="MainComponent.cpp" compile="1" resource="0"
file="Source/MainComponent.cpp"/>
<FILE id="RU8fGr" name="MainComponent.h" compile="0" resource="0" file="Source/MainComponent.h"/>
<FILE id="cFVaxu" name="MathUtil.h" compile="0" resource="0" file="Source/MathUtil.h"/>
<FILE id="eB92KJ" name="MidiComponent.cpp" compile="1" resource="0"
file="Source/MidiComponent.cpp"/>
<FILE id="GJqoJa" name="MidiComponent.h" compile="0" resource="0" file="Source/MidiComponent.h"/>
<GROUP id="{50F56072-D264-AC8C-EAC9-A073059CDE27}" name="mathter">
<GROUP id="{60CE44FE-26F8-4CE0-3BFF-5475F8E0BD75}" name="Common">
<FILE id="XY4AlJ" name="Approx.hpp" compile="0" resource="0" file="Source/mathter/Common/Approx.hpp"/>
<FILE id="LeuGwE" name="Definitions.hpp" compile="0" resource="0" file="Source/mathter/Common/Definitions.hpp"/>
<FILE id="HcUnQp" name="DeterministicInitializer.hpp" compile="0" resource="0"
file="Source/mathter/Common/DeterministicInitializer.hpp"/>
<FILE id="qvzdH7" name="MathUtil.hpp" compile="0" resource="0" file="Source/mathter/Common/MathUtil.hpp"/>
<FILE id="wy5V3L" name="Range.hpp" compile="0" resource="0" file="Source/mathter/Common/Range.hpp"/>
<FILE id="hsfx9V" name="Traits.hpp" compile="0" resource="0" file="Source/mathter/Common/Traits.hpp"/>
</GROUP>
<GROUP id="{AA5719C4-2684-8629-96C2-ACCCC846741E}" name="Decompositions">
<FILE id="mqUNTZ" name="DecomposeLU.hpp" compile="0" resource="0" file="Source/mathter/Decompositions/DecomposeLU.hpp"/>
<FILE id="bajVyN" name="DecomposeQR.hpp" compile="0" resource="0" file="Source/mathter/Decompositions/DecomposeQR.hpp"/>
<FILE id="LVojfW" name="DecomposeSVD.hpp" compile="0" resource="0"
file="Source/mathter/Decompositions/DecomposeSVD.hpp"/>
</GROUP>
<GROUP id="{5223A16D-BBB0-7277-2DA2-5F83E36AF6D7}" name="Matrix">
<FILE id="NiMdHn" name="MatrixArithmetic.hpp" compile="0" resource="0"
file="Source/mathter/Matrix/MatrixArithmetic.hpp"/>
<FILE id="OG3XE0" name="MatrixCast.hpp" compile="0" resource="0" file="Source/mathter/Matrix/MatrixCast.hpp"/>
<FILE id="hzHEZU" name="MatrixCompare.hpp" compile="0" resource="0"
file="Source/mathter/Matrix/MatrixCompare.hpp"/>
<FILE id="TKewDV" name="MatrixFunction.hpp" compile="0" resource="0"
file="Source/mathter/Matrix/MatrixFunction.hpp"/>
<FILE id="az9Zbs" name="MatrixImpl.hpp" compile="0" resource="0" file="Source/mathter/Matrix/MatrixImpl.hpp"/>
<FILE id="ZApObW" name="MatrixVectorArithmetic.hpp" compile="0" resource="0"
file="Source/mathter/Matrix/MatrixVectorArithmetic.hpp"/>
</GROUP>
<GROUP id="{9ED17B79-C8AF-B25C-1B0D-01C8A868E93B}" name="Quaternion">
<FILE id="Pg5bBV" name="QuaternionArithmetic.hpp" compile="0" resource="0"
file="Source/mathter/Quaternion/QuaternionArithmetic.hpp"/>
<FILE id="Q40Fdf" name="QuaternionCompare.hpp" compile="0" resource="0"
file="Source/mathter/Quaternion/QuaternionCompare.hpp"/>
<FILE id="lnp7Lb" name="QuaternionFunction.hpp" compile="0" resource="0"
file="Source/mathter/Quaternion/QuaternionFunction.hpp"/>
<FILE id="qDNOvo" name="QuaternionImpl.hpp" compile="0" resource="0"
file="Source/mathter/Quaternion/QuaternionImpl.hpp"/>
<FILE id="eXgZ46" name="QuaternionLiterals.hpp" compile="0" resource="0"
file="Source/mathter/Quaternion/QuaternionLiterals.hpp"/>
<FILE id="oMB7Jr" name="QuaternionVectorArithmetic.hpp" compile="0"
resource="0" file="Source/mathter/Quaternion/QuaternionVectorArithmetic.hpp"/>
</GROUP>
<GROUP id="{D82CFD72-F5BE-1024-94AB-5C2503423E4D}" name="Swizzle">
<FILE id="CeOGVV" name="Swizzle_1.inc.hpp" compile="0" resource="0"
file="Source/mathter/Swizzle/Swizzle_1.inc.hpp"/>
<FILE id="jwhhIz" name="Swizzle_2.inc.hpp" compile="0" resource="0"
file="Source/mathter/Swizzle/Swizzle_2.inc.hpp"/>
<FILE id="fPNnzc" name="Swizzle_3.inc.hpp" compile="0" resource="0"
file="Source/mathter/Swizzle/Swizzle_3.inc.hpp"/>
<FILE id="gU43mt" name="Swizzle_4.inc.hpp" compile="0" resource="0"
file="Source/mathter/Swizzle/Swizzle_4.inc.hpp"/>
</GROUP>
<GROUP id="{2F08F8FD-A6D7-6DE3-CAD4-564E35A9F0B9}" name="Transforms">
<FILE id="pltHW9" name="IdentityBuilder.hpp" compile="0" resource="0"
file="Source/mathter/Transforms/IdentityBuilder.hpp"/>
<FILE id="g2kgGu" name="OrthographicBuilder.hpp" compile="0" resource="0"
file="Source/mathter/Transforms/OrthographicBuilder.hpp"/>
<FILE id="DBDXmX" name="PerspectiveBuilder.hpp" compile="0" resource="0"
file="Source/mathter/Transforms/PerspectiveBuilder.hpp"/>
<FILE id="Gj9MnE" name="Rotation2DBuilder.hpp" compile="0" resource="0"
file="Source/mathter/Transforms/Rotation2DBuilder.hpp"/>
<FILE id="Hq0ZLD" name="Rotation3DBuilder.hpp" compile="0" resource="0"
file="Source/mathter/Transforms/Rotation3DBuilder.hpp"/>
<FILE id="An6eDN" name="ScaleBuilder.hpp" compile="0" resource="0"
file="Source/mathter/Transforms/ScaleBuilder.hpp"/>
<FILE id="xzgGHN" name="ShearBuilder.hpp" compile="0" resource="0"
file="Source/mathter/Transforms/ShearBuilder.hpp"/>
<FILE id="OVvc6Z" name="TranslationBuilder.hpp" compile="0" resource="0"
file="Source/mathter/Transforms/TranslationBuilder.hpp"/>
<FILE id="TzGfIt" name="ViewBuilder.hpp" compile="0" resource="0" file="Source/mathter/Transforms/ViewBuilder.hpp"/>
<FILE id="VTTCpk" name="ZeroBuilder.hpp" compile="0" resource="0" file="Source/mathter/Transforms/ZeroBuilder.hpp"/>
</GROUP>
<GROUP id="{BA088AC1-AC2B-B70C-582E-EDF9E38ABC20}" name="Vector">
<FILE id="KDVsvP" name="VectorArithmetic.hpp" compile="0" resource="0"
file="Source/mathter/Vector/VectorArithmetic.hpp"/>
<FILE id="qBpF7X" name="VectorCompare.hpp" compile="0" resource="0"
file="Source/mathter/Vector/VectorCompare.hpp"/>
<FILE id="IinHSU" name="VectorConcat.hpp" compile="0" resource="0"
file="Source/mathter/Vector/VectorConcat.hpp"/>
<FILE id="aVRyP9" name="VectorFunction.hpp" compile="0" resource="0"
file="Source/mathter/Vector/VectorFunction.hpp"/>
<FILE id="af10kl" name="VectorImpl.hpp" compile="0" resource="0" file="Source/mathter/Vector/VectorImpl.hpp"/>
</GROUP>
<FILE id="vOLhwO" name="CMakeLists.txt" compile="0" resource="1" file="Source/mathter/CMakeLists.txt"/>
<FILE id="d4t0xm" name="Geometry.hpp" compile="0" resource="0" file="Source/mathter/Geometry.hpp"/>
<FILE id="AZxH75" name="IoStream.hpp" compile="0" resource="0" file="Source/mathter/IoStream.hpp"/>
<FILE id="ev6gxl" name="Mathter.natvis" compile="0" resource="1" file="Source/mathter/Mathter.natvis"/>
<FILE id="VBewvB" name="Matrix.hpp" compile="0" resource="0" file="Source/mathter/Matrix.hpp"/>
<FILE id="vlSQrm" name="Quaternion.hpp" compile="0" resource="0" file="Source/mathter/Quaternion.hpp"/>
<FILE id="Aos8s3" name="Utility.hpp" compile="0" resource="0" file="Source/mathter/Utility.hpp"/>
<FILE id="T6rqIo" name="Vector.hpp" compile="0" resource="0" file="Source/mathter/Vector.hpp"/>
</GROUP>
<GROUP id="{E6ED85A9-3843-825F-EF48-BCF81E38F8AD}" name="obj">
<FILE id="ahOy0q" name="Camera.cpp" compile="1" resource="0" file="Source/obj/Camera.cpp"/>
<FILE id="dUDESs" name="Camera.h" compile="0" resource="0" file="Source/obj/Camera.h"/>
@ -515,10 +502,6 @@
<FILE id="YNsbe9" name="WorldObject.cpp" compile="1" resource="0" file="Source/obj/WorldObject.cpp"/>
<FILE id="SZBVI9" name="WorldObject.h" compile="0" resource="0" file="Source/obj/WorldObject.h"/>
</GROUP>
<FILE id="RHHuXP" name="PerspectiveComponent.cpp" compile="1" resource="0"
file="Source/PerspectiveComponent.cpp"/>
<FILE id="mliVoS" name="PerspectiveComponent.h" compile="0" resource="0"
file="Source/PerspectiveComponent.h"/>
<GROUP id="{2AE40B10-2C85-6401-644A-D5F36BCC5BC1}" name="parser">
<FILE id="q22Fiw" name="FileParser.cpp" compile="1" resource="0" file="Source/parser/FileParser.cpp"/>
<FILE id="HWSJK8" name="FileParser.h" compile="0" resource="0" file="Source/parser/FileParser.h"/>
@ -528,17 +511,6 @@
<FILE id="JEcNPP" name="FrameProducer.h" compile="0" resource="0" file="Source/parser/FrameProducer.h"/>
<FILE id="hCrVUD" name="FrameSource.h" compile="0" resource="0" file="Source/parser/FrameSource.h"/>
</GROUP>
<FILE id="GF4uFx" name="PluginEditor.cpp" compile="1" resource="0"
file="Source/PluginEditor.cpp"/>
<FILE id="iySMgE" name="PluginEditor.h" compile="0" resource="0" file="Source/PluginEditor.h"/>
<FILE id="N4YgAT" name="PluginProcessor.cpp" compile="1" resource="0"
file="Source/PluginProcessor.cpp"/>
<FILE id="G4mTsK" name="PluginProcessor.h" compile="0" resource="0"
file="Source/PluginProcessor.h"/>
<FILE id="x57ccs" name="SettingsComponent.cpp" compile="1" resource="0"
file="Source/SettingsComponent.cpp"/>
<FILE id="Vlmozi" name="SettingsComponent.h" compile="0" resource="0"
file="Source/SettingsComponent.h"/>
<GROUP id="{92CEA658-C82C-9CEB-15EB-945EF6B6B5C8}" name="shape">
<FILE id="iglTFG" name="CircleArc.cpp" compile="1" resource="0" file="Source/shape/CircleArc.cpp"/>
<FILE id="T3S8Sg" name="CircleArc.h" compile="0" resource="0" file="Source/shape/CircleArc.h"/>
@ -565,9 +537,6 @@
<FILE id="vIYWRG" name="TextParser.cpp" compile="1" resource="0" file="Source/txt/TextParser.cpp"/>
<FILE id="LlefOK" name="TextParser.h" compile="0" resource="0" file="Source/txt/TextParser.h"/>
</GROUP>
<FILE id="UxZu4n" name="TxtComponent.cpp" compile="1" resource="0"
file="Source/TxtComponent.cpp"/>
<FILE id="kxPbsL" name="TxtComponent.h" compile="0" resource="0" file="Source/TxtComponent.h"/>
<GROUP id="{0C40BD3D-FDE8-D3CD-E1AB-14CA04799E4A}" name="UGen">
<FILE id="zfNA3c" name="Env.cpp" compile="1" resource="0" file="Source/UGen/Env.cpp"/>
<FILE id="DHCLp1" name="Env.h" compile="0" resource="0" file="Source/UGen/Env.h"/>
@ -582,6 +551,46 @@
<FILE id="mC1tUv" name="ugen_JuceUtility.h" compile="0" resource="0"
file="Source/UGen/ugen_JuceUtility.h"/>
</GROUP>
<FILE id="I44EdJ" name="EffectsComponent.cpp" compile="1" resource="0"
file="Source/EffectsComponent.cpp"/>
<FILE id="qxxNX3" name="EffectsComponent.h" compile="0" resource="0"
file="Source/EffectsComponent.h"/>
<FILE id="uyOdTl" name="LegacyProject.cpp" compile="1" resource="0"
file="Source/LegacyProject.cpp"/>
<FILE id="u7PWXF" name="LineArtComponent.cpp" compile="1" resource="0"
file="Source/LineArtComponent.cpp"/>
<FILE id="InL4cZ" name="LineArtComponent.h" compile="0" resource="0"
file="Source/LineArtComponent.h"/>
<FILE id="d2zFqF" name="LookAndFeel.cpp" compile="1" resource="0" file="Source/LookAndFeel.cpp"/>
<FILE id="TJDqWs" name="LookAndFeel.h" compile="0" resource="0" file="Source/LookAndFeel.h"/>
<FILE id="X26RjJ" name="LuaComponent.cpp" compile="1" resource="0"
file="Source/LuaComponent.cpp"/>
<FILE id="g5xRHT" name="LuaComponent.h" compile="0" resource="0" file="Source/LuaComponent.h"/>
<FILE id="GKBQ8j" name="MainComponent.cpp" compile="1" resource="0"
file="Source/MainComponent.cpp"/>
<FILE id="RU8fGr" name="MainComponent.h" compile="0" resource="0" file="Source/MainComponent.h"/>
<FILE id="cFVaxu" name="MathUtil.h" compile="0" resource="0" file="Source/MathUtil.h"/>
<FILE id="eB92KJ" name="MidiComponent.cpp" compile="1" resource="0"
file="Source/MidiComponent.cpp"/>
<FILE id="GJqoJa" name="MidiComponent.h" compile="0" resource="0" file="Source/MidiComponent.h"/>
<FILE id="RHHuXP" name="PerspectiveComponent.cpp" compile="1" resource="0"
file="Source/PerspectiveComponent.cpp"/>
<FILE id="mliVoS" name="PerspectiveComponent.h" compile="0" resource="0"
file="Source/PerspectiveComponent.h"/>
<FILE id="GF4uFx" name="PluginEditor.cpp" compile="1" resource="0"
file="Source/PluginEditor.cpp"/>
<FILE id="iySMgE" name="PluginEditor.h" compile="0" resource="0" file="Source/PluginEditor.h"/>
<FILE id="N4YgAT" name="PluginProcessor.cpp" compile="1" resource="0"
file="Source/PluginProcessor.cpp"/>
<FILE id="G4mTsK" name="PluginProcessor.h" compile="0" resource="0"
file="Source/PluginProcessor.h"/>
<FILE id="x57ccs" name="SettingsComponent.cpp" compile="1" resource="0"
file="Source/SettingsComponent.cpp"/>
<FILE id="Vlmozi" name="SettingsComponent.h" compile="0" resource="0"
file="Source/SettingsComponent.h"/>
<FILE id="UxZu4n" name="TxtComponent.cpp" compile="1" resource="0"
file="Source/TxtComponent.cpp"/>
<FILE id="kxPbsL" name="TxtComponent.h" compile="0" resource="0" file="Source/TxtComponent.h"/>
</GROUP>
</MAINGROUP>
<JUCEOPTIONS JUCE_STRICT_REFCOUNTEDPOINTER="1" JUCE_VST3_CAN_REPLACE_VST2="0"
@ -611,7 +620,7 @@
</LINUX_MAKE>
<VS2022 targetFolder="Builds/VisualStudio2022" smallIcon="pSc1mq" bigIcon="pSc1mq">
<CONFIGURATIONS>
<CONFIGURATION isDebug="1" name="Debug" targetName="osci-render"/>
<CONFIGURATION isDebug="1" name="Debug" targetName="osci-render" enablePluginBinaryCopyStep="1"/>
<CONFIGURATION isDebug="0" name="Release" targetName="osci-render" alwaysGenerateDebugSymbols="1"
debugInformationFormat="ProgramDatabase"/>
</CONFIGURATIONS>