lambdacube-compiler icon indicating copy to clipboard operation
lambdacube-compiler copied to clipboard

error C1008: undefined variable "translateBefore4"

Open ghost opened this issue 5 years ago • 1 comments

Compiled the following program.

makeFrame (time :: Float)
          (vertexstream :: PrimitiveStream Triangle ((Vec 4 Float)))

          = imageFrame (emptyDepthImage 1, emptyColorImage navy)
  `overlay` fragments
  where
    projmat = perspective 0.1 100.0 (30 * pi / 180) 1.0
          .*. lookat (V3 3.0 1.3 0.3) (V3 0.0 0.0 0.0) (V3 0.0 1.0 0.0)
          .*. rotMatrixY (pi / 24.0 * time)
          .*. translateBefore4 (V3 0.5 0.5 0.5)

    fragments =
          vertexstream
        & mapPrimitives (\((x)) -> (scale 0.5 (projmat *. x), x))
        & rasterizePrimitives (TriangleCtx CullNone (PolygonLine 1.0) NoOffset LastVertex) ((Smooth))
        & accumulateWith (DepthOp Less True, ColorOp NoBlending (V4 True True True True))

cube = map (\v -> V4 v%x v%y v%z 1)
    [ V3 0 0 0, V3 1 0 0, V3 0 1 0
    , V3 0 1 0, V3 1 1 0, V3 1 0 0
    , V3 0 0 0, V3 0 0 1, V3 0 1 1
    , V3 0 0 0, V3 0 1 0, V3 0 1 1
    , V3 1 0 0, V3 1 0 1, V3 1 1 1
    , V3 1 0 0, V3 1 1 0, V3 1 1 1
    , V3 0 0 0, V3 0 0 1, V3 1 0 0
    , V3 0 0 1, V3 1 0 1, V3 1 0 0
    , V3 0 1 0, V3 0 1 1, V3 1 1 0
    , V3 0 1 1, V3 1 1 1, V3 1 1 0
    , V3 0 0 1, V3 1 0 1, V3 0 1 1
    , V3 0 1 1, V3 1 1 1, V3 1 0 1
    ]

cubeStream = fetchArrays @Triangle ((cube))

main = renderFrame $
   makeFrame (Uniform "time")
             cubeStream

The generated vertex shader

#version 330 core
vec4 texture2D(sampler2D s,vec2 uv) {
    return texture(s,uv);
}
uniform float time;
in vec4 vi1;
smooth out vec4 vo1;
vec4 ext0_Float_3(vec3 z0) {
    return vec4 ((z0).x,(z0).y,(z0).z,0.0);
}
vec3 neg_VecSFloat3(vec3 z0) {
    return - (z0);
}
mat4 lookat(vec3 z0,vec3 z1,vec3 z2) {
    return (transpose (mat4 (ext0_Float_3 (normalize (cross (z2
                                                            ,normalize ((z0) - (z1)))))
                            ,ext0_Float_3 (cross (normalize ((z0) - (z1))
                                                 ,normalize (cross (z2,normalize ((z0) - (z1))))))
                            ,ext0_Float_3 (normalize ((z0) - (z1)))
                            ,vec4 (0.0,0.0,0.0,1.0)))) * (translateBefore4 (neg_VecSFloat3 (z0)));
}
mat4 perspective(float z0,float z1,float z2,float z3) {
    return mat4 (vec4 (((2.0) * (z0)) / (((z3) * ((z0) * (tan
                      ((z2) / (2.0))))) - ((0.0) - ((z3) * ((z0) * (tan ((z2) / (2.0)))))))
                      ,0.0
                      ,0.0
                      ,0.0)
                ,vec4 (0.0
                      ,((2.0) * (z0)) / (((z0) * (tan ((z2) / (2.0)))) - ((0.0) - ((z0) * (tan
                      ((z2) / (2.0))))))
                      ,0.0
                      ,0.0)
                ,vec4 ((((z3) * ((z0) * (tan ((z2) / (2.0))))) + ((0.0) - ((z3) * ((z0) * (tan
                      ((z2) / (2.0))))))) / (((z3) * ((z0) * (tan
                      ((z2) / (2.0))))) - ((0.0) - ((z3) * ((z0) * (tan ((z2) / (2.0)))))))
                      ,(((z0) * (tan ((z2) / (2.0)))) + ((0.0) - ((z0) * (tan
                      ((z2) / (2.0)))))) / (((z0) * (tan ((z2) / (2.0)))) - ((0.0) - ((z0) * (tan
                      ((z2) / (2.0))))))
                      ,(0.0) - (((z1) + (z0)) / ((z1) - (z0)))
                      ,-1.0)
                ,vec4 (0.0,0.0,(0.0) - ((((2.0) * (z1)) * (z0)) / ((z1) - (z0))),0.0));
}
mat4 rotMatrixY(float z0) {
    return mat4 (vec4 (cos (z0),0.0,(0.0) - (sin (z0)),0.0)
                ,vec4 (0.0,1.0,0.0,0.0)
                ,vec4 (sin (z0),0.0,cos (z0),0.0)
                ,vec4 (0.0,0.0,0.0,1.0));
}
vec4 scale(float z0,vec4 z1) {
    return (z1) * (vec4 (z0,z0,z0,1.0));
}
mat4 translateBefore4(vec3 z0) {
    return mat4 (vec4 (1.0,0.0,0.0,0.0)
                ,vec4 (0.0,1.0,0.0,0.0)
                ,vec4 (0.0,0.0,1.0,0.0)
                ,vec4 ((z0).x,(z0).y,(z0).z,1.0));
}
void main() {
    gl_Position = scale (0.5
                        ,((((perspective (0.1,100.0,0.5235987755982988,1.0)) * (lookat (vec3 (3.0
                                                                                             ,1.3
                                                                                             ,0.3)
                                                                                       ,vec3 (0.0,0.0,0.0)
                                                                                       ,vec3 (0.0,1.0,0.0)))) * (rotMatrixY
                        ((0.1308996938995747) * (time)))) * (translateBefore4 (vec3 (0.5
                                                                                    ,0.5
                                                                                    ,0.5)))) * (vi1));
    vo1 = vi1;
}

Manually placing translateBefore4 before lookat in the generated vertex shader resolves the issue.

ghost avatar Mar 23 '19 04:03 ghost

It seems that CoreToIR's fixFuncs function does not calculate the dependency graph correctly. Instead of a custom implementation it would be better to use Data.Graph.topSort.

csabahruska avatar Apr 16 '19 17:04 csabahruska