]> git.mxchange.org Git - flightgear.git/commitdiff
From Till Busch - reload shaders command
authortimoore <timoore>
Sat, 8 Aug 2009 10:20:32 +0000 (10:20 +0000)
committerTim Moore <timoore@redhat.com>
Mon, 10 Aug 2009 05:14:38 +0000 (07:14 +0200)
Also, more documentation for effects.

docs-mini/README.effects
src/Main/fg_commands.cxx

index d5aa72721ca039dda05f58a2e166b8e54af091a5..60b30386aa30f157e5e16273639d32597a4208f9 100644 (file)
-<?xml version="1.0" encoding="utf-8">
-<!--
-   An effect consists of parameters and techniques. The "parameters"
-   section of an effect is a tree of values that describe, abstractly,
-   the graphical appearence of objects that use the effect. Techniques
-   refer to these parameters and use them to set OpenGL state or to
-   set parameters for shader programs. Parameters can be declared to
-   have a dynamic variance, which means that if their value is changed
-   the corresponding value in the technique will be changed too.
+Effects describe the graphical appearance of 3d objects and scenery in
+FlightGear. The main motivation for effects is to support OpenGL
+shaders and to provide different implementations for graphics hardware
+of varying capabilities. Effects are similar to DirectX effects files
+and Ogre3D material scripts.
 
-   A technique can contain a predicate that describes the OpenGL
-   functionality required to support the technique. The first
-   technique with a valid predicate in the list of techniques is used
-   to set up the graphics state of the effect. A technique with no
-   predicate is always assumed to be valid.
+An effect is a property list. The property list syntax is extended
+with new "vec3d" and "vec4d" types to support common computer graphics
+values. Effects are read from files with a ".eff" extension or can be
+created on-the-fly by FlightGear at runtime.  An effect consists of a
+"parameters" section followed by "technique" descriptions.  The
+"parameters" section is a tree of values that describe, abstractly,
+the graphical appearence of objects that use the effect. Techniques
+refer to these parameters and use them to set OpenGL state or to set
+parameters for shader programs.
 
-   A technique can consist of several passes, which are run in
-   sequence.
+Parameters can be declared to have a dynamic variance, which means
+that if their value is changed the corresponding value in the
+technique will be changed too. [TO BE IMPLEMENTED]
+
+A technique can contain a predicate that describes the OpenGL
+functionality required to support the technique. The first
+technique with a valid predicate in the list of techniques is used
+to set up the graphics state of the effect. A technique with no
+predicate is always assumed to be valid. The predicate is written in a
+little expression language that supports the following primitives:
+
+and, or, equal, less, less-equal
+glversion - returns the version number of OpenGL
+extension-supported - returns true if an OpenGL extension is supported
+property - returns the boolean value of a property
+
+A technique can consist of several passes. A pass is basically an Open
+Scene Graph StateSet. Ultimately all OpenGL and OSG modes and state
+attributes  will be setable in a technique. The following are
+are currently implemented:
+lighting - true, false
+shade-model - flat, smooth
+cull-face - front, back, front-back
+rendering-hint - (OSG) opaque, transparent
+render-bin - children: bin-number, bin-name
+material - children: ambient, ambient-front, ambient-back, diffuse,
+diffuse-front, diffuse-back, specular, specular-front,
+specular-back, emissive, emissive-front, emissive-back, shininess,
+shininess-front, shininess-back, color-mode
+blend - true, false
+alpha-test - true, false
+texture-unit - has several child properties:
+       unit - The number of an OpenGL texture unit
+        type - This is either an OpenGL texture type or the name of a
+        builtin texture. Currently supported OpenGL types are 1d, 2d,
+        3d which have the following common parameters:
+               image (file name)
+                filter
+                mag-filter
+                wrap-s
+                wrap-t
+                wrap-r
+        The following builtin types are supported:
+                white - 1 pixel white texture
+                noise - a 3d noise texture
+        environment
+                mode
+                color
+program
+        vertex-shader
+        fragment-shader
+uniform
+        name
+        type - float, float-vec3, float-vec4, sampler-1d, sampler-2d,
+        sampler-3d
+polygon-mode
+front - fill, line, point
+back - fill, line, point
+
+One feature not fully illustrated in the sample below is that
+effects can inherit from each other. The parent effect is listed in
+the "inherits-from" form. The child effect's property tree is
+overlaid over that of the parent. Nodes that have the same name and
+property index -- set by the "n=" attribute in the property tag --
+are recursively merged. Leaf property nodes from the child have
+precedence.  This means that effects that inherit from the example
+effect below could be very short, listing just new
+parameters and adding nothing to the techniques section;
+alternatively, a technique could be altered or customized in a
+child, listing (for example) a different shader program. Terrain
+materials work in this way: for each material type in materials.xml
+an effect is created that inherits from a single default terrain
+effect. The parameters section of the effect is filled in using the
+ambient, diffuse, specular, emissive, shininess, and transparent
+fields of the material. Seperate effects are created for each texture
+variant of a material.
+
+Material animations will be implemented by creating a new effect
+that inherits from one in a model, overriding the parameters that
+will be animated.
 
