kopia lustrzana https://github.com/jameshball/osci-render
Add basic code for 3D rotate effect
rodzic
71d93f152e
commit
70d76aa68d
|
@ -10,5 +10,6 @@ public enum EffectType {
|
|||
WOBBLE,
|
||||
TRACE_MIN,
|
||||
TRACE_MAX,
|
||||
SMOOTH
|
||||
SMOOTH,
|
||||
ROTATE_3D
|
||||
}
|
||||
|
|
|
@ -0,0 +1,36 @@
|
|||
package sh.ball.audio.effect;
|
||||
|
||||
import sh.ball.engine.Vector3;
|
||||
import sh.ball.shapes.Vector2;
|
||||
|
||||
// 3D rotation effect
|
||||
public class PerspectiveEffect extends PhaseEffect implements SettableEffect {
|
||||
|
||||
private double focalLength = 1.0;
|
||||
private double zPos = 1.0;
|
||||
|
||||
public PerspectiveEffect(int sampleRate, double speed) {
|
||||
super(sampleRate, speed);
|
||||
}
|
||||
|
||||
public PerspectiveEffect(int sampleRate) {
|
||||
this(sampleRate, 1);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Vector2 apply(int count, Vector2 vector) {
|
||||
Vector3 vertex = new Vector3(vector.x, vector.y, 0.0);
|
||||
double theta = nextTheta();
|
||||
vertex = vertex.rotate(new Vector3(0, theta, theta));
|
||||
|
||||
return new Vector2(
|
||||
vertex.x * focalLength / (vertex.z - zPos),
|
||||
vertex.y * focalLength / (vertex.z - zPos)
|
||||
);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setValue(double value) {
|
||||
zPos = 1.0 + (value - 0.5) * 3;
|
||||
}
|
||||
}
|
|
@ -1,5 +0,0 @@
|
|||
package sh.ball.gui;
|
||||
|
||||
enum EffectType {
|
||||
VECTOR_CANCELLING
|
||||
}
|
|
@ -34,6 +34,7 @@ public class EffectsController implements Initializable, SubController {
|
|||
private Map<EffectType, Slider> effectTypes;
|
||||
|
||||
private final WobbleEffect wobbleEffect;
|
||||
private final PerspectiveEffect perspectiveEffect;
|
||||
|
||||
@FXML
|
||||
private EffectComponentGroup vectorCancelling;
|
||||
|
@ -51,9 +52,12 @@ public class EffectsController implements Initializable, SubController {
|
|||
private EffectComponentGroup traceMax;
|
||||
@FXML
|
||||
private EffectComponentGroup traceMin;
|
||||
@FXML
|
||||
private EffectComponentGroup perspective;
|
||||
|
||||
public EffectsController() {
|
||||
this.wobbleEffect = new WobbleEffect(DEFAULT_SAMPLE_RATE);
|
||||
this.perspectiveEffect = new PerspectiveEffect(DEFAULT_SAMPLE_RATE);
|
||||
}
|
||||
|
||||
private <K, V> Map<K, V> mergeEffectMaps(Function<EffectComponentGroup, Map<K, V>> map) {
|
||||
|
@ -90,6 +94,7 @@ public class EffectsController implements Initializable, SubController {
|
|||
|
||||
public void setAudioDevice(AudioDevice device) {
|
||||
wobbleEffect.setSampleRate(device.sampleRate());
|
||||
perspectiveEffect.setSampleRate(device.sampleRate());
|
||||
Map<ComboBox<AnimationType>, EffectAnimator> comboAnimatorMap = getComboBoxAnimatorMap();
|
||||
for (EffectAnimator animator : comboAnimatorMap.values()) {
|
||||
animator.setSampleRate(device.sampleRate());
|
||||
|
@ -118,6 +123,7 @@ public class EffectsController implements Initializable, SubController {
|
|||
initializeEffectTypes();
|
||||
|
||||
wobble.controller.setAnimator(new EffectAnimator(DEFAULT_SAMPLE_RATE, wobbleEffect));
|
||||
perspective.controller.setAnimator(new EffectAnimator(DEFAULT_SAMPLE_RATE, perspectiveEffect));
|
||||
traceMin.controller.setAnimator(new EffectAnimator(DEFAULT_SAMPLE_RATE, new ConsumerEffect(audioPlayer::setTraceMin)));
|
||||
traceMax.controller.setAnimator(new EffectAnimator(DEFAULT_SAMPLE_RATE, new ConsumerEffect(audioPlayer::setTraceMax)));
|
||||
vectorCancelling.controller.setAnimator(new EffectAnimator(DEFAULT_SAMPLE_RATE, new VectorCancellingEffect()));
|
||||
|
@ -148,7 +154,7 @@ public class EffectsController implements Initializable, SubController {
|
|||
}
|
||||
|
||||
private List<EffectComponentGroup> effects() {
|
||||
return List.of(vectorCancelling, bitCrush, verticalDistort, horizontalDistort, wobble, smoothing, traceMin, traceMax);
|
||||
return List.of(vectorCancelling, bitCrush, verticalDistort, horizontalDistort, wobble, smoothing, traceMin, traceMax, perspective);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -54,6 +54,16 @@
|
|||
-fx-background-radius: 0;
|
||||
}
|
||||
|
||||
.scroll-pane .scroll-bar:vertical {
|
||||
-fx-unit-increment: 10 ;
|
||||
-fx-block-increment: 50 ;
|
||||
}
|
||||
|
||||
.scroll-pane .scroll-bar:horizontal {
|
||||
-fx-unit-increment: 5 ;
|
||||
-fx-block-increment: 20 ;
|
||||
}
|
||||
|
||||
.titled-pane > .title > .arrow-button .arrow {
|
||||
-fx-background-color: white, white;
|
||||
-fx-background-insets: 1 0 -1 0, 0;
|
||||
|
|
|
@ -1,26 +1,33 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
|
||||
<?import javafx.geometry.Insets?>
|
||||
<?import javafx.scene.control.ScrollPane?>
|
||||
<?import javafx.scene.layout.AnchorPane?>
|
||||
<?import javafx.scene.layout.VBox?>
|
||||
<?import sh.ball.gui.components.EffectComponentGroup?>
|
||||
|
||||
<AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="355.0" prefWidth="606.0" xmlns="http://javafx.com/javafx/17" xmlns:fx="http://javafx.com/fxml/1" fx:controller="sh.ball.gui.controller.EffectsController">
|
||||
<children>
|
||||
<VBox>
|
||||
<children>
|
||||
<EffectComponentGroup fx:id="vectorCancelling" label="vectorCancelling" max="1.0" min="0.0" increment="0.005" name="Vector cancelling" type="VECTOR_CANCELLING" value="0.11111111" />
|
||||
<EffectComponentGroup fx:id="bitCrush" label="bitCrush" max="1.0" min="0.0" increment="0.005" name="Bit crush" type="BIT_CRUSH" value="0.6666666" />
|
||||
<EffectComponentGroup fx:id="verticalDistort" label="verticalDistort" max="1.0" min="0.0" increment="0.005" name="Vertical shift" type="VERTICAL_DISTORT" value="0.2" />
|
||||
<EffectComponentGroup fx:id="horizontalDistort" label="horizontalDistort" max="1.0" min="0.0" increment="0.005" name="Horizontal shift" type="HORIZONTAL_DISTORT" value="0.2" />
|
||||
<EffectComponentGroup fx:id="wobble" label="wobble" max="1.0" min="0.0" increment="0.005" name="Wobble" type="WOBBLE" value="0.2" />
|
||||
<EffectComponentGroup fx:id="smoothing" label="smoothing" max="1.0" min="0.0" increment="0.005" name="Smoothing" type="SMOOTH" value="0.125" />
|
||||
<EffectComponentGroup fx:id="traceMax" label="traceMax" max="1.0" min="0.0" increment="0.005" name="Trace max" type="TRACE_MAX" value="0.5" />
|
||||
<EffectComponentGroup fx:id="traceMin" label="traceMin" max="1.0" min="0.0" increment="0.005" name="Trace min" type="TRACE_MIN" value="0.5" />
|
||||
</children>
|
||||
<padding>
|
||||
<Insets top="5.0" />
|
||||
</padding>
|
||||
</VBox>
|
||||
</children>
|
||||
</AnchorPane>
|
||||
|
||||
<ScrollPane hbarPolicy="NEVER" prefHeight="381.0" prefWidth="608.0" xmlns="http://javafx.com/javafx/17" xmlns:fx="http://javafx.com/fxml/1" fx:controller="sh.ball.gui.controller.EffectsController">
|
||||
<content>
|
||||
<AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="380.0" prefWidth="606.0">
|
||||
<children>
|
||||
<VBox>
|
||||
<children>
|
||||
<EffectComponentGroup fx:id="vectorCancelling" increment="0.005" label="vectorCancelling" max="1.0" min="0.0" name="Vector cancelling" type="VECTOR_CANCELLING" value="0.11111111" />
|
||||
<EffectComponentGroup fx:id="bitCrush" increment="0.005" label="bitCrush" max="1.0" min="0.0" name="Bit crush" type="BIT_CRUSH" value="0.6666666" />
|
||||
<EffectComponentGroup fx:id="verticalDistort" increment="0.005" label="verticalDistort" max="1.0" min="0.0" name="Vertical shift" type="VERTICAL_DISTORT" value="0.2" />
|
||||
<EffectComponentGroup fx:id="horizontalDistort" increment="0.005" label="horizontalDistort" max="1.0" min="0.0" name="Horizontal shift" type="HORIZONTAL_DISTORT" value="0.2" />
|
||||
<EffectComponentGroup fx:id="wobble" increment="0.005" label="wobble" max="1.0" min="0.0" name="Wobble" type="WOBBLE" value="0.2" />
|
||||
<EffectComponentGroup fx:id="smoothing" increment="0.005" label="smoothing" max="1.0" min="0.0" name="Smoothing" type="SMOOTH" value="0.125" />
|
||||
<EffectComponentGroup fx:id="traceMax" increment="0.005" label="traceMax" max="1.0" min="0.0" name="Trace max" type="TRACE_MAX" value="0.5" />
|
||||
<EffectComponentGroup fx:id="traceMin" increment="0.005" label="traceMin" max="1.0" min="0.0" name="Trace min" type="TRACE_MIN" value="0.5" />
|
||||
<EffectComponentGroup fx:id="perspective" increment="0.005" label="perspective" max="1.0" min="0.0" name="3D Rotation" type="ROTATE_3D" value="0.5" />
|
||||
</children>
|
||||
<padding>
|
||||
<Insets top="5.0" />
|
||||
</padding>
|
||||
</VBox>
|
||||
</children>
|
||||
</AnchorPane>
|
||||
</content>
|
||||
</ScrollPane>
|
||||
|
|
Ładowanie…
Reference in New Issue