Parcourir la source

implemented user-definable render order

Daniel Salvadori il y a 7 ans
Parent
commit
4aed0859ab
2 fichiers modifiés avec 35 ajouts et 11 suppressions
  1. 23 7
      graphic/graphic.go
  2. 12 4
      renderer/renderer.go

+ 23 - 7
graphic/graphic.go

@@ -17,12 +17,13 @@ import (
 // It is the base type used by other graphics such as lines, line_strip,
 // points and meshes.
 type Graphic struct {
-	core.Node                     // Embedded Node
-	igeom      geometry.IGeometry // Associated IGeometry
-	materials  []GraphicMaterial  // Materials
-	mode       uint32             // OpenGL primitive
-	renderable bool               // Renderable flag
-	cullable   bool               // Cullable flag
+	core.Node                      // Embedded Node
+	igeom       geometry.IGeometry // Associated IGeometry
+	materials   []GraphicMaterial  // Materials
+	mode        uint32             // OpenGL primitive
+	renderable  bool               // Renderable flag
+	cullable    bool               // Cullable flag
+	renderOrder int                // Render order
 
 	mvm  math32.Matrix4 // Cached ModelView matrix
 	mvpm math32.Matrix4 // Cached ModelViewProjection matrix
@@ -83,7 +84,7 @@ func (gr *Graphic) GetGraphic() *Graphic {
 // a pointer to the geometry associated with this graphic.
 func (gr *Graphic) GetGeometry() *geometry.Geometry {
 
-	return gr.igeom.GetGeometry()
+	return gr.igeom.GetGeometry() // TODO return igeom
 }
 
 // Dispose overrides the embedded Node Dispose method.
@@ -123,6 +124,21 @@ func (gr *Graphic) Cullable() bool {
 	return gr.cullable
 }
 
+// SetRenderOrder sets the render order of the object.
+// All objects have renderOrder of 0 by default.
+// To render before renderOrder 0 set a lower renderOrder e.g. -1.
+// To render after renderOrder 0 set a higher renderOrder e.g. 1
+func (gr *Graphic) SetRenderOrder(order int) {
+
+	gr.renderOrder = order
+}
+
+// RenderOrder returns the render order of the object.
+func (gr *Graphic) RenderOrder() int {
+
+	return gr.renderOrder
+}
+
 // AddMaterial adds a material for the specified subset of vertices.
 // If the material applies to all vertices, start and count must be 0.
 func (gr *Graphic) AddMaterial(igr IGraphic, imat material.IMaterial, start, count int) {

+ 12 - 4
renderer/renderer.go

@@ -136,14 +136,14 @@ func (r *Renderer) Stats() Stats {
 	return r.stats
 }
 
-// SetSortObjects sets whether objects will be Z-sorted before rendering.
-func (r *Renderer) SetSortObjects(sort bool) {
+// SetObjectSorting sets whether objects will be sorted before rendering.
+func (r *Renderer) SetObjectSorting(sort bool) {
 
 	r.sortObjects = sort
 }
 
-// SortObjects returns whether objects will be Z-sorted before rendering.
-func (r *Renderer) SortObjects() bool {
+// ObjectSorting returns whether objects will be sorted before rendering.
+func (r *Renderer) ObjectSorting() bool {
 
 	return r.sortObjects
 }
@@ -301,6 +301,14 @@ func (r *Renderer) renderScene(iscene core.INode, icam camera.ICamera) error {
 			sort.Slice(grmats, func(i, j int) bool {
 				gr1 := grmats[i].GetGraphic().GetGraphic()
 				gr2 := grmats[j].GetGraphic().GetGraphic()
+
+				// Check for user-supplied render order
+				rO1 := gr1.RenderOrder()
+				rO2 := gr2.RenderOrder()
+				if rO1 != rO2 {
+					return  rO1 < rO2
+				}
+
 				mvm1 := gr1.ModelViewMatrix()
 				mvm2 := gr2.ModelViewMatrix()
 				g1pos := gr1.Position()