Преглед на файлове

geometry shader support

leonsal преди 8 години
родител
ревизия
c406664936
променени са 3 файла, в които са добавени 94 реда и са изтрити 5 реда
  1. 8 0
      renderer/renderer.go
  2. 47 4
      renderer/shader/shaders.go
  3. 39 1
      renderer/shaman.go

+ 8 - 0
renderer/renderer.go

@@ -61,6 +61,14 @@ func (r *Renderer) AddProgram(name, vertex, frag string) error {
 	return r.shaman.AddProgram(name, vertex, frag)
 }
 
+// SetProgramShader sets the shader type and name for a previously specified program name.
+// Returns error if the specified program or shader name not found or
+// if an invalid shader type was specified.
+func (r *Renderer) SetProgramShader(pname string, stype int, sname string) error {
+
+	return r.shaman.SetProgramShader(pname, stype, sname)
+}
+
 func (r *Renderer) Render(iscene core.INode, icam camera.ICamera) error {
 
 	// Updates world matrices of all scene nodes

+ 47 - 4
renderer/shader/shaders.go

@@ -4,22 +4,33 @@
 
 package shader
 
-import ()
+import (
+	"fmt"
 
+	"github.com/g3n/engine/gls"
+)
+
+// ProgramInfo contains information for a registered program name
 type ProgramInfo struct {
-	Vertex string // Vertex shader name
-	Frag   string // Fragment shader name
+	Vertex   string // Vertex shader name
+	Frag     string // Fragment shader name
+	Geometry string // Geometry shader name (maybe an empty string)
 }
 
+// Internal global maps of shader chunks, shader sources and programs
 var chunks = map[string]string{}
 var shaders = map[string]string{}
 var programs = map[string]ProgramInfo{}
 
+// Chunks returns a map with all registered shader chunks names
+// associated with its glsl source code.
 func Chunks() map[string]string {
 
 	return chunks
 }
 
+// Shaders returns a map with all registered shader names
+// associated with
 func Shaders() map[string]string {
 
 	return shaders
@@ -40,7 +51,39 @@ func AddShader(name, source string) {
 	shaders[name] = source
 }
 
+// AddProgram adds a program name to the global program registry
 func AddProgram(name, vertexName, fragName string) {
 
-	programs[name] = ProgramInfo{vertexName, fragName}
+	programs[name] = ProgramInfo{vertexName, fragName, ""}
+}
+
+// SetProgramShader sets the shader type and name for a previously
+// specified program name.
+// It panics if the specified program or shader name not found or
+// if an invalid shader type was specified.
+func SetProgramShader(pname string, stype int, sname string) {
+
+	// Checks if program name is valid
+	pinfo, ok := programs[pname]
+	if !ok {
+		panic(fmt.Sprintf("Program name:%s not found", pname))
+	}
+
+	// Checks if shader name is valid
+	_, ok = shaders[sname]
+	if !ok {
+		panic(fmt.Sprintf("Shader name:%s not found", sname))
+	}
+
+	// Sets the program shader name for the specified type
+	switch stype {
+	case gls.VERTEX_SHADER:
+		pinfo.Vertex = sname
+	case gls.FRAGMENT_SHADER:
+		pinfo.Frag = sname
+	case gls.GEOMETRY_SHADER:
+		pinfo.Geometry = sname
+	default:
+		panic("Invalid shader type")
+	}
 }

+ 39 - 1
renderer/shaman.go

@@ -69,6 +69,8 @@ func (sm *Shaman) Init(gs *gls.GLS) {
 	})
 }
 
+// AddDefaultShaders adds to the shader manager all default
+// shaders statically registered.
 func (sm *Shaman) AddDefaultShaders() error {
 
 	for name, source := range shader.Chunks() {
@@ -91,6 +93,7 @@ func (sm *Shaman) AddDefaultShaders() error {
 	return nil
 }
 
+// AddChunk adds a shader chunk with the specified name and source code
 func (sm *Shaman) AddChunk(name, source string) error {
 
 	tmpl := sm.chunks.New(name)
@@ -101,6 +104,7 @@ func (sm *Shaman) AddChunk(name, source string) error {
 	return nil
 }
 
+// AddShader adds a shader program with the specified name and source code
 func (sm *Shaman) AddShader(name, source string) error {
 
 	// Clone chunks template so any shader can use
@@ -119,9 +123,43 @@ func (sm *Shaman) AddShader(name, source string) error {
 	return nil
 }
 
+// AddProgram adds a program with the specified name and associated vertex
+// and fragment shaders names (previously registered)
+// To specify other types of shaders for a program use SetProgramShader()
 func (sm *Shaman) AddProgram(name, vertexName, fragName string) error {
 
-	sm.proginfo[name] = shader.ProgramInfo{vertexName, fragName}
+	sm.proginfo[name] = shader.ProgramInfo{Vertex: vertexName, Frag: fragName}
+	return nil
+}
+
+// SetProgramShader sets the shader type and name for a previously specified program name.
+// Returns error if the specified program or shader name not found or
+// if an invalid shader type was specified.
+func (sm *Shaman) SetProgramShader(pname string, stype int, sname string) error {
+
+	// Checks if program name is valid
+	pinfo, ok := sm.proginfo[pname]
+	if !ok {
+		return fmt.Errorf("Program name:%s not found", pname)
+	}
+
+	// Checks if shader name is valid
+	_, ok = sm.shaders[sname]
+	if !ok {
+		return fmt.Errorf("Shader name:%s not found", sname)
+	}
+
+	// Sets the program shader name for the specified type
+	switch stype {
+	case gls.VERTEX_SHADER:
+		pinfo.Vertex = sname
+	case gls.FRAGMENT_SHADER:
+		pinfo.Frag = sname
+	case gls.GEOMETRY_SHADER:
+		pinfo.Geometry = sname
+	default:
+		return fmt.Errorf("Invalid shader type")
+	}
 	return nil
 }