' Direct 3D example with alphablending for Rapid-Q by William Yu

$TYPECHECK ON

$include "RapidQ_D3D.inc" 
dim HiLightColor AS INTEGER
dim ComentColor AS INTEGER
dim rqtagscolor as integer

    HiLightColor = &HAA0000
    ComentColor = &H00AA00
    rqtagscolor = &H0000AA

   DIM Light AS QD3DLight, Ambient AS QD3DLight
   DIM Light1 AS QD3DLight
   DIM LightFrame AS QD3DFrame
   DIM LightFrame1 AS QD3DFrame, MeshFrame AS QD3DFrame
   DIM MeshFrame1 AS QD3DFrame
   DIM MeshFrame2 AS QD3DFrame
   DIM MeshFrame3 AS QD3DFrame
   DIM MeshFrame4 AS QD3DFrame
   DIM MeshFrame5 AS QD3DFrame
   DIM MeshFrame6 AS QD3DFrame
   DIM MeshFrame7 AS QD3DFrame
   DIM MeshBuilder AS QD3DMeshBuilder
   DIM MeshBuilder1 AS QD3DMeshBuilder
   DIM MeshBuilder2 AS QD3DMeshBuilder
   DIM MeshBuilder3 AS QD3DMeshBuilder
   DIM MeshBuilder4 AS QD3DMeshBuilder
   DIM MeshBuilder5 AS QD3DMeshBuilder
   DIM MeshBuilder6 AS QD3DMeshBuilder
   DIM MeshBuilder7 AS QD3DMeshBuilder
   DIM Texture AS QD3DTexture
   DIM Shadow AS QD3DVisual

CONST alClient = 5

DECLARE SUB DXInitialize(Sender AS QDXScreen)
DECLARE SUB DXInitializeSurface(Sender AS QDXScreen)
DECLARE SUB DXTimerExpired
DECLARE SUB TimerAzioniSub
DECLARE SUB RegolaRitardo
DECLARE SUB tecla(key AS BYTE)
DECLARE SUB KeyDown

DIM DXTimer AS QDXTimer
    DXTimer.Enabled = 1
    DXTimer.Interval = 100
    DXTimer.OnTimer = DXTimerExpired

DIM TimerAzioni AS QTimer
    TimerAzioni.Enabled = 1
    TimerAzioni.Interval = 100
    TimerAzioni.OnTimer = TimerAzioniSub

dim valoreazione as integer
valoreazione=0

dim ore as integer
'ore=0
ore=VAL(LEFT$(time$,2))
if ore>=12 then
ore=ore-12
end if
dim minuti as integer
'minuti=0
minuti=VAL(MID$(time$,4,2))
dim secondi as integer
secondi=VAL(RIGHT$(time$,2))
'secondi=0
CREATE Form AS QForm
    Caption = "Direct 3D Example"

    Center
    BorderStyle = 0
    OnKeyPress = KeyDown
    CREATE DXScreen AS QDXScreen
    
        Width = 640
        Height = 480
        bitCount = 32
        use3D = 1
        useHardware = 1
	  FullScreen = 1
        OnInitialize = DXInitialize
        OnInitializeSurface = DXInitializeSurface
        OnKeyPress = KeyDown
    END CREATE
    ShowModal
END CREATE