-   One feature not fully illustrated in the sample below is that
-   effects can inherit from each other. The parent effect is listed in
-   the "inherits-from" form. The child effect's property tree is
-   overlaid over that of the parent. This means that effects that
-   inherit from the example "default effect" below could be very
-   short, listing just new parameters and adding nothing to the
-   techniques section; alternatively, a technique could be altered or
-   customized in a child, listing (for example) a different shader
-   program. Terrain materials work in this way: for each material type
-   in materials.xml an effect is created that inherits from a single
-   default terrain effect. The parameters section of the effect is
-   filled in using the ambient, diffuse, etc. fields of the material.
 
-   Material animations will be implemented by creating a new effect
-   that inherits from one in a model, overriding the parameters that
-   will be animated.  
-   
-   Ultimately all OpenGL state will be setable in a technique. These
-   attributes and modes are currently implemented:
-   lighting - true, false
-   shade-model - flat, smooth
-   cull-face - front, back, front-back
-   rendering-hint - (OSG) opaque, transparent
-   render-bin - children: bin-number, bin-name
-   material - children: ambient, ambient-front, ambient-back, diffuse,
-   diffuse-front, diffuse-back, specular, specular-front,
-   specular-back, emissive, emissive-front, emissive-back, shininess,
-   shininess-front, shininess-back, color-mode
-   blend - true, false
-   alpha-test - true, false
-   texture-unit - 
-       unit
-       texture2d
-               image (file name)
-               filter
-               mag-filter
-               wrap-s
-               wrap-t
-               wrap-r
-       environment
-               mode
-               color
-   program
-       vertex-shader
-       fragment-shader
-   uniform
-       name
-       type - float, float-vec3, float-vec4, sampler-1d, sampler-2d,
-              sampler-3d
-   polygon-mode
-       front - fill, line, point
-       back - fill, line, point
-  -->
 <PropertyList>
   <effect>
     <name>city</name>
         <shininess>1.2</shininess>
       </material>
       <texture n="0">
-        <texture2d>
-          <image>city.png</image>
-          <filter>linear-mipmap-linear</filter>
-          <!-- also repeat -->
-          <wrap-s>clamp</wrap-s>
-          <wrap-t>clamp-to-edge</wrap-t>
-          <!--
-             <wrap-r>clamp-to-border</wrap-r>
-             -->
-          <!-- float, signed-integer, integer -->
-          <internal-format>normalized</internal-format>
-        </texture2d>
+        <image>city.png</image>
+        <filter>linear-mipmap-linear</filter>
+        <!-- also repeat -->
+        <wrap-s>clamp</wrap-s>
+        <wrap-t>clamp-to-edge</wrap-t>
+        <!--
+           <wrap-r>clamp-to-border</wrap-r>
+           -->
+        <!-- float, signed-integer, integer -->
+        <internal-format>normalized</internal-format>
       </texture>
       <texture n="1">
