Page 7 of 11

Posted: Fri Aug 26, 2005 12:26 am
by Fred
Yes, it's the plan.

Posted: Fri Aug 26, 2005 1:08 pm
by IceSoft
Support for DirectX 7 should be also on PB:
For old PCs...

Maybe here an example how can be called the 'Differents'
InitSpriteDX7()
InitSpriteDX9()
InitSprite() same as InitSpriteDX7()
...

Posted: Fri Aug 26, 2005 2:03 pm
by dracflamloc
Am I mistaken or does DX9 still work on DX7 cards, only without the added functionality?

Posted: Fri Aug 26, 2005 2:06 pm
by Num3
IceSoft wrote:Support for DirectX 7 should be also on PB:
For old PCs...

Maybe here an example how can be called the 'Differents'
InitSpriteDX7()
InitSpriteDX9()
InitSprite() same as InitSpriteDX7()
...
This is not a good idea....

Linux and Mac will not support it...

Maybe something like:

InitSprite ([API])

Blank (use default)
[DX9]
[GL]
[etc...]

Posted: Fri Aug 26, 2005 2:07 pm
by Num3
dracflamloc wrote:Am I mistaken or does DX9 still work on DX7 cards, only without the added functionality?
Yup... Some operations are just made by software emulation, shader stuff won't work.... but's it's just a 2d sprite lib, so i don't see many problems...

Posted: Fri Aug 26, 2005 2:10 pm
by Fred
The DX9 support will be done via a subsystem which means than it's at compile time than the DX version will be choosen. You won't see any difference in the current PB code (This is similar to the gtk/gtk2 support on linux).

Posted: Fri Aug 26, 2005 2:17 pm
by Num3
Fred,

I'm realling liking your subsystem idea for stuff!

Keep it going !

Posted: Fri Aug 26, 2005 4:49 pm
by dracflamloc
Cool beans

Posted: Fri Aug 26, 2005 5:25 pm
by Polo
Well actually the computer I'm talking about does support DX up to version 7, anything that try to initialize d3d8 or 9 fails, also the dxdialog tell me d3d8 and d3d9 are not supported :)
But it is 7 years old :)

Posted: Sat Aug 27, 2005 6:48 pm
by Comtois
In this code , you don't need image.

Fred
if i valid this line

Code: Select all

