Skip to content

Commit

Permalink
Add shader naming
Browse files Browse the repository at this point in the history
  • Loading branch information
edwinRNDR committed Mar 27, 2020
1 parent a8745cb commit a1d8775
Show file tree
Hide file tree
Showing 22 changed files with 53 additions and 53 deletions.
6 changes: 3 additions & 3 deletions openrndr-core/src/main/kotlin/org/openrndr/draw/Filter.kt
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ private var filterQuadFormat = vertexFormat {
}

fun filterShaderFromUrl(url: String): Shader {
return filterShaderFromCode(URL(url).readText())
return filterShaderFromCode(URL(url).readText(), "filter-shader: $url")
}

fun filterWatcherFromUrl(url: String): ShaderWatcher {
Expand All @@ -30,8 +30,8 @@ fun filterWatcherFromUrl(url: String): ShaderWatcher {
}
}

fun filterShaderFromCode(fragmentShaderCode: String): Shader {
return Shader.createFromCode(Filter.filterVertexCode, fragmentShaderCode)
fun filterShaderFromCode(fragmentShaderCode: String, name: String): Shader {
return Shader.createFromCode(Filter.filterVertexCode, fragmentShaderCode, name)
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import org.openrndr.color.ColorRGBa
import org.openrndr.internal.Driver

private val shadeStyleManager by lazy {
ShadeStyleManager.fromGenerators(
ShadeStyleManager.fromGenerators("shade-style-filter",
Driver.instance.shaderGenerators::filterVertexShader,
Driver.instance.shaderGenerators::filterFragmentShader
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,11 +15,10 @@ data class ShadeStructure(var uniforms: String? = null,
var suppressDefaultOutput: Boolean = false
)

abstract class ShadeStyleManager {

abstract class ShadeStyleManager(val name: String) {
companion object {
fun fromGenerators(vertexShaderGenerator: (ShadeStructure) -> String, fragmentShaderGenerator: (ShadeStructure) -> String): ShadeStyleManager {
return Driver.instance.createShadeStyleManager(vertexShaderGenerator, fragmentShaderGenerator)
fun fromGenerators(name: String, vertexShaderGenerator: (ShadeStructure) -> String, fragmentShaderGenerator: (ShadeStructure) -> String): ShadeStyleManager {
return Driver.instance.createShadeStyleManager(name, vertexShaderGenerator, fragmentShaderGenerator)
}
}

Expand Down
6 changes: 3 additions & 3 deletions openrndr-core/src/main/kotlin/org/openrndr/draw/Shader.kt
Original file line number Diff line number Diff line change
Expand Up @@ -12,13 +12,13 @@ interface Shader {
fun createFromUrls(vsUrl: String, fsUrl: String, session: Session? = Session.active): Shader {
val vsCode = codeFromURL(vsUrl)
val fsCode = codeFromURL(fsUrl)
val shader = Driver.instance.createShader(vsCode, fsCode)
val shader = Driver.instance.createShader(vsCode, fsCode, "$vsUrl / $fsUrl", session)
session?.track(shader)
return shader
}

fun createFromCode(vsCode: String, fsCode: String, session: Session? = Session.active): Shader {
val shader = Driver.instance.createShader(vsCode, fsCode)
fun createFromCode(vsCode: String, fsCode: String, name: String, session: Session? = Session.active): Shader {
val shader = Driver.instance.createShader(vsCode, fsCode, name, session)
session?.track(shader)
return shader
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -84,10 +84,9 @@ class ShaderWatcher private constructor(
}
}


val effectiveVsCode = vsCode ?: codeFromURL(vsUrl ?: throw RuntimeException("no code or url for vertex shader"))
val effectiveFsCode = fsCode ?: codeFromURL(fsUrl ?: throw RuntimeException("no code or url for fragment shader"))
val shader = Shader.createFromCode(effectiveVsCode, effectiveFsCode)
val shader = Shader.createFromCode(effectiveVsCode, effectiveFsCode, "shader-watcher: ${vsUrl?:"<unknown>"} / ${fsUrl?:"<unknown>"}")

val watcher = ShaderWatcher(
vsCode = vsCode,
Expand Down Expand Up @@ -120,7 +119,7 @@ class ShaderWatcher private constructor(
try {
val effectiveVsCode = vsCode ?: codeFromURL(vsUrl ?: throw RuntimeException("no code or url for vertex shader"))
val effectiveFsCode = fsCode ?: codeFromURL(fsUrl ?: throw RuntimeException("no code or url for fragment shader"))
currentShader = Shader.createFromCode(effectiveVsCode, effectiveFsCode)
currentShader = Shader.createFromCode(effectiveVsCode, effectiveFsCode, "shader-watcher: ${vsUrl?:"<unknown>"} / ${fsUrl?:"<unknown>"}")
} catch (exception: Throwable) {
exception.printStackTrace()
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ class CircleDrawer {

private var instanceAttributes = VertexBuffer.createDynamic(instanceFormat, 10_000)

private val shaderManager: ShadeStyleManager = ShadeStyleManager.fromGenerators(Driver.instance.shaderGenerators::circleVertexShader,
private val shaderManager: ShadeStyleManager = ShadeStyleManager.fromGenerators("circle", Driver.instance.shaderGenerators::circleVertexShader,
Driver.instance.shaderGenerators::circleFragmentShader)

private fun assertInstanceSize(size: Int) {
Expand Down
4 changes: 2 additions & 2 deletions openrndr-core/src/main/kotlin/org/openrndr/internal/Driver.kt
Original file line number Diff line number Diff line change
Expand Up @@ -53,11 +53,11 @@ interface Driver {
val contextID: Long


fun createShader(vsCode: String, fsCode: String, session: Session? = Session.active): Shader
fun createShader(vsCode: String, fsCode: String, name: String, session: Session? = Session.active): Shader

fun createComputeShader(code: String, session: Session? = Session.active): ComputeShader

fun createShadeStyleManager(vertexShaderGenerator: (ShadeStructure) -> String,
fun createShadeStyleManager(name: String, vertexShaderGenerator: (ShadeStructure) -> String,
fragmentShaderGenerator: (ShadeStructure) -> String,
session: Session? = Session.root): ShadeStyleManager

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ internal class Command(val vertexBuffer: VertexBuffer, val type: ExpansionType,

internal class ExpansionDrawer {

private val shaderManager = ShadeStyleManager.fromGenerators(Driver.instance.shaderGenerators::expansionVertexShader,
private val shaderManager = ShadeStyleManager.fromGenerators("expansion", Driver.instance.shaderGenerators::expansionVertexShader,
Driver.instance.shaderGenerators::expansionFragmentShader)

val vertexFormat = vertexFormat {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ class CharacterRectangle(val character: Char, val x: Double, val y: Double, val

class FontImageMapDrawer {

private val shaderManager: ShadeStyleManager = ShadeStyleManager.fromGenerators(Driver.instance.shaderGenerators::fontImageMapVertexShader,
private val shaderManager: ShadeStyleManager = ShadeStyleManager.fromGenerators("font-image-map", Driver.instance.shaderGenerators::fontImageMapVertexShader,
Driver.instance.shaderGenerators::fontImageMapFragmentShader)

private val maxQuads = 20000
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,11 +21,11 @@ class ImageDrawer {

private var instanceAttributes = vertexBuffer(instanceFormat, 10, Session.root)

private val shaderManager: ShadeStyleManager = ShadeStyleManager.fromGenerators(
private val shaderManager: ShadeStyleManager = ShadeStyleManager.fromGenerators("image",
Driver.instance.shaderGenerators::imageVertexShader,
Driver.instance.shaderGenerators::imageFragmentShader)

private val arrayTextureShaderManager: ShadeStyleManager = ShadeStyleManager.fromGenerators(
private val arrayTextureShaderManager: ShadeStyleManager = ShadeStyleManager.fromGenerators("array-texture",
Driver.instance.shaderGenerators::imageArrayTextureVertexShader,
Driver.instance.shaderGenerators::imageArrayTextureFragmentShader)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import org.openrndr.math.Vector2
import org.openrndr.math.Vector3

class MeshLineDrawer {
private val shaderManager: ShadeStyleManager = ShadeStyleManager.fromGenerators(Driver.instance.shaderGenerators::meshLineVertexShader,
private val shaderManager: ShadeStyleManager = ShadeStyleManager.fromGenerators("mesh-line", Driver.instance.shaderGenerators::meshLineVertexShader,
Driver.instance.shaderGenerators::meshLineFragmentShader)

private val vertices: VertexBuffer = vertexBuffer(VertexFormat().apply {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ class PerformanceLineDrawer {
attribute("vertexOffset", VertexElementType.FLOAT32)
}, 1024 * 1024, Session.root)

private val shaderManager: ShadeStyleManager = ShadeStyleManager.fromGenerators(Driver.instance.shaderGenerators::fastLineVertexShader,
private val shaderManager: ShadeStyleManager = ShadeStyleManager.fromGenerators("performance-line", Driver.instance.shaderGenerators::fastLineVertexShader,
Driver.instance.shaderGenerators::fastLineFragmentShader)

@JvmName("drawLineSegments3d")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ class PointDrawer {

private var instanceAttributes = VertexBuffer.createDynamic(instanceFormat, 10_000, session = Session.root)

private val shaderManager: ShadeStyleManager = ShadeStyleManager.fromGenerators(Driver.instance.shaderGenerators::pointVertexShader,
private val shaderManager: ShadeStyleManager = ShadeStyleManager.fromGenerators("point", Driver.instance.shaderGenerators::pointVertexShader,
Driver.instance.shaderGenerators::pointFragmentShader)

private fun assertInstanceSize(size: Int) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ class RectangleDrawer {
}
private var instanceAttributes = VertexBuffer.createDynamic(instanceFormat, 10000, Session.root)

private val shaderManager: ShadeStyleManager = ShadeStyleManager.fromGenerators(Driver.instance.shaderGenerators::rectangleVertexShader,
private val shaderManager: ShadeStyleManager = ShadeStyleManager.fromGenerators("rectangle", Driver.instance.shaderGenerators::rectangleVertexShader,
Driver.instance.shaderGenerators::rectangleFragmentShader)

init {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import org.openrndr.draw.*

class VertexBufferDrawer {

private val shaderManager: ShadeStyleManager = ShadeStyleManager.fromGenerators(Driver.instance.shaderGenerators::vertexBufferVertexShader,
private val shaderManager: ShadeStyleManager = ShadeStyleManager.fromGenerators("vertex-buffer", Driver.instance.shaderGenerators::vertexBufferVertexShader,
Driver.instance.shaderGenerators::vertexBufferFragmentShader)

fun drawVertexBuffer(drawContext: DrawContext, drawStyle: DrawStyle, primitive: DrawPrimitive, vertexBuffers:List<VertexBuffer>, offset:Int, vertexCount:Int) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,11 @@ import java.net.URL

internal class FilterTools

internal fun filterFragmentCode(resourceId: String): String {
val urlString = resourceUrl("gl3/$resourceId", FilterTools::class.java)
return URL(urlString).readText()
//internal fun filterFragmentCode(resourceId: String): String {
// val urlString = resourceUrl("gl3/$resourceId", FilterTools::class.java)
// return URL(urlString).readText()
//}

internal fun filterFragmentUrl(resourceId: String): String {
return resourceUrl("gl3/$resourceId", FilterTools::class.java)
}
Original file line number Diff line number Diff line change
@@ -1,22 +1,22 @@
package org.openrndr.filter.color

import org.openrndr.draw.*
import org.openrndr.filter.filterFragmentCode
import org.openrndr.filter.filterFragmentUrl

/**
* Converts from sRGB to linear RGB
*/
class Linearize : Filter(Shader.createFromCode(Filter.filterVertexCode, filterFragmentCode("color/linearize.frag")))
class Linearize : Filter(filterShaderFromUrl(filterFragmentUrl("color/linearize.frag")))

/**
* Converts from linear RGB to sRGB
*/
class Delinearize : Filter(Shader.createFromCode(Filter.filterVertexCode, filterFragmentCode("color/delinearize.frag")))
class Delinearize : Filter(filterShaderFromUrl(filterFragmentUrl("color/delinearize.frag")))

/**
* Converts from linear RGB to HybridLogGamma
*/
class HybridLogGamma : Filter(Shader.createFromCode(Filter.filterVertexCode, filterFragmentCode("color/hybrid-log-gamma.frag")))
class HybridLogGamma : Filter(filterShaderFromUrl(filterFragmentUrl("color/hybrid-log-gamma.frag")))

val hybridLogGamma by lazy { HybridLogGamma().apply { untrack() } }
val delinearize by lazy { Delinearize().apply { untrack() } }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ class ComputeShaderGL43(val programObject: Int, val name: String = "compute_shad
debugGLErrors()
if (location == -1 && !query) {
logger.warn {
"shader ${name} does not have a uniform called '$uniform'"
"Shader '${name}' does not have a uniform called '$uniform'"
}
}
location
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ class DriverGL3(val version: DriverVersionGL) : Driver {
return GLFW.glfwGetCurrentContext()
}


override fun createResourceThread(session: Session?, f: () -> Unit): ResourceThread {
return ResourceThreadGL3.create(f)
}
Expand Down Expand Up @@ -123,19 +124,19 @@ class DriverGL3(val version: DriverVersionGL) : Driver {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}

override fun createShadeStyleManager(vertexShaderGenerator: (ShadeStructure) -> String, fragmentShaderGenerator: (ShadeStructure) -> String, session: Session?): ShadeStyleManager {
return ShadeStyleManagerGL3(vertexShaderGenerator, fragmentShaderGenerator)
override fun createShadeStyleManager(name: String, vertexShaderGenerator: (ShadeStructure) -> String, fragmentShaderGenerator: (ShadeStructure) -> String, session: Session?): ShadeStyleManager {
return ShadeStyleManagerGL3(name, vertexShaderGenerator, fragmentShaderGenerator)
}

override fun createShader(vsCode: String, fsCode: String, session: Session?): Shader {
override fun createShader(vsCode: String, fsCode: String, name: String, session: Session?): Shader {
logger.trace {
"creating shader:\n${vsCode}\n${fsCode}"
}
val vertexShader = VertexShaderGL3.fromString(vsCode)
val fragmentShader = FragmentShaderGL3.fromString(fsCode)
val vertexShader = VertexShaderGL3.fromString(vsCode, name)
val fragmentShader = FragmentShaderGL3.fromString(fsCode, name)

synchronized(this) {
return ShaderGL3.create(vertexShader, fragmentShader, session)
return ShaderGL3.create(vertexShader, fragmentShader, name, session)
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,9 @@ import org.openrndr.math.*

private val logger = KotlinLogging.logger {}

class ShadeStyleManagerGL3(
val vertexShaderGenerator: (ShadeStructure) -> String,
val fragmentShaderGenerator: (ShadeStructure) -> String) : ShadeStyleManager() {
class ShadeStyleManagerGL3(name: String,
val vertexShaderGenerator: (ShadeStructure) -> String,
val fragmentShaderGenerator: (ShadeStructure) -> String) : ShadeStyleManager(name) {

private var defaultShader: Shader? = null
private val shaders = mutableMapOf<ShadeStructure, Shader>()
Expand All @@ -22,15 +22,15 @@ class ShadeStyleManagerGL3(
if (defaultShader == null) {
logger.debug { "creating default shader" }
val structure = structureFromShadeStyle(style, vertexFormats, instanceFormats)
defaultShader = Shader.createFromCode(vertexShaderGenerator(structure), fragmentShaderGenerator(structure), Session.root)
defaultShader = Shader.createFromCode(vertexShaderGenerator(structure), fragmentShaderGenerator(structure), "shade-style-default:$name", Session.root)
(defaultShader as ShaderGL3).userShader = false
}
return defaultShader!!
} else {
val structure = structureFromShadeStyle(style, vertexFormats, instanceFormats)
val shader = shaders.getOrPut(structure) {
try {
Shader.createFromCode(vertexShaderGenerator(structure), fragmentShaderGenerator(structure), Session.root)
Shader.createFromCode(vertexShaderGenerator(structure), fragmentShaderGenerator(structure), "shade-style-custom:$name-${structure.hashCode()}", Session.root)
} catch (e: Throwable) {
if (System.getProperties().containsKey("org.openrndr.ignoreShadeStyleErrors")) {
shader(null, vertexFormats, instanceFormats)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -354,11 +354,10 @@ class ShaderGL3(val program: Int,
internal var userShader = true

companion object {
fun create(vertexShader: VertexShaderGL3, fragmentShader: FragmentShaderGL3, session: Session?): ShaderGL3 {
fun create(vertexShader: VertexShaderGL3, fragmentShader: FragmentShaderGL3, name: String, session: Session?): ShaderGL3 {

synchronized(Driver.instance) {
debugGLErrors()
val name = "${vertexShader.name} / ${fragmentShader.name}"

val program = glCreateProgram()
debugGLErrors()
Expand All @@ -379,9 +378,7 @@ class ShaderGL3(val program: Int,
if (linkStatus[0] != GL_TRUE) {
checkProgramInfoLog(program, "noname")
}

glFinish()

return ShaderGL3(program, name, vertexShader, fragmentShader, session)
}
}
Expand Down Expand Up @@ -513,7 +510,7 @@ class ShaderGL3(val program: Int,
debugGLErrors()
if (location == -1 && !query) {
logger.warn {
"shader ${name} does not have a uniform called '$uniform'"
"Shader '${name}' does not have a uniform called '$uniform'"
}
}
location
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,14 @@ package org.openrndr.internal.gl3

import org.lwjgl.opengl.GL33C.*

class VertexShaderGL3(val shaderObject:Int, val name:String="<unknown-vertex-shader>") {
class VertexShaderGL3(val shaderObject: Int, val name: String) {
companion object {
fun fromString(code:String, name:String="<unknown-vertex-shader>"):VertexShaderGL3 {
fun fromString(code: String, name: String): VertexShaderGL3 {
val shaderObject = glCreateShader(GL_VERTEX_SHADER)
glShaderSource(shaderObject, code)
glCompileShader(shaderObject)
val compileStatus = IntArray(1)
glGetShaderiv(shaderObject, GL_COMPILE_STATUS,compileStatus)
glGetShaderiv(shaderObject, GL_COMPILE_STATUS, compileStatus)
if (compileStatus[0] != GL_TRUE) {
checkShaderInfoLog(shaderObject, code, name)
throw Exception("could not compile vertex shader")
Expand Down

0 comments on commit a1d8775

Please sign in to comment.