bumpmap with DX9 for Windows

Share your advanced PureBasic knowledge/code with the community.
mpz
Enthusiast
Enthusiast
Posts: 497
Joined: Sat Oct 11, 2008 9:07 pm
Location: Germany, Berlin > member German forum

bumpmap with DX9 for Windows

Post by mpz »

Hi,

here comes a little piece code to create bumpmap with DX9. You need a grafikfile (BMP, JPG, TGA, PNG, DDS, PPM, DIB, HDR und PFM) and a normalmap. You can create a normalmap with my program CreateNormal.exe. Use Space to choose Grafikfile, a normal.jpg will be created.

CreateNormal.exe
http://rapidshare.de/files/48775115/Cre ... l.exe.html


Have fun
Michael

Code: Select all



;////////////////////////////////////////////////////////////////
;//
;// Project Title: Easy BumpMap
;// File Title: BumpMap.pb
;// Created On: 10.12.2009
;// Updated On: 
;// Author: Michael Paulwitz
;// OS:Windows
;// 
;// Demofile zum erzeugen einer einfachen BumpMap Textur mit DX9
;// Demoflie to Create a BumpMap Textur with DX9
;// 
;// Benötigt eine Grafikdatei und NormalMap
;// Used a Grafikfile and NormalMap
;// 
;// You can use (BMP, JPG, TGA, PNG, DDS, PPM, DIB, HDR und PFM)
;// 
;// Based on Steven "Dreglor" Garcia DX9 files
;////////////////////////////////////////////////////////////////


File1.s = "earth_map.jpg" ; Grafikfile (BMP, JPG, TGA, PNG, DDS, PPM, DIB, HDR und PFM)
File2.s = "Normal.jpg"    ; NormalMap

; You can create a normalMap with CreateNormal.exe from mpz


#D3D_OK = 0
#D3DADAPTER_DEFAULT = 0
#D3DDEVTYPE_HAL = 1
#D3DCREATE_HARDWARE_VERTEXPROCESSING = $00000040
#D3DMULTISAMPLE_NONE =  0
#D3DSWAPEFFECT_DISCARD = 1
#D3DPRESENT_RATE_DEFAULT = $00000000
#D3DPRESENT_INTERVAL_DEFAULT = $00000000
#D3DFMT_D16 = 80
#D3DUSAGE_DEPTHSTENCIL = ($00000002)             
#D3DRTYPE_SURFACE                =  1
#D3DFMT_X8R8G8B8 = 22
#D3DPOOL_MANAGED = 1
#D3DUSAGE_WRITEONLY = ($00000008)
#D3DFVF_XYZ = $002
#D3DFVF_TEX1 = $100
#D3DFVF_MY_VERTEX = #D3DFVF_XYZ | #D3DFVF_TEX1
#D3DPOOL_DEFAULT = 0
#D3DPT_TRIANGLESTRIP = 5
#D3DRS_LIGHTING = 137
#D3DTSS_COLOROP = 1 ;/* D3DTEXTUREOP - per-stage blending controls for color channels */
#D3DTSS_COLORARG1 = 2 ;/* D3DTA_* (texture arg) */
#D3DTSS_COLORARG2 = 3 ;/* D3DTA_* (texture arg) */
#D3DTA_TEXTURE = $00000002  ;// select texture color (read only)
#D3DTA_TFACTOR = $00000003  ;// select D3DRS_TEXTUREFACTOR (read only)
#D3DTOP_DOTPRODUCT3 = 24
#D3DTSS_TEXCOORDINDEX = 11 ;/* identifies which set of texture coordinates index this texture */
#D3DTOP_MODULATE = 4 ;// multiply args together
#D3DSAMP_MAGFILTER = 5 ;/* D3DTEXTUREFILTER filter to use for magnification */
#D3DSAMP_MINFILTER = 6 ;/* D3DTEXTUREFILTER filter to use for minification */
#D3DTEXF_LINEAR          = 2    ;// linear interpolation      
  
;- Globals

Global *D3D.IDIRECT3D9
Global *D3DDevice.IDIRECT3DDEVICE9

;-  Structure 

Structure D3DDISPLAYMODE
    Width.l
    Height.l
    RefreshRate.l
    Format.l
EndStructure

Structure D3DPRESENT_PARAMETERS
      BackBufferWidth.l
      BackBufferHeight.l
      BackBufferFormat.l
      BackBufferCount.l
      MultiSampleType.l
      MultiSampleQuality.l
      SwapEffect.l
      hDeviceWindow.l
      Windowed.l
      EnableAutoDepthStencil.l
      AutoDepthStencilFormat.l
      flags.l
      ;/* FullScreen_RefreshRateInHz must be zero for Windowed mode */
      FullScreen_RefreshRateInHz.l
      PresentationInterval.l
EndStructure

Structure Vertex
  x.f
  y.f
  z.f
  u.f
  v.f
EndStructure
  