;MaterialShadingMode(0, #PB_Material_Gouraud) ; 
there is nothing on the screen.

If i use #PB_Material_Phong
it seem to be Flat shading ?

Code: Select all

;MaterialShadingMode(0, #PB_Material_Phong) ; Phong = Flat ??? 
I must see something like this for :
- Flat
Image

- Gouraud
Image

- Phong
Image

Code: Select all

;**********************************************
;** Comtois ** 22/08/05 ** Matrice / Vagues  **
;**********************************************
;Modifications and additions by Psychophanta

;/SnapShot
#Img_SnapShot = 0
ExamineDesktops()
hBitmap = CreateImage(#Img_SnapShot, DesktopWidth(0), DesktopHeight(0))
hdc = StartDrawing(ImageOutput())
SelectObject_(hdc, hBitmap)
BitBlt_(hdc, 0, 0, DesktopWidth(0), DesktopHeight(0), GetDC_(GetDesktopWindow_()), 0, 0, #SRCCOPY)
StopDrawing()
DeleteDC_(hdc)

;-Initialisation
bitplanes.b=32:RX.w=1024:RY.w=768
If InitEngine3D()=0 Or InitSprite()=0 Or InitKeyboard()=0
  MessageRequester("Error","Something fails to open Screen for 3D. This requires Engine3D.dll",0)
  End
EndIf
While OpenScreen(RX.w,RY.w,bitplanes.b,"DemoMatrice")=0
  If bitplanes.b>16:bitplanes.b-8
  ElseIf RY.w>600:RX.w=800:RY.w=600
  ElseIf RY.w>480:RX.w=640:RY.w=480
  ElseIf RY.w>400:RX.w=640:RY.w=400
  ElseIf RY.w>240:RX.w=320:RY.w=240
  ElseIf RY.w>200:RX.w=320:RY.w=200
  Else:MessageRequester("VGA limitation","Can't open Screen!",0):End
  EndIf
Wend
Structure  Vecteur
x.f
y.f
z.f
EndStructure
Structure Vertex
x.f
y.f
z.f
Nx.f
Ny.f
Nz.f
;Cx.f
;Cy.f
;Cz.f
u.f
v.f
EndStructure

Structure DoubleFace
f1.w
f2.w
f3.w

f4.w
f5.w
f6.w

f7.w
f8.w
f9.w

f10.w
f11.w
f12.w
EndStructure

;-Constantes
#NbX=30 ; nombre de facettes
#NbZ=30 ; nombre de facettes
#DegConv=3.14159265/180

#PB_Mesh_Vertex       = 1 << 0
#PB_Mesh_Color        = 1 << 1
#PB_Mesh_Normal       = 1 << 2
#PB_Mesh_UVCoordinate = 1 << 3

 ;Additionnnal flag To specify the faces

#PB_Mesh_Face         = 1 << 4
   
;-Variables Globales
Global AngleVague.f,WaveFrequency.f,WavePeriodX.f,WavePeriodZ.f,WaveAmplitude.f
Global xrot.f,yrot.f,zrot.f
Global CamLocateX.l,CamLocateY.l,CamLocateZ.l,CamLookAtX.l,CamLookAtY.l,CamLookAtZ.l
Global Mode.b
circle.l=360
AngleVague=Random(circle)
WaveFrequency=3;=waves/second
WavePeriodX=5;=1/Wave lenght
WavePeriodZ=9;=1/Wave lenght
WaveAmplitude=2
xrot=-0.3:yrot=-0.4:zrot=0.2
CamLocateX.l=0:CamLocateY.l=0:CamLocateZ.l=50
CamLookAtX.l=0:CamLookAtY.l=0:CamLookAtZ.l=0

;-Procédures
Procedure Matrice(*Vertex.Vertex,*Face.DoubleFace,FX.l,FZ.l)
  *Ptr.Vertex=*Vertex
   FX2=FX/2
   FZ2=FZ/2
  For b=0 To FZ
    For a=0 To FX
      *Ptr\x= a-FX2
      *Ptr\y=0
      *Ptr\z=b-FZ2
      *Ptr\u=a/FX
      *Ptr\v=b/FZ
      *Ptr + SizeOf(Vertex)
    Next a
  Next b

  *PtrF.DoubleFace=*Face
  Nb=FX+1
  For b=0 To FZ-1
    For a=0 To FX-1
      P1=a+(b*Nb)
      P2=P1+1
      P3=a+(b+1)*Nb
      P4=P3+1
      ;Face 1
      *PtrF\f1=P3 : *PtrF\f2=P2 : *PtrF\f3=P1
      *PtrF\f4=P2 : *PtrF\f5=P3 : *PtrF\f6=P4
      ;Face 2
      *PtrF\f7=P1 : *PtrF\f8=P2 : *PtrF\f9=P3   
      *PtrF\f10=P4 : *PtrF\f11=P3 : *PtrF\f12=P2
      *PtrF + SizeOf(DoubleFace)
    Next
  Next


EndProcedure


Procedure MakeNormale(*Vertex.Vertex,*Face.DoubleFace,Fx,Fz)
     Protected *Ptr.Vertex, *PtrF.DoubleFace, *PtrN.Vecteur, Temp.Vecteur
    Protected  Vecteur1.Vecteur,  Vecteur2.Vecteur,  P1.Vecteur,  P2.Vecteur,  P3.Vecteur ,*N.Vecteur
   
     *N=AllocateMemory((Fx+1)*(Fz+1)*SizeOf(Vecteur))
 
    *PtrF=*Face
     For b=0 To FZ-1
       For a=0 To FX-1
          ;{ Calcule la normale du premier triangle

          ;Avec les 3 vertices qui composent le triangle, on détermine deux vecteurs

            *Ptr=*Vertex + *PtrF\f1 * SizeOf(Vertex)
           P1\x = *Ptr\x
         P1\y = *Ptr\y
          P1\z = *Ptr\z
       
           *Ptr=*Vertex + *PtrF\f2 * SizeOf(Vertex)
            P2\x = *Ptr\x
           P2\y = *Ptr\y
           P2\z = *Ptr\z 
       
           *Ptr=*Vertex + *PtrF\f3 * SizeOf(Vertex)
            P3\x = *Ptr\x
           P3\y = *Ptr\y
           P3\z = *Ptr\z
       
           Vecteur1\x = (P1\x - P2\x)
           Vecteur1\y = (P1\y - P2\y)
           Vecteur1\z = (P1\z - P2\z)
       
           Vecteur2\x = (P1\x - P3\x)
           Vecteur2\y = (P1\y - P3\y)
           Vecteur2\z = (P1\z - P3\z)
           
         ;Calcule la normale du premier triangle 
           Temp\x = ((Vecteur1\y * Vecteur2\z) - (Vecteur1\z * Vecteur2\y))
           Temp\y = ((Vecteur1\z * Vecteur2\x) - (Vecteur1\x * Vecteur2\z))
           Temp\z = ((Vecteur1\x * Vecteur2\y) - (Vecteur1\y * Vecteur2\x))
           
           ;Et affecte cette normale aux vertices composants le premier triangle
           *PtrN=*N + *PtrF\f1 * SizeOf(Vecteur)
           *PtrN\x + Temp\x
           *PtrN\y + Temp\y
           *PtrN\z + Temp\z

           *PtrN=*N + *PtrF\f2 * SizeOf(Vecteur)
           *PtrN\x + Temp\x
           *PtrN\y + Temp\y
           *PtrN\z + Temp\z
           
           *PtrN=*N + *PtrF\f3 * SizeOf(Vecteur)
           *PtrN\x + Temp\x
           *PtrN\y + Temp\y
           *PtrN\z + Temp\z
          ;}
         
         ;{ Calcule la normale du second triangle

          ;Avec les 3 vertices qui composent le triangle, on détermine deux vecteurs

            *Ptr=*Vertex + *PtrF\f4 * SizeOf(Vertex)
           P1\x = *Ptr\x
         P1\y = *Ptr\y
          P1\z = *Ptr\z
       
           *Ptr=*Vertex + *PtrF\f5 * SizeOf(Vertex)
            P2\x = *Ptr\x
           P2\y = *Ptr\y
           P2\z = *Ptr\z 
       
           *Ptr=*Vertex + *PtrF\f6 * SizeOf(Vertex)
            P3\x = *Ptr\x
           P3\y = *Ptr\y
           P3\z = *Ptr\z
       
           Vecteur1\x = (P1\x - P2\x)
           Vecteur1\y = (P1\y - P2\y)
           Vecteur1\z = (P1\z - P2\z)
       
           Vecteur2\x = (P1\x - P3\x)
           Vecteur2\y = (P1\y - P3\y)
           Vecteur2\z = (P1\z - P3\z)
           
         ;Calcule la normale du second triangle 
           Temp\x = ((Vecteur1\y * Vecteur2\z) - (Vecteur1\z * Vecteur2\y))
           Temp\y = ((Vecteur1\z * Vecteur2\x) - (Vecteur1\x * Vecteur2\z))
           Temp\z = ((Vecteur1\x * Vecteur2\y) - (Vecteur1\y * Vecteur2\x))
           
           ;Et affecte cette normale aux vertices composants le second triangle
           *PtrN=*N + *PtrF\f4 * SizeOf(Vecteur)
           *PtrN\x + Temp\x
           *PtrN\y + Temp\y
           *PtrN\z + Temp\z

           *PtrN=*N + *PtrF\f5 * SizeOf(Vecteur)
           *PtrN\x + Temp\x
           *PtrN\y + Temp\y
           *PtrN\z + Temp\z
           
           *PtrN=*N + *PtrF\f6 * SizeOf(Vecteur)
           *PtrN\x + Temp\x
           *PtrN\y + Temp\y
           *PtrN\z + Temp\z
          ;}
         
         ;Face suivante
         *PtrF + SizeOf(DoubleFace)
        Next a
     Next b
   ;Norme et affecte la normale de chaque Vertex
   *PtrN=*N
   *Ptr=*Vertex
   For b=0 To FZ
       For a=0 To FX
          Norme=Sqr(*PtrN\x * *PtrN\x + *PtrN\y * *PtrN\y + *PtrN\z * *PtrN\z)
         If norme = 0
               *Ptr\Nx = 0
               *Ptr\Ny = 0
               *Ptr\Nz = 0
          Else
               *Ptr\Nx = *PtrN\x / Norme
               *Ptr\Ny = *PtrN\y / Norme
               *Ptr\Nz = *PtrN\z / Norme
          EndIf          
          *Ptr + SizeOf(Vertex)
          *PtrN + SizeOf(Vecteur)
       Next a
     Next b

   FreeMemory(*N)
EndProcedure 

Procedure vagues(*Vertex.Vertex,*Face.DoubleFace)
 ; Modification sur l'axe des Y
  *Ptr.Vertex=*Vertex
  For z=0 To #NbZ
    For x=0 To #NbX
        *Ptr\y=Sin(#DegConv*(AngleVague+x*WavePeriodX+z*WavePeriodZ))*WaveAmplitude
      *Ptr + SizeOf(Vertex)
    Next
  Next
  MakeNormale(*Vertex.Vertex,*Face.DoubleFace,#NbX,#NbZ)
  SetMeshData(0,#PB_Mesh_Vertex | #PB_Mesh_Normal | #PB_Mesh_UVCoordinate,*Vertex,(#NbX+1)*(#NbZ+1))
EndProcedure

Procedure.b ShowTextAndKeyTest(hidetext.b)
  If hidetext.b=0
    StartDrawing(ScreenOutput())
    DrawingMode(1)
    FrontColor(20,180,115)
    Locate(0,0)
    DrawText("[F1] => Toggle Mode affichage")
    Locate(0,20)
    DrawText("[PageUp] / [PageDown] => Wave Amplitude : "+StrF(WaveAmplitude))
    Locate(0,40)
    DrawText("[Up Arrow] / [Down Arrow] => Wave Period on Z axis : "+Str(WavePeriodZ))
    Locate(0,60)
    DrawText("[Right Arrow] / [Left Arrow] => Wave Period on X axis : "+Str(WavePeriodX))
    Locate(0,80)
    DrawText("[Home key] / [End key] => Wave speed : "+Str(WaveFrequency))
    Locate(0,100)
    DrawText("[F2] / [Shift+F2] => X rotation speed : "+StrF(xrot))
    Locate(0,120)
    DrawText("[F3] / [Shift+F3] => Y rotation speed : "+StrF(yrot))
    Locate(0,140)
    DrawText("[F4] / [Shift+F4] => Z rotation speed : "+StrF(zrot))
    Locate(0,160)
    DrawText("[F5] / [Shift+F5] => X Camera location : "+Str(CamLocateX))
    Locate(0,180)
    DrawText("[F6] / [Shift+F6] => Y Camera location : "+Str(CamLocateY))
    Locate(0,200)
    DrawText("[F7] / [Shift+F7] => Z Camera location : "+Str(CamLocateZ))
    Locate(0,220)
    DrawText("[F8] / [Shift+F8] => X Camera look at : "+Str(CamLookAtX))
    Locate(0,240)
    DrawText("[F9] / [Shift+F9] => Y Camera look at : "+Str(CamLookAtY))
    Locate(0,260)
    DrawText("[F10] / [Shift+F10] => Z Camera look at : "+Str(CamLookAtZ))
    Locate(0,280)
    DrawText("[F11] => Show or hide text")
    Locate(0,300)
    DrawText("[Space] => Halt")
    StopDrawing()
  EndIf
  If KeyboardReleased(#PB_Key_F1)
    If Mode.b:Mode=0:CameraRenderMode(0,#PB_Camera_Textured):Else:Mode=1:CameraRenderMode(0,#PB_Camera_Wireframe):EndIf
  EndIf
  If KeyboardReleased(#PB_Key_PageUp):WaveAmplitude+0.1:EndIf
  If KeyboardReleased(#PB_Key_PageDown):WaveAmplitude-0.1:EndIf
  If KeyboardReleased(#PB_Key_Up):WavePeriodZ+1:EndIf
  If KeyboardReleased(#PB_Key_Down):WavePeriodZ-1:EndIf
  If KeyboardReleased(#PB_Key_Left):WavePeriodX-1:EndIf
  If KeyboardReleased(#PB_Key_Right):WavePeriodX+1:EndIf
  If KeyboardReleased(#PB_Key_Home):WaveFrequency+1:EndIf
  If KeyboardReleased(#PB_Key_End):WaveFrequency-1:EndIf
 
  If KeyboardReleased(#PB_Key_F2)
    If KeyboardPushed(#PB_Key_LeftShift) Or KeyboardPushed(#PB_Key_RightShift):xrot-0.1:Else:xrot+0.1:EndIf
  EndIf
  If KeyboardReleased(#PB_Key_F3)
    If KeyboardPushed(#PB_Key_LeftShift) Or KeyboardPushed(#PB_Key_RightShift):yrot-0.1:Else:yrot+0.1:EndIf
  EndIf
  If KeyboardReleased(#PB_Key_F4)
    If KeyboardPushed(#PB_Key_LeftShift) Or KeyboardPushed(#PB_Key_RightShift):zrot-0.1:Else:zrot+0.1:EndIf
  EndIf

  If KeyboardPushed(#PB_Key_F5)
    If KeyboardPushed(#PB_Key_LeftShift) Or KeyboardPushed(#PB_Key_RightShift):CamLocateX-1:Else:CamLocateX+1:EndIf
  EndIf
  If KeyboardPushed(#PB_Key_F6)
    If KeyboardPushed(#PB_Key_LeftShift) Or KeyboardPushed(#PB_Key_RightShift):CamLocateY-1:Else:CamLocateY+1:EndIf
  EndIf
  If KeyboardPushed(#PB_Key_F7)
    If KeyboardPushed(#PB_Key_LeftShift) Or KeyboardPushed(#PB_Key_RightShift):CamLocateZ-1:Else:CamLocateZ+1:EndIf
  EndIf

  If KeyboardPushed(#PB_Key_F8)
    If KeyboardPushed(#PB_Key_LeftShift) Or KeyboardPushed(#PB_Key_RightShift):CamLookAtX-1:Else:CamLookAtX+1:EndIf
  EndIf
  If KeyboardPushed(#PB_Key_F9)
    If KeyboardPushed(#PB_Key_LeftShift) Or KeyboardPushed(#PB_Key_RightShift):CamLookAtY-1:Else:CamLookAtY+1:EndIf
  EndIf
  If KeyboardPushed(#PB_Key_F10)
    If KeyboardPushed(#PB_Key_LeftShift) Or KeyboardPushed(#PB_Key_RightShift):CamLookAtZ-1:Else:CamLookAtZ+1:EndIf
  EndIf
  If KeyboardReleased(#PB_Key_F11):hidetext.b!1:EndIf
  While KeyboardPushed(#PB_Key_Space):ExamineKeyboard():Wend
  ProcedureReturn hidetext.b
EndProcedure

;-Mémoires Mesh
*VertexID=AllocateMemory((#NbX+1)*(#NbZ+1)*SizeOf(vertex))
*FaceID=AllocateMemory(#NbX*#NbZ*4*SizeOf(DoubleFace))
Matrice(*VertexID,*FaceID,#NbX,#NbZ)

;-Mesh

CreateMesh(0)
SetMeshData(0,#PB_Mesh_Vertex | #PB_Mesh_Normal | #PB_Mesh_UVCoordinate,*VertexID,(#NbX+1)*(#NbZ+1))
SetMeshData(0,#PB_Mesh_face,*FaceID,(#NbX)*(#NbZ)*4)

;-Texture
CreateTexture(0, 256, 256)
StartDrawing(TextureOutput(0))
DrawImage(UseImage(#Img_SnapShot),0,0)
StopDrawing()

;- MAterial
CreateMaterial(0, TextureID(0)) ; Material
;MaterialShadingMode(0, #PB_Material_Gouraud) ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<BUG ?????
;MaterialShadingMode(0, #PB_Material_Phong) ; Phong = Flat ??? 
MaterialBlendingMode(0, #PB_Material_AlphaBlend)
MaterialAmbientColor(0, RGB(255,55,55))
MaterialDiffuseColor(0, RGB(255,255,128))
MaterialSpecularColor(0,RGB(255,0,0))

;-Entity
 CreateEntity(0,MeshID(0),MaterialID(0))

;-Camera
CreateCamera(0,0,0,100,100)
AmbientColor(RGB(95,95,95));<- Essential for clarity

;Light
CreateLight(0,RGB(255,255,128))
LightLocate(0,EntityX(0)/2,EntityY(0)+800,EntityZ(0)/2)
;-Boucle principale
Repeat
  ClearScreen(0,0,0)
  ExamineKeyboard()
 
  CameraLocate(0,CamLocateX,CamLocateY,CamLocateZ)
  CameraLookAt(0,CamLookAtX,CamLookAtY,CamLookAtZ)

  ;Calculate (AngleVague+WaveFrequency)%360: (coz % operand doesn't accept floats)
  !fild dword[v_circle]
  !fld dword[v_AngleVague]
  !fadd dword[v_WaveFrequency]
  !fprem
  !fstp dword[v_AngleVague]
  !fstp st1
 
  vagues(*VertexID,*FaceID)
  RotateEntity(0,xrot,yrot,zrot)
  RenderWorld()
  hidetext.b=ShowTextAndKeyTest(hidetext.b)
  FlipBuffers():Delay(7)
Until KeyboardPushed(#PB_Key_Escape)

Posted: Mon Aug 29, 2005 7:58 am
by dige
Wow Wow Wow!!!
@Comtois: This looks very good, thanks for sharing this code!

Posted: Wed Aug 31, 2005 11:09 am
by Lebostein
Fred wrote:Yes, it's just because of the sprite library interaction. I will go to DX9 once the whole sprite system will have been ported on it.
Oh, please support DX7.0 for win98 users, secondary! Please add an option, for example "InitSprite(#PB_DirectX9)"...

PS: I see, DirectX 9.0c is running under Win98:
http://www.microsoft.com/windows/directx/default.aspx
I haven't tested yet... because there is no current driver for my old graphic card...

Posted: Fri Sep 02, 2005 8:57 am
by Dare2
Just on CameraBackColor again. Using maxed ($FF) for R, or G, or B, will give the background colour. Any value other than 255 for a colour is ignored.

Eg:

Using CameraBackColor(#cam,RGB(255,255,255)) gives white
but CameraBackColor(#cam,RGB(254,254,254)) gives black (or none?)

Using CameraBackColor(#cam,RGB(254,254,255)) gives blue
as does CameraBackColor(#cam,RGB(0,0,255))
but CameraBackColor(#cam,RGB(0,0,254)) is black.

I say black because my unused screen is black, it may actually be doing zip, just leaving it alone.

Posted: Fri Sep 02, 2005 11:29 am
by Fred
For now you could use ClearScreen() which should work. I'm looking to this bug tough.

Posted: Fri Sep 02, 2005 12:47 pm
by Dare2
Hi Fred,

Clearscreen doesn't seem to do anything. I also tried to Fog out the distance but that didn't make any noticable difference. :)

Anyhow, it is not an issue for me, I just thought you might like to know.