Special effects

Everything related to 3D programming
User avatar
[blendman]
Enthusiast
Enthusiast
Posts: 297
Joined: Thu Apr 07, 2011 1:14 pm
Location: 3 arks
Contact:

Special effects

Post by [blendman] »

Hi
does someone knows how To use the special Effects ?

I have tried to use it, without succes.

The exemple (from the official example file, you have to save it in Examples\3D) :

Code: Select all

;
; ------------------------------------------------------------
;
;   PureBasic - PointJoint (Bridge)
;
;    (c) 2011 - Fantaisie Software
;
; ------------------------------------------------------------
;

IncludeFile "Screen3DRequester.pb"

#CameraSpeed = 1
#Nb = 30

Enumeration
#bloom
#bw
EndEnumeration

Define.f KeyX, KeyY, MouseX, MouseY
Global effect.a,keypressed.a
Dim Planche(#Nb)

If InitEngine3D()

  Add3DArchive("Data/Textures", #PB_3DArchive_FileSystem)
  Add3DArchive("Data/Scripts",#PB_3DArchive_FileSystem)
  Add3DArchive("Data/Packs/desert.zip", #PB_3DArchive_Zip)
  Parse3DScripts()
   
  InitSprite()
  InitKeyboard()
  InitMouse()

  If Screen3DRequester()
   
    KeyboardMode(#PB_Keyboard_International)
   
    WorldShadows(#PB_Shadow_Modulative)
       
    ;Materials
    ;
    CreateMaterial(0, LoadTexture(0, "Wood.jpg"))
    GetScriptMaterial(1, "SphereMap/SphereMappedRustySteel")
    CreateMaterial(2, LoadTexture(2, "Dirt.jpg"))
    GetScriptMaterial(3, "Scene/GroundBlend")
   

    ; Ground
    ;
    CreatePlane(3, 10000, 10000, 100, 100, 150, 150)
    CreateEntity(3,MeshID(3),MaterialID(3), 0, -50, 0)
    EntityRenderMode(3, 0)
    EntityPhysicBody(3, #PB_Entity_StaticBody)
   
    ; Bridge
    CreateCube(1, 1.0)
    For i = 1 To #Nb
      Planche(i)=CreateEntity(#PB_Any, MeshID(1), MaterialID(0))
      ScaleEntity(Planche(i), 2.8, 0.8, 20)
      EntityLocate(Planche(i), i * 3, 0, 0)
      EntityPhysicBody(Planche(i), #PB_Entity_BoxBody, 1.0)
    Next i
   
    Pas.f = 1.5
    PointJoint(Planche(1),  -Pas, 0, -5)
    For i= 1 To #Nb-2
      PointJoint(Planche(i+1),  -Pas, 0, -5, Planche(i), Pas, 0, -5)
    Next i
    PointJoint(Planche(#Nb),  Pas, 0, -5)
    PointJoint(Planche(#Nb-1),  Pas, 0, -5, Planche(#Nb), -Pas, 0, -5)
   
    PointJoint(Planche(1),  -Pas, 0, 5)
    For i= 1 To #Nb-2
      PointJoint(Planche(i+1),  -Pas, 0, 5, Planche(i), Pas, 0, 5)
    Next i
    PointJoint(Planche(#Nb),  Pas, 0, 5)
    PointJoint(Planche(#Nb-1),  Pas, 0, 5, Planche(#Nb), -Pas, 0, 5)
   
    ; Objects
    ;
    CreateSphere(2, 2, 30, 30)
   
    C = Planche(1)
    For i = 1 To #Nb/2
      Perso = CreateEntity(#PB_Any, MeshID(2), MaterialID(1), EntityX(C) +i * 5, EntityY(C)+ i * 2, EntityZ(C))
      EntityPhysicBody(Perso, #PB_Entity_SphereBody, 0.5)
    Next i
   
    For i = 1 To #Nb/2
      Perso = CreateEntity(#PB_Any, MeshID(1), MaterialID(2), EntityX(C) +i * 5, EntityY(C)+ i * 4, EntityZ(C))
      ScaleEntity(Perso, 3, 3, 3)
      EntityPhysicBody(Perso, #PB_Entity_BoxBody, 1.0)
    Next i
   
    ; Camera
    ;
    CreateCamera(0, 0, 0, 100, 100)
    CameraLocate(0, -20, 30, -40)
    CameraLookAt(0, EntityX(C) + 25, EntityY(C) + 10,  EntityZ(C))
   
    ; effects
    If CreateCompositorEffect(#bw,CameraID(0),GetCurrentDirectory()+"Data\Scripts\bw.compositor") = 0
      MessageRequester("error","unable to load or create the compositor effect")   
    EndIf
   
    If CreateCompositorEffect(#bloom,CameraID(0),GetCurrentDirectory()+"Data\Scripts\bloom.compositor")=0
      MessageRequester("error","unable to load or create the compositor effect")
    EndIf

    ;SkyBox
    ;
    SkyBox("desert07.jpg")
   
    ; Light
    ;
    CreateLight(0, RGB(255, 255, 255), 100, 800, -500)
    AmbientColor(RGB(20, 20, 20))
   
    Repeat
      Screen3DEvents()
     
      If ExamineMouse()
        MouseX = -MouseDeltaX() * #CameraSpeed * 0.05
        MouseY = -MouseDeltaY() * #CameraSpeed * 0.05
      EndIf
     
      If ExamineKeyboard()
               
        If KeyboardPushed(#PB_Key_Space)
          ApplyEntityImpulse(Planche(#Nb/2), 0, 9, 0)
        EndIf
        If KeyboardPushed(#PB_Key_Return)
          FreeJoint(Planche(#Nb/2))
        EndIf     
       
        If KeyboardPushed(#PB_Key_Left)
          KeyX = -#CameraSpeed
        ElseIf KeyboardPushed(#PB_Key_Right)
          KeyX = #CameraSpeed
        Else
          KeyX = 0
        EndIf
       
        If KeyboardPushed(#PB_Key_Up)
          KeyY = -#CameraSpeed
        ElseIf KeyboardPushed(#PB_Key_Down)
          KeyY = #CameraSpeed
        Else
          KeyY = 0
        EndIf
               
        If KeyboardReleased(#PB_Key_F3)
          Debug "effet"
          If IsEffect(#bloom)               
            HideEffect(#bloom,1)
          EndIf
        EndIf
       
        If KeyboardReleased(#PB_Key_F2)
          Debug "pas d'effet"
          If IsEffect(#bloom)               
            HideEffect(#bloom,0)
          EndIf
        EndIf
       
      EndIf
           
      MoveCamera  (0, KeyX, 0, KeyY)
      RotateCamera(0,  MouseY, MouseX, 0, #PB_Relative)
     
      RenderWorld()
      Screen3DStats()
      FlipBuffers()     
    Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1
   
  EndIf

Else
  MessageRequester("Error", "The 3D Engine can't be initialized",0)
EndIf

End 
And the effects (from ogre site)
Bloom.compositor

Code: Select all

/// Manuel's bloom
/// Needs a scene-sized rtt, but does only one render of the scene
compositor Bloom
{
    technique
    {
        // Temporary textures
        texture scene target_width target_height PF_A8R8G8B8
        texture rt0 128 128 PF_A8R8G8B8
        texture rt1 128 128 PF_A8R8G8B8

        target scene
        {
            // Render output from previous compositor (or original scene)
            input previous
        }
        target rt0
        {
            // Start with clear texture
            input none
            // Vertical blur pass
            pass render_quad
            {
                // Renders a fullscreen quad with a material
                material PostFilters/Blur0
                input 0 scene
            }
        }
        target rt1
        {
            // Start with clear texture
            input none
            // Horizontal blur pass
            pass render_quad
            {
                // Renders a fullscreen quad with a material
                material PostFilters/Blur1
                input 0 rt0
            }
        }
        target_output
        {
            // Start with clear output
            input none
            // Draw a fullscreen quad
            pass render_quad
            {
                // Renders a fullscreen quad with a material
                material PostFilters/BloomBlend
                input 0 scene
                input 1 rt1
            }
        }
    }
} 
Black & white :
bw.compositor :

Code: Select all

/// Black and white effect
compositor B&W
{
    technique
    {
        // Temporary textures
        texture scene target_width target_height PF_A8R8G8B8

        target scene
        {
            // Render output from previous compositor (or original scene)
            input previous
        }
        target_output
        {
            // Start with clear output
            input none
            // Draw a fullscreen quad with the blur
            pass render_quad
            {
                // Renders a fullscreen quad with a material
                material PostFilters/BlackAndWhite
                input 0 scene
            }
        }
    }
}