-        <texture2d>
-          <image>detail.png</image>
-          <filter>linear-mipmap-linear</filter>
-          <!-- also repeat -->
-          <wrap-s>clamp</wrap-s>
-          <wrap-t>clamp-to-edge</wrap-t>
-          <!--
-             <wrap-r>clamp-to-border</wrap-r>
-             -->
-          <!-- float, signed-integer, integer -->
-          <internal-format>normalized</internal-format>
-        </texture2d>
+        <image>detail.png</image>
+        <filter>linear-mipmap-linear</filter>
+        <!-- also repeat -->
+        <wrap-s>clamp</wrap-s>
+        <wrap-t>clamp-to-edge</wrap-t>
+        <!--
+          <wrap-r>clamp-to-border</wrap-r>
+           -->
+        <!-- float, signed-integer, integer -->
+        <internal-format>normalized</internal-format>
       </texture>
       <bump-height type="double">.05</bump-height>
       <pattern-rotation type="vec4d">0 0 1 1.5708</pattern-rotation>
           <shininess><use>material/shininess</use></shininess>
         </material>
         <texture-unit>
-          <texture2d><use>texture[0]/texture2d</use></texture2d>
+          <unit>0</unit>
+          <image><use>texture[0]/image</use></image>
+          <filter><use>texture[0]/filter</use></filter>
+          <wrap-s><use>texture[0]/wrap-s</use></wrap-s>
+          <wrap-t><use>texture[0]/wrap-t</use></wrap-t>
+          <internal-format>
+            <use>texture[0]/internal-format</use>
+          </internal-format>
         </texture-unit>
         <texture-unit>
-          <texture2d><use>texture[1]/texture2d</use></texture2d>
+          <unit>1</unit>
+          <image><use>texture[1]/image</use></image>
+          <filter><use>texture[1]/filter</use></filter>
+          <wrap-s><use>texture[1]/wrap-s</use></wrap-s>
+          <wrap-t><use>texture[1]/wrap-t</use></wrap-t>
+          <internal-format>
+            <use>texture[1]/internal-format</use>
+          </internal-format>
         </texture-unit>
           <uniform>
             <name>bumpHeight</name>
           <specular><use>material/specular</use></specular>
         </material>
         <texture-unit>
-          <texture2d><use>texture[0]/texture2d</use></texture2d>
+          <unit>0</unit>
+          <image><use>texture[0]/image</use></image>
+          <filter><use>texture[0]/filter</use></filter>
+          <wrap-s><use>texture[0]/wrap-s</use></wrap-s>
+          <wrap-t><use>texture[0]/wrap-t</use></wrap-t>
+          <internal-format>
+            <use>texture[0]/internal-format</use>
+          </internal-format>
         </texture-unit>
       </pass>
     </technique>
index 237e041ce5f4442eb2d470554718b6db21b4c8d9..e92cb0f52dc443b227f3f950e051fdaa5103725d 100644 (file)
@@ -15,6 +15,7 @@
 #include <simgear/debug/logstream.hxx>
 #include <simgear/math/sg_random.h>
 #include <simgear/scene/material/mat.hxx>
+#include <simgear/scene/material/matlib.hxx>
 #include <simgear/structure/exception.hxx>
 #include <simgear/structure/commands.hxx>
 #include <simgear/props/props.hxx>
@@ -497,6 +498,13 @@ do_screen_capture (const SGPropertyNode * arg)
   return fgDumpSnapShot();
 }
 
+static bool
+do_reload_shaders (const SGPropertyNode*)
+{
+    simgear::reload_shaders();
+    return true;
+}
+
 static bool
 do_dump_scene_graph (const SGPropertyNode*)
 {
@@ -1564,6 +1572,7 @@ static struct {
     { "release-cockpit-button", do_release_cockpit_button },
     { "dump-scenegraph", do_dump_scene_graph },
     { "dump-terrainbranch", do_dump_terrain_branch },
+    { "reload-shaders", do_reload_shaders },
     { 0, 0 }                   // zero-terminated
 };