SUB DXInitialize(Sender AS QDXScreen)
	DIM Ambient AS QD3DLight
	DIM Light AS QD3DLight
	DIM Light1 AS QD3DLight
	
	DXScreen.CreateFrame(MeshFrame)
	DXScreen.CreateFrame(MeshFrame1)
	DXScreen.CreateFrame(MeshFrame2)
	DXScreen.CreateFrame(MeshFrame3)
	DXScreen.CreateFrame(MeshFrame4)
	DXScreen.CreateFrame(MeshFrame5)
	DXScreen.CreateFrame(MeshFrame6)
	DXScreen.CreateFrame(MeshFrame7)
	DXScreen.CreateFrame(LightFrame)
	DXScreen.CreateFrame(LightFrame1)
	DXScreen.CreateMeshBuilder(MeshBuilder)
	DXScreen.CreateMeshBuilder(MeshBuilder1)
	DXScreen.CreateMeshBuilder(MeshBuilder2)
	DXScreen.CreateMeshBuilder(MeshBuilder3)
	DXScreen.CreateMeshBuilder(MeshBuilder4)
	DXScreen.CreateMeshBuilder(MeshBuilder5)
	DXScreen.CreateMeshBuilder(MeshBuilder6)
	DXScreen.CreateMeshBuilder(MeshBuilder7)

	'DXScreen.CreateLightRGB(D3DRMLIGHT_AMBIENT, 0.1, 0.1, 0.1, Ambient)	'ambient is dim grey
	'DXScreen.AddLight(Ambient)
	DXScreen.CreateLightRGB(D3DRMLIGHT_SPOT, 0.8, 0.8, 0.7, Light)
	DXScreen.AddLight(Light)
	DXScreen.CreateLightRGB(D3DRMLIGHT_POINT, 0.8, 0.8, 0.7, Light1)
	DXScreen.AddLight(Light1)

	LightFrame.AddLight(Light)			'attach light to frame to move the light!
	LightFrame.SetPosition(0, 2, -1)	'units are x,y,z
	LightFrame1.AddLight(Light1)
	LightFrame1.SetPosition(-7, -7, 4)



		MeshBuilder.Load("lancetta1.x")
		MeshBuilder.Scale(0.010, 0.025, 0.025)		'make it smaller by 2x
		MeshBuilder.SetQuality(D3DRMRENDER_PHONG)	'highest rendering Quality is D3DRMRENDER_PHONG
		MeshBuilder1.Load("cerchio_orologio.x")
		MeshBuilder1.Scale(0.025, 0.025, 0.025)		'make it smaller by 2x
		MeshBuilder1.SetQuality(D3DRMRENDER_PHONG)
		MeshBuilder2.Load("lancetta1.x")
		MeshBuilder2.Scale(0.015, 0.025, 0.020)		'make it smaller by 2x
		MeshBuilder2.SetQuality(D3DRMRENDER_PHONG)
		MeshBuilder3.Load("lancetta1.x")
		MeshBuilder3.Scale(0.025, 0.025, 0.015)		'make it smaller by 2x
		MeshBuilder3.SetQuality(D3DRMRENDER_PHONG)
		MeshBuilder4.Load("muro.x")
		MeshBuilder4.Scale(0.1, 0.1, 0.1)
		MeshBuilder4.SetQuality(D3DRMRENDER_PHONG)
		MeshBuilder5.Load("ponte.x")
		MeshBuilder5.Scale(0.025, 0.025, 0.025)
		MeshBuilder5.SetQuality(D3DRMRENDER_PHONG)
		MeshBuilder6.Load("capriata.x")
		MeshBuilder6.Scale(0.025, 0.025, 0.025)
		MeshBuilder6.SetQuality(D3DRMRENDER_PHONG)
		MeshBuilder7.Load("piano.x")
		MeshBuilder7.Scale(0.1, 0.1, 0.1)
		MeshBuilder7.SetQuality(D3DRMRENDER_PHONG)

		MeshFrame.AddVisual(MeshBuilder)
		MeshFrame1.AddVisual(MeshBuilder1)
		MeshFrame2.AddVisual(MeshBuilder2)
		MeshFrame3.AddVisual(MeshBuilder3)
		MeshFrame4.AddVisual(MeshBuilder4)
		MeshFrame5.AddVisual(MeshBuilder5)
		MeshFrame6.AddVisual(MeshBuilder6)
		MeshFrame7.AddVisual(MeshBuilder7)

            'MeshBuilder.Translate(0,.5,0)'ulteriore movimento della mesh

		MeshFrame.SetPosition(0, 0, 0)
            'MeshFrame.SetOrientation(0,0,0,0,0,0)'
            MeshFrame.SetRotation(0,.1, 0,(3.14*(secondi/30)))
            meshFrame.Move(1)
	      MeshFrame.SetRotation(0,.1, 0,((3.14/30)/10))'
		'MeshFrame.SetRotation(0,30, 0,.1)' Angle of rotation 

		MeshFrame1.SetPosition(0, 0, 0)'
		MeshFrame1.SetRotation(0, 0, 0,0)' Angle of rotation
		MeshFrame2.SetPosition(0, 0, 0)'
            MeshFrame2.SetRotation(0,.1, 0,(3.14*(minuti/30)))
            meshFrame2.Move(1)
		MeshFrame2.SetRotation(0,.1, 0,(3.14/30))' Angle of rotation 
		MeshFrame3.SetPosition(0, 0, 0)'
            MeshFrame3.SetRotation(0,.1, 0,(3.14*(ore/30)))
            meshFrame3.Move(1)
		MeshFrame3.SetRotation(0,.1, 0,(3.14/30))' Angle of rotation 
		MeshFrame4.SetPosition(0, 0, 0)
		MeshFrame4.SetRotation(0, 0, 0,0)
		MeshFrame5.SetPosition(-10,-10, 7)
		MeshFrame5.SetRotation(0, 0, 0,0)
		MeshFrame6.SetPosition(10,0, 5)
		MeshFrame6.SetRotation(0, 0, 0,0)
		MeshFrame7.SetPosition(0,-29, 5)
		MeshFrame7.SetRotation(0, 0, 0,0)

