<?xml version="1.0" encoding="utf-8"?>

<!--

A light "cone" effect, written by Lauri Peltonen (Zan)

With this effect, any object (most likely a cone) will 
light up everything inside of it. Might be usefull for 
landing lights etc.

Uses stencil buffer.

-->


<PropertyList>
  <name>Effects/light-cone</name>
  <inherits-from>Effects/model-default</inherits-from>
  <parameters>
    <texture n ="0">
      <type>white</type>
    </texture>

    <!-- Dunno if this does anything, it could be removed
        what does this do with rendering-hint=transparent? -->
    <render-bin>
      <active>true</active>
      <bin-number>9</bin-number>
      <bin-name>RenderBin</bin-name>
    </render-bin>

  </parameters>
  <technique n="8">

    <!-- First pass, increase stencil when ground is in front of
         the lighting object -->
    <pass>
    <render-bin>
      <active>true</active>
      <bin-number>9</bin-number>
      <bin-name>RenderBin</bin-name>
    </render-bin>

      <lighting>false</lighting>

      <color-mask type="vec4d">0 0 0 0</color-mask>  <!-- do not draw anything -->

      <shade-model><use>shade-model</use></shade-model>
      <cull-face>front</cull-face>
<!--      <rendering-hint>transparent</rendering-hint> -->
      <depth>
        <write-mask>false</write-mask>
      </depth>

      <!-- Set stencil buffer to 1 if ground is in front of the back side
      of the light volume, otherwise zero -->
      <stencil>
        <function>always</function> <!-- S-test passes always -->
        <value>1</value>
        <z-fail>replace</z-fail> <!-- Replace current s-buffer with value 1 -->
        <pass>zero</pass>  <!-- Zero everything "behind" the volume -->
      </stencil>
    </pass>


    <!-- Second pass, decrease stencil when ground is in front of the front
         side of the volume, in stencil buffer, 1 exists where ground
         (or other objects) is inside the lighting object! -->
    <pass>
    <render-bin>
      <active>true</active>
      <bin-number>9</bin-number>
      <bin-name>RenderBin</bin-name>
    </render-bin>

      <lighting>false</lighting>
      <color-mask type="vec4d">0 0 0 0</color-mask>  <!-- Do not draw anything -->
      <shade-model><use>shade-model</use></shade-model>
      <cull-face>back</cull-face>
<!--      <rendering-hint>transparent</rendering-hint> -->
      <depth>
        <write-mask>false</write-mask>
      </depth>

      <!-- Set s-buffer to 0 when ground is in front of the front side of the volume -->
      <stencil>
        <function>always</function> <!-- S-test passes always -->
        <z-fail>zero</z-fail>  <!-- Zero s-buffer when z-buffer test fails -->
      </stencil>
    </pass>

    <!-- Third pass, render light where there is 1 on stencil buffer -->
    <pass>
    <render-bin>
      <active>true</active>
      <bin-number>9</bin-number>
      <bin-name>RenderBin</bin-name>
    </render-bin>

      <lighting>false</lighting>
      <shade-model><use>shade-model</use></shade-model>
      <cull-face>back</cull-face>
<!--      <rendering-hint>transparent</rendering-hint> -->
      <depth>
        <write-mask>false</write-mask>
      </depth>

      <!-- Draw when S-buffer EQUALS value 1 -->
      <stencil>
        <function>equal</function>
        <value>1</value>
      </stencil>

      <!-- Do additive blending, so increase the color value of 
           the existing pixel by the light's color. The light object should
           have ambient & diffuse AND alpha should be around 0.2 or something -->
      <blend>
        <active>true</active>
        <source-rgb>dst-color</source-rgb>
        <source>dst-alpha</source>
        <destination>one</destination>
      </blend>

    </pass>
	
  </technique>
</PropertyList>