Skip to content

Commit 6a3e647

Browse files
committed
Fix incorrect runtime Scalar value handling
1 parent c2faa63 commit 6a3e647

8 files changed

Lines changed: 73 additions & 51 deletions

File tree

PaperVision/src/main/kotlin/org/deltacv/papervision/codegen/build/Scope.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -177,11 +177,11 @@ data class Scope(
177177
builder.append("$tabs${language.variableSetDeclaration(variable, v)}")
178178
}
179179

180-
fun arraySet(variable: DeclarableVariable, index: Value, v: Value) {
180+
fun arraySet(value: Value, index: Value, v: Value) {
181181
newStatement()
182182
importValue(v)
183183

184-
builder.append("$tabs${language.arrayVariableSetDeclaration(variable, index, v)}")
184+
builder.append("$tabs${language.arrayValueSetDeclaration(value, index, v)}")
185185
}
186186

187187
fun instanceVariableSet(variable: DeclarableVariable, v: Value) {

PaperVision/src/main/kotlin/org/deltacv/papervision/codegen/build/language/jvm/JvmOpenCv.kt

Lines changed: 44 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import org.deltacv.papervision.codegen.build.DeclarableVariable
2626
import org.deltacv.papervision.codegen.build.Parameter
2727
import org.deltacv.papervision.codegen.build.Type
2828
import org.deltacv.papervision.codegen.build.language.StandardTypes
29+
import org.deltacv.papervision.codegen.dsl.ScopeCtx
2930
import org.deltacv.papervision.codegen.resolve.Resolvable
3031
import org.deltacv.papervision.codegen.resolve.resolved
3132

@@ -78,6 +79,47 @@ object JvmOpenCv {
7879
}
7980
}
8081

82+
fun syncScalarVariable(
83+
scalarVariable: DeclarableVariable,
84+
scalar: GenValue.Scalar.Components,
85+
current: CodeGen.Current
86+
) = current {
87+
fun ScopeCtx.syncComponent(index: Int, isActualValues: List<Boolean>, value: GenValue.Double) {
88+
if(!isActualValues[index]) {
89+
val target = scalarVariable.propertyVariable("val", DoubleType.arrayType())
90+
target[index.v] = value.v
91+
}
92+
}
93+
94+
current.scope.deferred(Resolvable.ListPlaceholder(
95+
scalar.a.isActual.value,
96+
scalar.b.isActual.value,
97+
scalar.c.isActual.value,
98+
scalar.d.isActual.value
99+
)) { isActualValues ->
100+
syncComponent(0, isActualValues, scalar.a)
101+
syncComponent(1, isActualValues, scalar.b)
102+
syncComponent(2, isActualValues, scalar.c)
103+
syncComponent(3, isActualValues, scalar.d)
104+
}
105+
}
106+
107+
fun runtimeScalarVariable(
108+
variableName: String,
109+
scalar: GenValue.Scalar,
110+
current: CodeGen.Current
111+
) = current {
112+
when(scalar) {
113+
is GenValue.Scalar.Components -> {
114+
val variable = uniqueVariable(variableName, Scalar(scalar, current))
115+
syncScalarVariable(variable, scalar, current)
116+
117+
variable
118+
}
119+
is GenValue.Scalar.Inst -> scalar.value.v
120+
}
121+
}
122+
81123
val Rect = Type("Rect", "org.opencv.core")
82124

83125
fun toRectInst(rect: GenValue.Rect, langHolder: CodeGen.LanguageHolder) = when (rect) {
@@ -121,19 +163,11 @@ object JvmOpenCv {
121163
return current {
122164
when (line) {
123165
is GenValue.LineParameters.Components -> {
124-
val color = uniqueVariable(
125-
"lineColor", Scalar.new(
126-
line.color.a.v,
127-
line.color.b.v,
128-
line.color.c.v,
129-
line.color.d.v
130-
)
131-
)
132-
166+
val color = runtimeScalarVariable("lineColor", line.color, current)
133167
val thickness = uniqueVariable("lineThickness", line.thickness.v)
134168

135169
group {
136-
public(color)
170+
public(color as DeclarableVariable)
137171
public(thickness)
138172
}
139173

PaperVision/src/main/kotlin/org/deltacv/papervision/codegen/dsl/ScopeCtx.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -94,10 +94,10 @@ class ScopeCtx(val scope: Scope) : LanguageCtx(scope.language) {
9494
infix fun DeclarableVariable.set(v: Value) =
9595
scope.variableSet(this, v)
9696

97-
fun DeclarableVariable.arraySet(index: Value, v: Value) =
97+
fun Value.arraySet(index: Value, v: Value) =
9898
scope.arraySet(this, index, v)
9999

100-
operator fun DeclarableVariable.set(index: Value, v: Value) = arraySet(index, v)
100+
operator fun Value.set(index: Value, v: Value) = arraySet(index, v)
101101

102102
infix fun DeclarableVariable.instanceSet(v: Value) =
103103
scope.instanceVariableSet(this, v)

PaperVision/src/main/kotlin/org/deltacv/papervision/codegen/language/BaseLanguage.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -144,8 +144,8 @@ open class BaseLanguage(
144144

145145
override fun variableSetDeclaration(variable: DeclarableVariable, v: Value) = "${variable.name} = ${v.value!!}${semicolonIfNecessary()}"
146146

147-
override fun arrayVariableSetDeclaration(variable: DeclarableVariable, index: Value, v: Value) =
148-
"${variable.name}[${index.value}] = ${v.value}${semicolonIfNecessary()}"
147+
override fun arrayValueSetDeclaration(value: Value, index: Value, v: Value) =
148+
"${value.value}[${index.value}] = ${v.value}${semicolonIfNecessary()}"
149149

150150
override fun instanceVariableSetDeclaration(variable: DeclarableVariable, v: Value) = "this.${variable.name} = ${v.value!!}${semicolonIfNecessary()}"
151151

PaperVision/src/main/kotlin/org/deltacv/papervision/codegen/language/Language.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,7 @@ interface Language : ValueBuilder, CodeGen.LanguageHolder {
167167
fun localVariableDeclaration(variable: DeclarableVariable, isFinal: Boolean = false): String
168168

169169
fun variableSetDeclaration(variable: DeclarableVariable, v: Value): String
170-
fun arrayVariableSetDeclaration(variable: DeclarableVariable, index: Value, v: Value): String
170+
fun arrayValueSetDeclaration(value: Value, index: Value, v: Value): String
171171
fun instanceVariableSetDeclaration(variable: DeclarableVariable, v: Value): String
172172
fun methodCallDeclaration(className: Type, methodName: String, vararg parameters: Value): String
173173
fun methodCallDeclaration(callee: Value, methodName: String, vararg parameters: Value): String

PaperVision/src/main/kotlin/org/deltacv/papervision/codegen/resolve/Resolvable.kt

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -149,18 +149,18 @@ sealed class Resolvable<T> {
149149
}
150150
})
151151

152-
data class PairPlaceholder<P1, P2>(
153-
val first: Resolvable<P1>,
154-
val second: Resolvable<P2>
155-
) : Placeholder<Pair<P1, P2>>(resolver = {
156-
val depValue1 = first.resolve()
157-
val depValue2 = second.resolve()
158-
if (depValue1 != null && depValue2 != null) {
159-
Pair(depValue1, depValue2)
152+
class ListPlaceholder<T>(
153+
dependencies: List<Resolvable<T>>,
154+
) : Placeholder<List<T>>(resolver = {
155+
val vals = dependencies.map { it.resolve() }
156+
if(vals.all { it != null }) {
157+
vals.map { it!! }
160158
} else {
161159
null
162160
}
163-
})
161+
}) {
162+
constructor(vararg dependencies: Resolvable<T>) : this(dependencies.toList())
163+
}
164164
}
165165

166166

PaperVision/src/main/kotlin/org/deltacv/papervision/node/vision/imageproc/AverageColorNode.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ class AverageColorNode : DrawNode<AverageColorNode.Session>() {
6161
session.output = GenValue.Scalar.Inst(outputVar.resolved())
6262

6363
for (i in 0 until 4) {
64-
session.elementGenValues[i] = GenValue.Double.Runtime(
64+
session.outputElements[i] = GenValue.Double.Runtime(
6565
outputVar.resolved().map { it.propertyValue("val", DoubleType.arrayType())[i.v, DoubleType] }
6666
)
6767
}
@@ -85,7 +85,7 @@ class AverageColorNode : DrawNode<AverageColorNode.Session>() {
8585
session.output = GenValue.Scalar.Inst(outputVar.resolved())
8686

8787
for (i in 0 until 4) {
88-
session.elementGenValues[i] = GenValue.Double.Runtime(
88+
session.outputElements[i] = GenValue.Double.Runtime(
8989
outputVar.resolved().map { it[i.v, DoubleType] }
9090
)
9191
}
@@ -101,7 +101,7 @@ class AverageColorNode : DrawNode<AverageColorNode.Session>() {
101101
else -> {
102102
val index = output.findIndex(attrib)
103103
if (index != null) {
104-
GenValue.Double.Runtime.defer { current.sessionOf(this)?.elementGenValues?.get(index) }
104+
GenValue.Double.Runtime.defer { current.sessionOf(this)?.outputElements?.get(index) }
105105
} else noValue(attrib)
106106
}
107107
}
@@ -120,7 +120,7 @@ class AverageColorNode : DrawNode<AverageColorNode.Session>() {
120120

121121
class Session : CodeGenSession {
122122
lateinit var output: GenValue.Scalar.Inst
123-
val elementGenValues = mutableMapOf<Int, GenValue.Double.Runtime>()
123+
val outputElements = mutableMapOf<Int, GenValue.Double.Runtime>()
124124
}
125125

126126
}

PaperVision/src/main/kotlin/org/deltacv/papervision/node/vision/overlay/LineParametersNode.kt

Lines changed: 9 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@ import org.deltacv.papervision.attribute.vision.structs.ScalarAttribute
2626
import org.deltacv.papervision.codegen.CodeGen
2727
import org.deltacv.papervision.codegen.CodeGenSession
2828
import org.deltacv.papervision.codegen.GenValue
29+
import org.deltacv.papervision.codegen.build.DeclarableVariable
30+
import org.deltacv.papervision.codegen.build.language.GenPreviz
2931
import org.deltacv.papervision.codegen.build.language.jvm.JvmOpenCv
3032
import org.deltacv.papervision.codegen.dsl.polyglot
3133
import org.deltacv.papervision.codegen.language.BaseLanguage
@@ -69,31 +71,17 @@ class LineParametersNode : DrawNode<LineParametersNode.Session>() {
6971
val lineColorValue = lineColor.genValue(current)
7072
val lineThicknessValue = lineThickness.genValue(current)
7173

72-
val lineColorVar = uniqueVariable("lineColor", JvmOpenCv.Scalar(lineColorValue, current))
73-
val lineThicknessVar = uniqueVariable("lineThickness", lineThicknessValue.v)
74+
val lineColorVar = JvmOpenCv.runtimeScalarVariable("lineColor", lineColorValue, current)
75+
val lineThicknessVar = GenPreviz.toPrevizInt(
76+
lineThicknessValue, lineThickness, current,
77+
variableName = "lineThickness"
78+
)
7479

7580
group {
76-
public(lineColorVar, lineColor.tunerLabel())
77-
public(lineThicknessVar, lineThickness.tunerLabel())
81+
if(lineColorVar is DeclarableVariable) public(lineColorVar, lineColor.tunerLabel())
7882
}
7983

80-
if(lineColorValue is GenValue.Scalar.Inst || lineThicknessValue is GenValue.Int.Runtime) {
81-
current.scope {
82-
nameComment()
83-
84-
// if these are inst/runtime values, we need to set them to the line variables
85-
// to reflect any changes that might have happened since it was first set
86-
// (e.g. through a tuner)
87-
if(lineColorValue is GenValue.Scalar.Inst) {
88-
lineColorVar instanceSet JvmOpenCv.Scalar(lineColorValue, current)
89-
}
90-
if(lineThicknessValue is GenValue.Int.Runtime) {
91-
lineThicknessVar instanceSet lineThickness.genValue(current).v
92-
}
93-
}
94-
}
95-
96-
session.lineParameters = GenValue.LineParameters.Runtime(GenValue.Scalar.Inst(lineColorVar.resolved()), GenValue.Int.Runtime(lineThicknessVar.resolved()))
84+
session.lineParameters = GenValue.LineParameters.Runtime(GenValue.Scalar.Inst(lineColorVar.resolved()), lineThicknessVar.toRuntime(current))
9785
}
9886

9987
session

0 commit comments

Comments
 (0)