Structure D3DXMACRO
    Name.s
    Definition.s
EndStructure  

;- Macro

Macro D3DFORMAT
      l
EndMacro

Macro D3DPOOL
      l
EndMacro              

  Macro D3DXIMAGE_FILEFORMAT
    l
  EndMacro

;- Import
               
Import "d3d9.lib"
    Direct3DCreate9(SDKVersion.l)
EndImport

Import "d3dx9.lib"
    D3DXCreateTextureFromFileA(*pDevice.IDIRECT3DDEVICE9, pSrcFile.s, *ppTexture.IDIRECT3DTEXTURE9)
    D3DXCreateTextureFromFileW(*pDevice.IDIRECT3DDEVICE9, pSrcFile.s, *ppTexture.IDIRECT3DTEXTURE9)
    D3DXSaveTextureToFileA(pDestFile.s, *DestFormat.D3DXIMAGE_FILEFORMAT, *pSrcTexture.IDIRECT3DBASETEXTURE9, *pSrcPalette.PALETTEENTRY)
    D3DXSaveTextureToFileW(pDestFile.s, *DestFormat.D3DXIMAGE_FILEFORMAT, *pSrcTexture.IDIRECT3DBASETEXTURE9, *pSrcPalette.PALETTEENTRY)
    D3DXCreateTexture(*pDevice.IDIRECT3DDEVICE9, Width.l, Height.l, MipLevels.l, Usage.l, *Format.D3DFORMAT, *Pool.D3DPOOL, *ppTexture.IDIRECT3DTEXTURE9)
EndImport  

CompilerIf #PB_Compiler_Unicode
   Macro D3DXCreateTextureFromFile
      D3DXCreateTextureFromFileW
   EndMacro
CompilerElse
   Macro D3DXCreateTextureFromFile
      D3DXCreateTextureFromFileA
   EndMacro
CompilerEndIf  

CompilerIf #PB_Compiler_Unicode
   Macro D3DXSaveTextureToFile
      D3DXSaveTextureToFileW
   EndMacro
CompilerElse
   Macro D3DXSaveTextureToFile
      D3DXSaveTextureToFileA
   EndMacro
CompilerEndIf

;- Procedures

Procedure InitD3D9()

  If hwnd = #Null
    
    *D3D = Direct3DCreate9(32)
    ProcedureReturn #True
  Else
    
    ProcedureReturn #False
  EndIf
EndProcedure