'************ ombre ***********
		DXScreen.CreateShadow(MeshBuilder1, Light, 0, 1, 0, 1, -29, 5, Shadow)
            MeshFrame7.AddVisual(Shadow)
'******************************

		DXScreen.SetCameraPosition(-4, 16, -18)	
		DXScreen.CameraLookAt(MeshFrame, D3DRMCONSTRAIN_Z)

END SUB


SUB DXInitializeSurface(Sender AS QDXScreen)
   DXScreen.SetRenderMode(D3DRMRENDERMODE_BLENDEDTRANSPARENCY D3DRMRENDERMODE_BLENDEDTRANSPARENCY or D3DRMRENDERMODE_DISABLESORTEDALPHAZWRITE OR D3DRMRENDERMODE_VIEWDEPENDENTSPECULAR)
END SUB

SUB DXTimerExpired
		'secondi=secondi+1
		secondi=VAL(RIGHT$(time$,2))
            'MeshFrame.SetRotation(0,.1, 0,(((3.14*(secondi/30))/100)/2))
   		meshFrame.Move(1)
   		'MeshFrame.SetPosition((secondi/10), 0, 0)
		if ore=12 then
			ore=0
		end if
		if secondi=60 then
			minuti=minuti+1
   			meshFrame2.Move(1)
			RegolaRitardo
			secondi=0
		end if
		if minuti=60 then
			ore=ore+1
   			meshFrame3.Move(5)
			minuti=0
		end if

   LightFrame.SetPosition((1+(cos(valoreazione/10))),(1+(cos(valoreazione/10))), (1+(sin(valoreazione/10))))
   LightFrame1.SetPosition((-9-(sin(valoreazione/10))), (-9(cos(valoreazione/10))), -4)
   DXScreen.Fill(0)              
   DXScreen.ForceUpdate(0,0,100,100) 
   DXScreen.Render
   DXScreen.TextOut(10,10," Time:"+time$+" Date:"+DATE$, &HFFFFFF, -1)
   DXScreen.Flip

END SUB

SUB TimerAzioniSub
if valoreazione=3600 then
valoreazione=0
end if
		valoreazione=valoreazione+1
            MeshFrame4.SetPosition(0, 0, 16)
		DXScreen.SetCameraPosition((-5-(sin(valoreazione/10))), 16, (-18-(cos(valoreazione/10))))
END SUB

SUB RegolaRitardo
            MeshFrame.SetRotation(0,.1, 0,(3.14*(secondi/30)))
            MeshFrame2.SetRotation(0,.1, 0,(3.14*(minuti/30)))
            MeshFrame3.SetRotation(0,.1, 0,(3.14*(ore/30)))
   meshFrame.Move(1)
   meshFrame2.Move(1)
   meshFrame3.Move(5)
end Sub

SUB KeyDown
      Form.Close 
END SUB