Add PerspectivePlane distortion filter

This commit is contained in:
Edwin Jakobs
2020-03-01 13:06:47 +01:00
parent 5b2652a1d3
commit 899b8b1e7a
3 changed files with 107 additions and 0 deletions

View File

@@ -0,0 +1,60 @@
package org.openrndr.extra.fx.distort
import org.openrndr.draw.*
import org.openrndr.extra.fx.filterFragmentCode
import org.openrndr.extra.parameters.BooleanParameter
import org.openrndr.extra.parameters.Description
import org.openrndr.extra.parameters.DoubleParameter
import org.openrndr.math.Vector3
import org.openrndr.math.transforms.transform
@Description("Perspective plane")
class PerspectivePlane : Filter(Shader.createFromCode(filterVertexCode, filterFragmentCode("distort/perspective-plane.frag"))) {
// @DoubleParameter("camera x", -1.0, 1.0, order = 0)
var cameraX : Double = 0.0
// @DoubleParameter("camera y", -1.0, 1.0, order = 1)
var cameraY : Double = 0.0
// @DoubleParameter("camera z", -1.0, 1.0, order = 2)
var cameraZ : Double = 1.0
@DoubleParameter("plane x", -1.0, 1.0, order = 3)
var planeX : Double = 0.0
@DoubleParameter("plane y", -1.0, 1.0, order = 4)
var planeY : Double = 0.0
@DoubleParameter("plane z", -1.0, 1.0, order = 5)
var planeZ : Double = 0.5
@DoubleParameter("plane yaw", -180.0, 180.0, order = 6)
var planeYaw : Double = 0.0
@DoubleParameter("plane pitch", -180.0, 180.0, order = 7)
var planePitch : Double = 0.0
@DoubleParameter("plane roll", -180.0, 180.0, order = 8)
var planeRoll : Double = 0.0
@BooleanParameter("tile input")
var tile: Boolean by parameters
var seconds:Double by parameters
init {
seconds = 0.0
tile = false
}
override fun apply(source: Array<ColorBuffer>, target: Array<ColorBuffer>) {
source[0].generateMipmaps()
source[0].filter(MinifyingFilter.LINEAR_MIPMAP_LINEAR, MagnifyingFilter.LINEAR)
source[0].wrapU = WrapMode.REPEAT
source[0].wrapV = WrapMode.REPEAT
parameters["cameraPosition"] = Vector3(cameraX, cameraY, cameraZ)
parameters["planePosition"] = Vector3(planeX, planeY, planeZ)
parameters["planeMatrix"] = transform {
rotate(Vector3.UNIT_X, planePitch)
rotate(Vector3.UNIT_Y, planeYaw)
rotate(Vector3.UNIT_Z, planeRoll)
}
super.apply(source, target)
}
}