Procedure D3D9_OpenWindowedScreen(Window.l, x.l, y.l, Width.l, Height.l, Title.s, WindowFlags.l = #PB_Window_ScreenCentered | #PB_Window_MaximizeGadget | #PB_Window_MinimizeGadget | #PB_Window_TitleBar)
  
  If *D3D <> #Null And *D3DDevice = #Null
    
    If *D3DDevice <> #Null
      
      ;Device Check
      *D3DDevice\Release()
      *D3DDevice = #Null
    EndIf
    
    Current.D3DDISPLAYMODE
    If *D3D\GetAdapterDisplayMode(#D3DADAPTER_DEFAULT, Current) = #D3D_Ok
      
      ;Back Buffer Check
      If *D3D\CheckDeviceType(#D3DADAPTER_DEFAULT, #D3DDEVTYPE_HAL, Current\Format, Current\Format, #True) = #D3D_Ok
        
        ;Z-buffer Check
          
          hwnd.l = OpenWindow(Window, x, y, Width, Height, Title, WindowFlags)
          
          If hwnd <> #Null
          
            Rendering.D3DPRESENT_PARAMETERS
            Rendering\BackBufferCount = 1
            Rendering\MultiSampleType = #D3DMULTISAMPLE_NONE
            Rendering\MultiSampleQuality = 0
            Rendering\SwapEffect = #D3DSWAPEFFECT_DISCARD
            Rendering\hDeviceWindow = hwnd
            Rendering\flags = #Null
            Rendering\FullScreen_RefreshRateInHz = #D3DPRESENT_RATE_DEFAULT
            Rendering\PresentationInterval = #D3DPRESENT_INTERVAL_DEFAULT
            Rendering\BackBufferFormat = Current\Format
            Rendering\EnableAutoDepthStencil = #True
            Rendering\AutoDepthStencilFormat = #D3DFMT_D16
            Rendering\Windowed = #True
            Rendering\BackBufferWidth = 0
            Rendering\BackBufferHeight = 0
            
            If *D3D\CreateDevice(#D3DADAPTER_DEFAULT, #D3DDEVTYPE_HAL, hwnd, #D3DCREATE_HARDWARE_VERTEXPROCESSING, Rendering, @*D3DDevice) = #D3D_Ok
              
              ProcedureReturn #True
            Else
              
              ;Creation of the device failed
              CloseWindow(Window)
              ProcedureReturn #False
            EndIf
          Else
            
          
          ;16bit z-buffer does not work
          ProcedureReturn #False
        EndIf
      Else
        
        ;the back buffer format failed
        ProcedureReturn #False
      EndIf
    Else
      
      ;Failed to get the current mode.
      ProcedureReturn #False
    EndIf
  Else
    
    ;D3D not initilized!
    ProcedureReturn #False
  EndIf
EndProcedure

Procedure D3D9_Shutdown(Window)
  If *D3DDevice <> #Null
    
    *D3DDevice\Release()
    *D3DDevice = #Null
  EndIf
  
  If IsWindow(Window)
    
    CloseWindow(Window)
  EndIf
  

  If *D3D <> #Null
    
    *D3D\Release()
    *D3D = #Null
  EndIf
  
  ProcedureReturn #True
EndProcedure


;-
;- ProgrammStart

InitD3D9() ; Initalisiere DX9
D3D9_OpenWindowedScreen(0, 10, 10, 640, 480, "DirectX from MP") ; Öffne DX9 Screen

If D3DXCreateTextureFromFile(*D3DDevice, File1.s, @LoadTexture.IDIRECT3DTEXTURE9)
  MessageRequester("Error during D3DXCreateFromFile","Error!",#PB_MessageRequester_Ok)
  End
EndIf 


If D3DXCreateTextureFromFile(*D3DDevice, File2.s, @NormalTextur.IDIRECT3DTEXTURE9)
  MessageRequester("Error during D3DXCreateFromFile","Error!",#PB_MessageRequester_Ok)
  End
EndIf 


Dim Quad.Vertex(4)
Quad(0)\x = -1.0
Quad(0)\y = 1.0
Quad(0)\z = 0.0
Quad(0)\u = 0.0
Quad(0)\v = 0.0
    
Quad(1)\x = 1.0
Quad(1)\y = 1.0
Quad(1)\z = 0.0
Quad(1)\u = 1.0
Quad(1)\v = 0.0
    
Quad(2)\x = -1.0
Quad(2)\y = -1.0
Quad(2)\z = 0.0
Quad(2)\u = 0.0
Quad(2)\v = 1.0
    
Quad(3)\x = 1.0
Quad(3)\y = -1.0
Quad(3)\z = 0.0
Quad(3)\u = 1.0
Quad(3)\v = 1.0
    
If *D3DDevice\CreateVertexBuffer(4 * SizeOf(Vertex), #D3DUSAGE_WRITEONLY, #D3DFVF_MY_VERTEX, #D3DPOOL_DEFAULT, @*VertexBuffer.IDIRECT3DVERTEXBUFFER9, #Null) = #D3D_Ok
      
   Vertices = #Null
   If *VertexBuffer\Lock(0, 4 * SizeOf(Vertex), @Vertices, 0) = #D3D_Ok
        
      CopyMemory(Quad(), Vertices, 4 * SizeOf(Vertex))
      *VertexBuffer\Unlock()
   Else
        
     ;vertex buffer failed to lock
     End
   EndIf
 Else
      
     ;failed to create the vertex buffer
      End
 EndIf  
    
*D3DDevice\SetRenderState(#D3DRS_LIGHTING, #False)   

While Not WindowEvent() = #PB_Event_CloseWindow; Esc abfrage oder Windows Schliessen

    *D3DDevice\Clear(#Null, #Null, 3, 0, 1, 0)
    *D3DDevice\BeginScene()

    
    *D3DDevice\SetTextureStageState(0,#D3DTSS_COLORARG1,#D3DTA_TEXTURE);
    *D3DDevice\SetTextureStageState(0,#D3DTSS_COLORARG2,#D3DTA_TFACTOR);
    *D3DDevice\SetTextureStageState(0, #D3DTSS_COLOROP, #D3DTOP_DOTPRODUCT3);  
    *D3DDevice\SetTexture(0, NormalTextur)

    *D3DDevice\SetSamplerState( 1, #D3DSAMP_MINFILTER, #D3DTEXF_LINEAR );
	  *D3DDevice\SetSamplerState( 1, #D3DSAMP_MAGFILTER, #D3DTEXF_LINEAR );
    *D3DDevice\SetTextureStageState( 1, #D3DTSS_TEXCOORDINDEX, 0 );
    *D3DDevice\SetTextureStageState( 1, #D3DTSS_COLOROP, #D3DTOP_MODULATE ); // Modulate...
    *D3DDevice\SetTexture(1, LoadTexture)

    *D3DDevice\SetStreamSource(0, *VertexBuffer, 0, SizeOf(Vertex))
    *D3DDevice\SetFVF(#D3DFVF_MY_VERTEX)
    *D3DDevice\DrawPrimitive(#D3DPT_TRIANGLESTRIP, 0, 2)

    *D3DDevice\EndScene()

    *D3DDevice\Present( #Null, #Null, #Null, #Null )

Wend

D3D9_Shutdown(0) 

Working on - MP3D Library - PB 5.73 version ready for download