#include "ObjComponent.h" #include "PluginEditor.h" #include #include "Util.h" ObjComponent::ObjComponent(OscirenderAudioProcessor& p, OscirenderAudioProcessorEditor& editor) : audioProcessor(p), pluginEditor(editor) { setText("3D .obj File Settings"); juce::Desktop::getInstance().addGlobalMouseListener(this); addAndMakeVisible(focalLength); addAndMakeVisible(rotateX); addAndMakeVisible(rotateY); addAndMakeVisible(rotateZ); addAndMakeVisible(rotateSpeed); focalLength.slider.onValueChange = [this] { juce::SpinLock::ScopedLockType lock(audioProcessor.parsersLock); audioProcessor.focalLength->setValue(focalLength.slider.getValue()); audioProcessor.focalLength->apply(); }; auto onRotationChange = [this]() { juce::SpinLock::ScopedLockType lock(audioProcessor.parsersLock); audioProcessor.rotateX->setValue(rotateX.slider.getValue()); audioProcessor.rotateY->setValue(rotateY.slider.getValue()); audioProcessor.rotateZ->setValue(rotateZ.slider.getValue()); audioProcessor.fixedRotateX = fixedRotateX->getToggleState(); audioProcessor.fixedRotateY = fixedRotateY->getToggleState(); audioProcessor.fixedRotateZ = fixedRotateZ->getToggleState(); }; rotateX.slider.onValueChange = onRotationChange; rotateY.slider.onValueChange = onRotationChange; rotateZ.slider.onValueChange = onRotationChange; rotateSpeed.slider.onValueChange = [this] { juce::SpinLock::ScopedLockType lock(audioProcessor.parsersLock); audioProcessor.rotateSpeed->setValue(rotateSpeed.slider.getValue()); audioProcessor.rotateSpeed->apply(); }; addAndMakeVisible(resetRotation); addAndMakeVisible(mouseRotate); resetRotation.onClick = [this] { fixedRotateX->setToggleState(false, juce::NotificationType::dontSendNotification); fixedRotateY->setToggleState(false, juce::NotificationType::dontSendNotification); fixedRotateZ->setToggleState(false, juce::NotificationType::dontSendNotification); rotateX.slider.setValue(0); rotateY.slider.setValue(0); rotateZ.slider.setValue(0); rotateSpeed.slider.setValue(0); mouseRotate.setToggleState(false, juce::NotificationType::dontSendNotification); juce::SpinLock::ScopedLockType lock(audioProcessor.parsersLock); if (audioProcessor.getCurrentFileIndex() != -1) { auto obj = audioProcessor.getCurrentFileParser()->getObject(); if (obj != nullptr) { obj->setCurrentRotationX(0); obj->setCurrentRotationY(0); obj->setCurrentRotationZ(0); } } }; auto doc = juce::XmlDocument::parse(BinaryData::fixed_rotate_svg); Util::changeSvgColour(doc.get(), "white"); fixedRotateWhite = juce::Drawable::createFromSVG(*doc); Util::changeSvgColour(doc.get(), "red"); fixedRotateRed = juce::Drawable::createFromSVG(*doc); // TODO: any way of removing this duplication? getLookAndFeel().setColour(juce::DrawableButton::backgroundOnColourId, juce::Colours::transparentWhite); fixedRotateX->setClickingTogglesState(true); fixedRotateY->setClickingTogglesState(true); fixedRotateZ->setClickingTogglesState(true); fixedRotateX->setImages(fixedRotateWhite.get(), nullptr, nullptr, nullptr, fixedRotateRed.get()); fixedRotateY->setImages(fixedRotateWhite.get(), nullptr, nullptr, nullptr, fixedRotateRed.get()); fixedRotateZ->setImages(fixedRotateWhite.get(), nullptr, nullptr, nullptr, fixedRotateRed.get()); fixedRotateX->onClick = onRotationChange; fixedRotateY->onClick = onRotationChange; fixedRotateZ->onClick = onRotationChange; rotateX.setComponent(fixedRotateX); rotateY.setComponent(fixedRotateY); rotateZ.setComponent(fixedRotateZ); fixedRotateX->setToggleState(audioProcessor.fixedRotateX, juce::NotificationType::dontSendNotification); fixedRotateY->setToggleState(audioProcessor.fixedRotateY, juce::NotificationType::dontSendNotification); fixedRotateZ->setToggleState(audioProcessor.fixedRotateZ, juce::NotificationType::dontSendNotification); } ObjComponent::~ObjComponent() { juce::Desktop::getInstance().removeGlobalMouseListener(this); } // listen for mouse movement and rotate the object if mouseRotate is enabled void ObjComponent::mouseMove(const juce::MouseEvent& e) { if (mouseRotate.getToggleState()) { auto globalEvent = e.getEventRelativeTo(&pluginEditor); auto width = pluginEditor.getWidth(); auto height = pluginEditor.getHeight(); auto x = globalEvent.position.getX(); auto y = globalEvent.position.getY(); rotateX.slider.setValue(2 * x / width - 1); rotateY.slider.setValue(1 - 2 * y / height); } } void ObjComponent::disableMouseRotation() { mouseRotate.setToggleState(false, juce::NotificationType::dontSendNotification); } void ObjComponent::resized() { auto area = getLocalBounds().reduced(20); double rowHeight = 30; focalLength.setBounds(area.removeFromTop(rowHeight)); rotateX.setBounds(area.removeFromTop(rowHeight)); rotateY.setBounds(area.removeFromTop(rowHeight)); rotateZ.setBounds(area.removeFromTop(rowHeight)); rotateSpeed.setBounds(area.removeFromTop(rowHeight)); area.removeFromTop(10); auto row = area.removeFromTop(rowHeight); resetRotation.setBounds(row.removeFromLeft(120)); row.removeFromLeft(20); mouseRotate.setBounds(row); }