func NewHeightMapRenderer() *renderstuff.Renderer { return renderstuff.NewRenderer( helpers.MakeProgram("HeightMap.vs", "HeightMap.fs"), "height map", nil, HeightMapUpdate, ) }
func NewLineRenderer() *LineRenderer { renderer := LineRenderer{} renderer.Prog = helpers.MakeProgram("Line.vs", "Line.fs") renderer.Prog.Use() renderer.vao = gl.GenVertexArray() renderer.vao.Bind() helpers.BindLocations("line", renderer.Prog, &renderer.RenLoc) renderer.buffer = gl.GenBuffer() renderer.buffer.Bind(gl.ARRAY_BUFFER) helpers.SetAttribPointers(&renderer.RenLoc, &debug.LineVertex{}, false) fmt.Println("Line render location ", renderer.RenLoc) return &renderer }
func NewScreenQuadRenderer() (this *renderstuff.Renderer) { program := helpers.MakeProgram("ScreenQuad.vs", "ScreenQuad.fs") return renderstuff.NewRenderer(program, "ScreenQuad", nil, nil) }
func NewMeshRenderer() (this *renderstuff.Renderer) { return renderstuff.NewRenderer(helpers.MakeProgram("Mesh.vs", "Mesh.fs"), "mesh", nil, nil) }
func NewPortalRenderer() *renderstuff.Renderer { program := helpers.MakeProgram("Portal.vs", "Portal.fs") return renderstuff.NewRenderer(program, "Portal", nil, nil) }
func NewSurfaceWaterRenderer() *renderstuff.Renderer { program := helpers.MakeProgram("Water.vs", "Water.fs") name := "Water" return renderstuff.NewRenderer(program, name, nil, WaterUpdate) }
func NewTreeRenderer() *renderstuff.Renderer { program := helpers.MakeProgram("Sprite.vs", "Sprite.fs") return renderstuff.NewRenderer(program, "TreeSprite", nil, TreeUpdate) }
func NewSkyboxRenderer() *renderstuff.Renderer { program := helpers.MakeProgram("Skybox.vs", "Skybox.fs") return renderstuff.NewRenderer(program, "Skybox", nil, nil) }
func NewParticleSystem(w *gamestate.World, numParticles int, Origin mgl.Vec3, initialSpeed, MaxLifetime float32) *ParticleSystem { vertices := make([]ParticleVertex, numParticles) directions := make([]NonTransformBuffer, numParticles) for i := range vertices { dir := mgl.Vec3{rand.Float32()*2 - 1, rand.Float32()*2 - 1, rand.Float32()*2 - 1} for dir.Len() > 1 { dir = mgl.Vec3{rand.Float32()*2 - 1, rand.Float32()*2 - 1, rand.Float32()*2 - 1} } dir = dir.Mul(initialSpeed) vertices[i] = ParticleVertex{ Pos1: Origin, Pos2: Origin.Sub(dir), Lifetime: rand.Float32() * MaxLifetime, } directions[i] = NonTransformBuffer{dir} } buffer1, buffer2, nonTransformBuffer := gl.GenBuffer(), gl.GenBuffer(), gl.GenBuffer() nonTransformBuffer.Bind(gl.ARRAY_BUFFER) gl.BufferData(gl.ARRAY_BUFFER, helpers.ByteSizeOfSlice(directions), directions, gl.STATIC_DRAW) buffer1.Bind(gl.ARRAY_BUFFER) gl.BufferData(gl.ARRAY_BUFFER, helpers.ByteSizeOfSlice(vertices), vertices, gl.STREAM_DRAW) buffer2.Bind(gl.ARRAY_BUFFER) gl.BufferData(gl.ARRAY_BUFFER, helpers.ByteSizeOfSlice(vertices), uintptr(0), gl.STREAM_DRAW) shapeData := CreateShapeDataBuffer() TransformProg := gl.CreateProgram() shader := helpers.MakeShader(gl.VERTEX_SHADER, "ParticleTFF.vs") TransformProg.AttachShader(shader) TransformProg.TransformFeedbackVaryings([]string{"v_Pos1", "v_Pos2", "v_Lifetime"}, gl.INTERLEAVED_ATTRIBS) TransformProg.Link() shader.Delete() TransformProg.Use() TransformLoc := ProgramLocations{} helpers.BindLocations("particle transform", TransformProg, &TransformLoc) renderProgram := helpers.MakeProgram("Particle.vs", "Particle.fs") renderProgram.Use() RenderLoc := RenderProgramLocations{} helpers.BindLocations("particle render", renderProgram, &RenderLoc) vaoTff1 := gl.GenVertexArray() vaoTff2 := gl.GenVertexArray() vaoRender1 := gl.GenVertexArray() vaoRender2 := gl.GenVertexArray() ps := ParticleSystem{ TransformProg: TransformProg, TransformLoc: TransformLoc, RenderProg: renderProgram, RenderLoc: RenderLoc, VaoTff1: vaoTff1, VaoTff2: vaoTff2, VaoRender1: vaoRender1, VaoRender2: vaoRender2, Data1: buffer1, Data2: buffer2, ShapeData: shapeData, NonTransformBuffer: nonTransformBuffer, NumParticles: numParticles, Origin: Origin, Gravity: -9.81 / 200, InitialSpeed: initialSpeed, MaxLifetime: MaxLifetime, } min_h, max_h := w.HeightMap.Bounds() W := float32(w.HeightMap.W) H := float32(w.HeightMap.H) TransformProg.Use() ps.SetUniforms() ps.SetVaos() TransformProg.Use() ps.TransformLoc.HeightMap.Uniform1i(constants.TextureHeightMap) ps.TransformLoc.LowerBound.Uniform3f(0, 0, min_h) ps.TransformLoc.UpperBound.Uniform3f(W, H, max_h) return &ps }