Game client codebase including: - CharacterActionControl: Character and creature management - GlobalScript: Network, items, skills, quests, utilities - RYLClient: Main client application with GUI and event handlers - Engine: 3D rendering engine (RYLGL) - MemoryManager: Custom memory allocation - Library: Third-party dependencies (DirectX, boost, etc.) - Tools: Development utilities 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
779 lines
24 KiB
Plaintext
779 lines
24 KiB
Plaintext
VERSION 5.00
|
|
Begin VB.Form Form1
|
|
Caption = "Point Sprites"
|
|
ClientHeight = 4050
|
|
ClientLeft = 60
|
|
ClientTop = 345
|
|
ClientWidth = 5055
|
|
Icon = "PointSprites.frx":0000
|
|
LinkTopic = "Form1"
|
|
ScaleHeight = 270
|
|
ScaleMode = 3 'Pixel
|
|
ScaleWidth = 337
|
|
StartUpPosition = 3 'Windows Default
|
|
End
|
|
Attribute VB_Name = "Form1"
|
|
Attribute VB_GlobalNameSpace = False
|
|
Attribute VB_Creatable = False
|
|
Attribute VB_PredeclaredId = True
|
|
Attribute VB_Exposed = False
|
|
|
|
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
|
|
'
|
|
' Copyright (C) 1999-2001 Microsoft Corporation. All Rights Reserved.
|
|
'
|
|
' File: PointSprites.frm
|
|
' Content: Sample showing how to use point sprites to do particle effects
|
|
'
|
|
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
|
|
|
|
Option Explicit
|
|
Option Compare Text
|
|
|
|
Private Type CUSTOMVERTEX
|
|
v As D3DVECTOR
|
|
color As Long
|
|
tu As Single
|
|
tv As Single
|
|
End Type
|
|
Const D3DFVF_COLORVERTEX = (D3DFVF_XYZ Or D3DFVF_DIFFUSE Or D3DFVF_TEX1)
|
|
|
|
Const GROUND_GRIDSIZE = 8
|
|
Const GROUND_WIDTH = 256
|
|
Const GROUND_HEIGHT = 256
|
|
Const GROUND_TILE = 32
|
|
Const GROUND_COLOR = &HBBEEEEEE
|
|
|
|
Private Enum PARTICLE_COLORS
|
|
COLOR_WHITE = 0
|
|
COLOR_RED = 1
|
|
COLOR_GREEN = 2
|
|
COLOR_BLUE = 3
|
|
NUM_COLORS = 4
|
|
End Enum
|
|
|
|
Dim g_clrColor(4) As D3DCOLORVALUE
|
|
Dim g_clrColorFade(4) As D3DCOLORVALUE
|
|
|
|
Dim m_media As String
|
|
|
|
Dim m_ParticleSystem As CParticle
|
|
Dim m_ParticleTexture As Direct3DTexture8
|
|
Dim m_NumParticlesToEmit As Long
|
|
Dim m_bStaticParticle As Boolean
|
|
Dim m_nParticleColor As Long
|
|
|
|
Dim m_GroundTexture As Direct3DTexture8
|
|
Dim m_NumGroundVertices As Long
|
|
Dim m_NumGroundIndices As Long
|
|
Dim m_GroundIB As Direct3DIndexBuffer8
|
|
Dim m_GroundVB As Direct3DVertexBuffer8
|
|
Dim m_planeGround As D3DPLANE
|
|
|
|
Dim m_bDrawReflection As Boolean
|
|
Dim m_bCanDoAlphaBlend As Boolean
|
|
Dim m_bCanDoClipPlanes As Boolean
|
|
Dim m_bDrawHelp As Boolean
|
|
|
|
Dim m_matView As D3DMATRIX
|
|
Dim m_matOrientation As D3DMATRIX
|
|
|
|
Dim m_vPosition As D3DVECTOR
|
|
Dim m_vVelocity As D3DVECTOR
|
|
Dim m_fYaw As Single
|
|
Dim m_fYawVelocity As Single
|
|
Dim m_fPitch As Single
|
|
Dim m_fPitchVelocity As Single
|
|
|
|
Dim m_fElapsedTime As Single
|
|
|
|
Dim m_bKey(256) As Boolean
|
|
|
|
Dim g_fTime As Single
|
|
Dim g_fLastTime As Single
|
|
|
|
Dim m_grVerts() As CUSTOMVERTEX
|
|
Dim m_grVerts2() As CUSTOMVERTEX
|
|
|
|
Dim m_binit As Boolean
|
|
Dim m_bMinimized As Boolean
|
|
Dim m_bStopSim As Boolean
|
|
|
|
Const kMaxParticles = 128
|
|
Const kParticleRadius = 0.01
|
|
|
|
'-----------------------------------------------------------------------------
|
|
' Name: Form_KeyPress()
|
|
' Desc:
|
|
'-----------------------------------------------------------------------------
|
|
Private Sub Form_KeyPress(KeyAscii As Integer)
|
|
If Chr$(KeyAscii) = "r" Then m_bDrawReflection = Not m_bDrawReflection
|
|
End Sub
|
|
|
|
'-----------------------------------------------------------------------------
|
|
' Name: Form_Load()
|
|
' Desc:
|
|
'-----------------------------------------------------------------------------
|
|
Private Sub Form_Load()
|
|
Me.Show
|
|
DoEvents
|
|
|
|
'setup defaults
|
|
Init
|
|
|
|
' Initialize D3D
|
|
' Note: D3DUtil_Init will attempt to use D3D Hardware acceleartion.
|
|
' If it is not available it attempt to use the Software Reference Rasterizer.
|
|
' If all fail it will display a message box indicating so.
|
|
'
|
|
m_binit = D3DUtil_Init(Me.hwnd, True, 0, 0, D3DDEVTYPE_HAL, Me)
|
|
If Not (m_binit) Then End
|
|
|
|
' find Media and set media path
|
|
m_media = FindMediaDir("ground2.bmp")
|
|
D3DUtil_SetMediaPath m_media
|
|
|
|
' Set initial state
|
|
OneTimeSceneInit
|
|
|
|
' Load Mesh and textures from media
|
|
InitDeviceObjects
|
|
|
|
' Set device render states, lighting, camera
|
|
RestoreDeviceObjects
|
|
|
|
' Start Timer
|
|
DXUtil_Timer TIMER_start
|
|
|
|
' Start our timer
|
|
DXUtil_Timer TIMER_start
|
|
|
|
' Run the simulation forever
|
|
' See Form_Keydown for exit processing
|
|
Do While True
|
|
|
|
' Increment the simulation
|
|
FrameMove
|
|
|
|
' Render one image of the simulation
|
|
If Render Then
|
|
|
|
' Present the image to the screen
|
|
D3DUtil_PresentAll g_focushwnd
|
|
End If
|
|
|
|
' Allow for events to get processed
|
|
DoEvents
|
|
|
|
Loop
|
|
|
|
End Sub
|
|
|
|
'-----------------------------------------------------------------------------
|
|
' Name: Form_KeyDown()
|
|
' Desc: Process key messages for exit and change device
|
|
'-----------------------------------------------------------------------------
|
|
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
|
|
|
|
m_bKey(KeyCode) = True
|
|
|
|
Select Case KeyCode
|
|
|
|
Case vbKeyEscape
|
|
Unload Me
|
|
|
|
Case vbKeyF2
|
|
|
|
' Pause the timer
|
|
DXUtil_Timer TIMER_STOP
|
|
m_bStopSim = True
|
|
|
|
' Bring up the device selection dialog
|
|
' we pass in the form so the selection process
|
|
' can make calls into InitDeviceObjects
|
|
' and RestoreDeviceObjects
|
|
frmSelectDevice.SelectDevice Me
|
|
|
|
' Restart the timer
|
|
m_bStopSim = False
|
|
DXUtil_Timer TIMER_start
|
|
|
|
Case vbKeyReturn
|
|
|
|
' Check for Alt-Enter if not pressed exit
|
|
If Shift <> 4 Then Exit Sub
|
|
|
|
' stop simulation
|
|
DXUtil_Timer TIMER_STOP
|
|
m_bStopSim = True
|
|
|
|
|
|
' If we are windowed go fullscreen
|
|
' If we are fullscreen returned to windowed
|
|
If g_d3dpp.Windowed Then
|
|
D3DUtil_ResetFullscreen
|
|
Else
|
|
D3DUtil_ResetWindowed
|
|
End If
|
|
|
|
' Call Restore after ever mode change
|
|
' because calling reset looses state that needs to
|
|
' be reinitialized
|
|
RestoreDeviceObjects
|
|
|
|
' Restart simulation
|
|
DXUtil_Timer TIMER_STOP
|
|
m_bStopSim = False
|
|
|
|
End Select
|
|
End Sub
|
|
|
|
'-----------------------------------------------------------------------------
|
|
' Name: Form_KeyUp()
|
|
' Desc: Process key messages for exit and change device
|
|
'-----------------------------------------------------------------------------
|
|
Private Sub Form_KeyUp(KeyCode As Integer, Shift As Integer)
|
|
m_bKey(KeyCode) = False
|
|
End Sub
|
|
|
|
|
|
Private Sub Form_MouseDown(Button As Integer, Shift As Integer, x As Single, y As Single)
|
|
DXUtil_Timer (TIMER_STOP)
|
|
m_bStopSim = True
|
|
End Sub
|
|
|
|
Private Sub Form_MouseUp(Button As Integer, Shift As Integer, x As Single, y As Single)
|
|
DXUtil_Timer (TIMER_start)
|
|
m_bStopSim = False
|
|
|
|
End Sub
|
|
|
|
'-----------------------------------------------------------------------------
|
|
' Name: Form_Resize()
|
|
' Desc: hadle resizing of the D3D backbuffer
|
|
'-----------------------------------------------------------------------------
|
|
Private Sub Form_Resize()
|
|
|
|
' If D3D is not initialized then exit
|
|
If Not m_binit Then Exit Sub
|
|
|
|
' If we are in a minimized state stop the timer and exit
|
|
If Me.WindowState = vbMinimized Then
|
|
DXUtil_Timer TIMER_STOP
|
|
m_bMinimized = True
|
|
m_bStopSim = True
|
|
Exit Sub
|
|
|
|
' If we just went from a minimized state to maximized
|
|
' restart the timer
|
|
Else
|
|
If m_bMinimized = True Then
|
|
DXUtil_Timer TIMER_start
|
|
m_bMinimized = False
|
|
m_bStopSim = False
|
|
End If
|
|
End If
|
|
|
|
' Dont let the window get too small
|
|
If Me.ScaleWidth < 10 Then
|
|
Me.width = Screen.TwipsPerPixelX * 10
|
|
Exit Sub
|
|
End If
|
|
|
|
If Me.ScaleHeight < 10 Then
|
|
Me.height = Screen.TwipsPerPixelY * 10
|
|
Exit Sub
|
|
End If
|
|
|
|
|
|
m_ParticleSystem.DeleteDeviceObjects
|
|
Set m_ParticleSystem = Nothing
|
|
Set m_ParticleSystem = New CParticle
|
|
|
|
'reset and resize our D3D backbuffer to the size of the window
|
|
D3DUtil_ResizeWindowed Me.hwnd
|
|
|
|
'All state get losts after a reset so we need to reinitialze it here
|
|
RestoreDeviceObjects
|
|
DXUtil_Timer TIMER_STOP
|
|
m_ParticleSystem.Init kMaxParticles, kParticleRadius
|
|
m_ParticleSystem.InitDeviceObjects g_dev
|
|
DXUtil_Timer TIMER_RESET
|
|
|
|
End Sub
|
|
|
|
'-----------------------------------------------------------------------------
|
|
' Name: Form_Unload()
|
|
' Desc:
|
|
'-----------------------------------------------------------------------------
|
|
Private Sub Form_Unload(Cancel As Integer)
|
|
DeleteDeviceObjects
|
|
End
|
|
End Sub
|
|
|
|
'-----------------------------------------------------------------------------
|
|
' Name: Init()
|
|
' Desc: Constructor
|
|
'-----------------------------------------------------------------------------
|
|
Sub Init()
|
|
Me.Caption = "PointSprites: Using particle effects"
|
|
|
|
|
|
|
|
Set m_ParticleSystem = New CParticle
|
|
m_ParticleSystem.Init kMaxParticles, kParticleRadius
|
|
|
|
Set m_ParticleTexture = Nothing
|
|
|
|
m_NumParticlesToEmit = 10
|
|
m_bStaticParticle = True
|
|
m_nParticleColor = COLOR_WHITE
|
|
|
|
Set m_GroundTexture = Nothing
|
|
m_NumGroundVertices = (GROUND_GRIDSIZE + 1) * (GROUND_GRIDSIZE + 1)
|
|
m_NumGroundIndices = (GROUND_GRIDSIZE * GROUND_GRIDSIZE) * 6
|
|
Set m_GroundVB = Nothing
|
|
Set m_GroundIB = Nothing
|
|
m_planeGround = D3DPLANE4(0, 1, 0, 0)
|
|
|
|
m_bDrawReflection = False
|
|
m_bCanDoAlphaBlend = False
|
|
m_bCanDoClipPlanes = False
|
|
m_bDrawHelp = False
|
|
|
|
|
|
m_vPosition = vec3(0, 3, -4)
|
|
m_vVelocity = vec3(0, 0, 0)
|
|
m_fYaw = 0
|
|
m_fYawVelocity = 0
|
|
m_fPitch = 0.5
|
|
m_fPitchVelocity = 0
|
|
|
|
|
|
g_clrColor(0) = ColorValue4(1, 1, 1, 1)
|
|
g_clrColor(1) = ColorValue4(1, 0.5, 0.5, 1)
|
|
g_clrColor(2) = ColorValue4(0.5, 1, 0.5, 1)
|
|
g_clrColor(3) = ColorValue4(0.125, 0.5, 1, 1)
|
|
|
|
|
|
|
|
g_clrColorFade(0) = ColorValue4(1, 0.25, 0.25, 1)
|
|
g_clrColorFade(1) = ColorValue4(1, 0.25, 0.25, 1)
|
|
g_clrColorFade(2) = ColorValue4(0.25, 0.75, 0.25, 1)
|
|
g_clrColorFade(3) = ColorValue4(0.125, 0.25, 0.75, 1)
|
|
|
|
|
|
End Sub
|
|
|
|
|
|
|
|
|
|
|
|
'-----------------------------------------------------------------------------
|
|
' Name: OneTimeSceneInit()
|
|
' Desc: Called during initial app startup, this function performs all the
|
|
' permanent initialization.
|
|
'-----------------------------------------------------------------------------
|
|
Sub OneTimeSceneInit()
|
|
D3DXMatrixTranslation m_matView, 0, 0, 10
|
|
D3DXMatrixTranslation m_matOrientation, 0, 0, 0
|
|
End Sub
|
|
|
|
|
|
'-----------------------------------------------------------------------------
|
|
' Name: FrameMove()
|
|
' Desc: Called once per frame, the call is the entry point for animating
|
|
' the scene.
|
|
'-----------------------------------------------------------------------------
|
|
|
|
Sub FrameMove()
|
|
|
|
|
|
If m_bStopSim = True Then Exit Sub
|
|
|
|
|
|
g_fTime = DXUtil_Timer(TIMER_GETAPPTIME) * 1.3
|
|
m_fElapsedTime = g_fTime - g_fLastTime
|
|
g_fLastTime = g_fTime
|
|
If m_fElapsedTime < 0 Then Exit Sub
|
|
|
|
' Slow things down for the REF device
|
|
If (g_devType = D3DDEVTYPE_REF) Then m_fElapsedTime = 0.05
|
|
|
|
Dim fSpeed As Single
|
|
Dim fAngularSpeed
|
|
|
|
fSpeed = 5 * m_fElapsedTime
|
|
fAngularSpeed = 1 * m_fElapsedTime
|
|
|
|
' Slowdown the camera movement
|
|
D3DXVec3Scale m_vVelocity, m_vVelocity, 0.9
|
|
m_fYawVelocity = m_fYawVelocity * 0.9
|
|
m_fPitchVelocity = m_fPitchVelocity * 0.9
|
|
|
|
' Process keyboard input
|
|
If (m_bKey(vbKeyRight)) Then m_vVelocity.x = m_vVelocity.x + fSpeed ' Slide Right
|
|
If (m_bKey(vbKeyLeft)) Then m_vVelocity.x = m_vVelocity.x - fSpeed ' Slide Left
|
|
If (m_bKey(vbKeyUp)) Then m_vVelocity.y = m_vVelocity.y + fSpeed ' Move up
|
|
If (m_bKey(vbKeyDown)) Then m_vVelocity.y = m_vVelocity.y - fSpeed ' Move down
|
|
|
|
If (m_bKey(vbKeyW)) Then m_vVelocity.z = m_vVelocity.z + fSpeed ' Move Forward
|
|
If (m_bKey(vbKeyS)) Then m_vVelocity.z = m_vVelocity.z - fSpeed ' Move Backward
|
|
|
|
If (m_bKey(vbKeyE)) Then m_fYawVelocity = m_fYawVelocity + fSpeed ' Yaw right
|
|
If (m_bKey(vbKeyQ)) Then m_fYawVelocity = m_fYawVelocity - fSpeed ' Yaw left
|
|
|
|
If (m_bKey(vbKeyZ)) Then m_fPitchVelocity = m_fPitchVelocity + fSpeed ' turn down
|
|
If (m_bKey(vbKeyA)) Then m_fPitchVelocity = m_fPitchVelocity - fSpeed ' turn up
|
|
|
|
If (m_bKey(vbKeyAdd)) Then
|
|
If (m_NumParticlesToEmit < 10) Then m_NumParticlesToEmit = m_NumParticlesToEmit + 1
|
|
End If
|
|
If (m_bKey(vbKeySubtract)) Then
|
|
If (m_NumParticlesToEmit > 0) Then m_NumParticlesToEmit = m_NumParticlesToEmit - 1
|
|
End If
|
|
|
|
|
|
' Update the position vector
|
|
Dim vT As D3DVECTOR, vTemp As D3DVECTOR
|
|
D3DXVec3Scale vTemp, m_vVelocity, fSpeed
|
|
D3DXVec3Add vT, vT, vTemp
|
|
D3DXVec3TransformNormal vT, vT, m_matOrientation
|
|
|
|
D3DXVec3Add m_vPosition, m_vPosition, vT
|
|
|
|
If (m_vPosition.y < 1) Then m_vPosition.y = 1
|
|
|
|
' Update the yaw-pitch-rotation vector
|
|
m_fYaw = m_fYaw + fAngularSpeed * m_fYawVelocity
|
|
m_fPitch = m_fPitch + fAngularSpeed * m_fPitchVelocity
|
|
If (m_fPitch < 0) Then m_fPitch = 0
|
|
If (m_fPitch > g_pi / 2) Then m_fPitch = g_pi / 2
|
|
|
|
Dim qR As D3DQUATERNION, det As Single
|
|
D3DXQuaternionRotationYawPitchRoll qR, m_fYaw, m_fPitch, 0
|
|
D3DXMatrixAffineTransformation m_matOrientation, 1.25, vec3(0, 0, 0), qR, m_vPosition
|
|
D3DXMatrixInverse m_matView, det, m_matOrientation
|
|
|
|
' Update particle system
|
|
If (m_bStaticParticle) Then
|
|
m_ParticleSystem.Update m_fElapsedTime, m_NumParticlesToEmit, _
|
|
g_clrColor(m_nParticleColor), _
|
|
g_clrColorFade(m_nParticleColor), 8, _
|
|
vec3(0, 0, 0)
|
|
Else
|
|
m_ParticleSystem.Update m_fElapsedTime, m_NumParticlesToEmit, _
|
|
g_clrColor(m_nParticleColor), _
|
|
g_clrColorFade(m_nParticleColor), 8, _
|
|
vec3(3 * Sin(g_fTime), 0, 3 * Cos(g_fTime))
|
|
|
|
End If
|
|
|
|
End Sub
|
|
|
|
|
|
|
|
'-----------------------------------------------------------------------------
|
|
' Name: Render()
|
|
' Desc: Called once per frame, the call is the entry point for 3d
|
|
' rendering. This function sets up render states, clears the
|
|
' viewport, and renders the scene.
|
|
'-----------------------------------------------------------------------------
|
|
Function Render() As Boolean
|
|
Dim v As CUSTOMVERTEX
|
|
Dim hr As Long
|
|
|
|
'See what state the device is in.
|
|
Render = False
|
|
hr = g_dev.TestCooperativeLevel
|
|
If hr = D3DERR_DEVICENOTRESET Then
|
|
g_dev.Reset g_d3dpp
|
|
RestoreDeviceObjects
|
|
End If
|
|
|
|
'dont bother rendering if we are not ready yet
|
|
If hr <> 0 Then Exit Function
|
|
Render = True
|
|
' Clear the backbuffer
|
|
D3DUtil_ClearAll &HFF&
|
|
|
|
|
|
With g_dev
|
|
.BeginScene
|
|
|
|
|
|
' Draw reflection of particles
|
|
If (m_bDrawReflection) Then
|
|
Dim matReflectedView As D3DMATRIX
|
|
|
|
D3DXMatrixReflect matReflectedView, m_planeGround
|
|
D3DXMatrixMultiply matReflectedView, matReflectedView, m_matView
|
|
|
|
.SetTransform D3DTS_VIEW, matReflectedView
|
|
'Dim clipplane As D3DCLIPPLANE
|
|
'LSet clipplane = m_planeGround
|
|
'.SetClipPlane 0, clipplane
|
|
.SetRenderState D3DRS_CLIPPLANEENABLE, D3DCLIPPLANE0
|
|
|
|
' Draw particles
|
|
.SetTexture 0, m_ParticleTexture
|
|
.SetRenderState D3DRS_ZWRITEENABLE, 0 'FALSE
|
|
.SetRenderState D3DRS_ALPHABLENDENABLE, 1 'TRUE
|
|
|
|
m_ParticleSystem.Render g_dev
|
|
|
|
.SetRenderState D3DRS_ALPHABLENDENABLE, 0 'False
|
|
.SetRenderState D3DRS_ZWRITEENABLE, 1 'True
|
|
|
|
.SetRenderState D3DRS_CLIPPLANEENABLE, 0 'FALSE
|
|
|
|
.SetRenderState D3DRS_ALPHABLENDENABLE, 1 'True
|
|
.SetRenderState D3DRS_SRCBLEND, D3DBLEND_SRCALPHA
|
|
.SetRenderState D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA
|
|
.SetTextureStageState 0, D3DTSS_ALPHAOP, D3DTOP_MODULATE
|
|
End If
|
|
|
|
|
|
.SetRenderState D3DRS_ALPHABLENDENABLE, 0 'False
|
|
.SetRenderState D3DRS_ZWRITEENABLE, 1 'True
|
|
.SetRenderState D3DRS_CLIPPLANEENABLE, 0 'FALSE
|
|
|
|
.SetRenderState D3DRS_ALPHABLENDENABLE, 1 '1 'True
|
|
.SetRenderState D3DRS_SRCBLEND, D3DBLEND_SRCALPHA
|
|
.SetRenderState D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA
|
|
.SetTextureStageState 0, D3DTSS_ALPHAOP, D3DTOP_MODULATE
|
|
|
|
|
|
' Draw ground
|
|
.SetTransform D3DTS_VIEW, m_matView
|
|
.SetTexture 0, m_GroundTexture
|
|
.SetVertexShader D3DFVF_COLORVERTEX
|
|
.SetStreamSource 0, m_GroundVB, Len(v)
|
|
.SetIndices m_GroundIB, 0
|
|
.DrawIndexedPrimitive D3DPT_TRIANGLELIST, _
|
|
0, m_NumGroundVertices, _
|
|
0, (m_NumGroundIndices / 3)
|
|
|
|
' Draw particles
|
|
.SetRenderState D3DRS_ALPHABLENDENABLE, 1 'True
|
|
.SetRenderState D3DRS_SRCBLEND, D3DBLEND_ONE
|
|
.SetRenderState D3DRS_DESTBLEND, D3DBLEND_ONE
|
|
.SetTextureStageState 0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1
|
|
|
|
.SetRenderState D3DRS_ZWRITEENABLE, 0 'False
|
|
.SetRenderState D3DRS_ZENABLE, 1 'TRUE
|
|
|
|
.SetTexture 0, m_ParticleTexture
|
|
|
|
.SetRenderState D3DRS_ZENABLE, 0 'False
|
|
|
|
.SetTexture 0, m_ParticleTexture
|
|
m_ParticleSystem.Render g_dev
|
|
|
|
.SetRenderState D3DRS_ALPHABLENDENABLE, 0 'False
|
|
.SetRenderState D3DRS_ZWRITEENABLE, 1 'True
|
|
|
|
|
|
.EndScene
|
|
End With
|
|
|
|
End Function
|
|
|
|
|
|
|
|
|
|
|
|
|
|
'-----------------------------------------------------------------------------
|
|
' Name: InitDeviceObjects()
|
|
' Desc: Initialize scene objects.
|
|
'-----------------------------------------------------------------------------
|
|
Function InitDeviceObjects() As Boolean
|
|
|
|
Dim i As Long
|
|
Dim v As CUSTOMVERTEX
|
|
|
|
Set m_GroundTexture = D3DUtil_CreateTexture(g_dev, "Ground2.bmp", D3DFMT_UNKNOWN)
|
|
|
|
Set m_ParticleTexture = D3DUtil_CreateTexture(g_dev, "Particle.bmp", D3DFMT_UNKNOWN)
|
|
|
|
|
|
' Check if we can do the reflection effect
|
|
m_bCanDoAlphaBlend = ((g_d3dCaps.SrcBlendCaps And D3DPBLENDCAPS_SRCALPHA) = D3DPBLENDCAPS_SRCALPHA) And _
|
|
((g_d3dCaps.DestBlendCaps And D3DPBLENDCAPS_INVSRCALPHA) = D3DPBLENDCAPS_INVSRCALPHA)
|
|
m_bCanDoClipPlanes = (g_d3dCaps.MaxUserClipPlanes >= 1)
|
|
|
|
' Note: all HW with Software Vertex Processing can do clipplanes
|
|
m_bCanDoClipPlanes = True
|
|
|
|
If (m_bCanDoAlphaBlend And m_bCanDoClipPlanes) Then m_bDrawReflection = True
|
|
|
|
' Create ground object
|
|
|
|
' Create vertex buffer for ground object
|
|
Set m_GroundVB = g_dev.CreateVertexBuffer(m_NumGroundVertices * Len(v), _
|
|
0, D3DFVF_COLORVERTEX, D3DPOOL_MANAGED)
|
|
|
|
|
|
' Fill vertex buffer
|
|
|
|
Dim zz As Long, xx As Long
|
|
|
|
ReDim m_grVerts(GROUND_GRIDSIZE * GROUND_GRIDSIZE * 6)
|
|
|
|
|
|
i = 0
|
|
For zz = 0 To GROUND_GRIDSIZE
|
|
For xx = 0 To GROUND_GRIDSIZE
|
|
|
|
m_grVerts(i).v.x = GROUND_WIDTH * ((xx / GROUND_GRIDSIZE) - 0.5)
|
|
m_grVerts(i).v.y = 0
|
|
m_grVerts(i).v.z = GROUND_HEIGHT * ((zz / GROUND_GRIDSIZE) - 0.5)
|
|
m_grVerts(i).color = GROUND_COLOR
|
|
m_grVerts(i).tu = xx * (GROUND_TILE / GROUND_GRIDSIZE)
|
|
m_grVerts(i).tv = zz * (GROUND_TILE / GROUND_GRIDSIZE)
|
|
i = i + 1
|
|
Next
|
|
Next
|
|
|
|
D3DVertexBuffer8SetData m_GroundVB, 0, Len(v) * (GROUND_GRIDSIZE + 1) * (GROUND_GRIDSIZE + 1), 0, m_grVerts(0)
|
|
|
|
Dim vtx As Long
|
|
Dim m_Indices() As Integer
|
|
ReDim m_Indices(m_NumGroundIndices * 4)
|
|
Dim z As Long, x As Long
|
|
|
|
' Create the index buffer
|
|
Set m_GroundIB = g_dev.CreateIndexBuffer(m_NumGroundIndices * 2, _
|
|
0, _
|
|
D3DFMT_INDEX16, D3DPOOL_MANAGED)
|
|
|
|
' Fill in indices
|
|
i = 0
|
|
For z = 0 To GROUND_GRIDSIZE - 1
|
|
For x = 0 To GROUND_GRIDSIZE - 1
|
|
|
|
vtx = x + z * (GROUND_GRIDSIZE + 1)
|
|
m_Indices(i) = vtx + 1: i = i + 1
|
|
m_Indices(i) = vtx + 0: i = i + 1
|
|
m_Indices(i) = vtx + 0 + (GROUND_GRIDSIZE + 1): i = i + 1
|
|
m_Indices(i) = vtx + 1: i = i + 1
|
|
m_Indices(i) = vtx + 0 + (GROUND_GRIDSIZE + 1): i = i + 1
|
|
m_Indices(i) = vtx + 1 + (GROUND_GRIDSIZE + 1): i = i + 1
|
|
|
|
Next
|
|
Next
|
|
|
|
D3DIndexBuffer8SetData m_GroundIB, 0, 2 * m_NumGroundIndices, 0, m_Indices(0)
|
|
|
|
' Initialize the particle system
|
|
m_ParticleSystem.InitDeviceObjects g_dev
|
|
|
|
InitDeviceObjects = True
|
|
End Function
|
|
|
|
|
|
|
|
|
|
'-----------------------------------------------------------------------------
|
|
' Name: VerifyDevice()
|
|
'-----------------------------------------------------------------------------
|
|
Function VerifyDevice(Behavior As Long, format As CONST_D3DFORMAT) As Boolean
|
|
|
|
' Make sure device can do ONE:ONE alphablending
|
|
If (0 = (g_d3dCaps.SrcBlendCaps And D3DPBLENDCAPS_ONE) = D3DPBLENDCAPS_ONE) Then Exit Function
|
|
If (0 = (g_d3dCaps.DestBlendCaps And D3DPBLENDCAPS_ONE) = D3DPBLENDCAPS_ONE) Then Exit Function
|
|
|
|
' We will run this app using software vertex processing
|
|
If (Behavior = D3DCREATE_HARDWARE_VERTEXPROCESSING) Then Exit Function
|
|
|
|
|
|
VerifyDevice = True
|
|
|
|
End Function
|
|
|
|
|
|
|
|
'-----------------------------------------------------------------------------
|
|
' Name: DeleteDeviceObjects()
|
|
' Desc: Called when the app is exitting, or the device is being changed,
|
|
' this function deletes any device dependant objects.
|
|
'-----------------------------------------------------------------------------
|
|
Sub DeleteDeviceObjects()
|
|
|
|
Set m_GroundTexture = Nothing
|
|
Set m_ParticleTexture = Nothing
|
|
|
|
Set m_GroundVB = Nothing
|
|
Set m_GroundIB = Nothing
|
|
|
|
If (m_ParticleSystem Is Nothing) Then Exit Sub
|
|
m_ParticleSystem.DeleteDeviceObjects
|
|
m_binit = False
|
|
|
|
End Sub
|
|
|
|
|
|
|
|
|
|
|
|
'-----------------------------------------------------------------------------
|
|
' Name: FinalCleanup()
|
|
' Desc: Called before the app exits, this function gives the app the chance
|
|
' to cleanup after itself.
|
|
'-----------------------------------------------------------------------------
|
|
Sub FinalCleanup()
|
|
|
|
Set m_GroundTexture = Nothing
|
|
Set m_ParticleTexture = Nothing
|
|
Set m_ParticleSystem = Nothing
|
|
End Sub
|
|
|
|
|
|
'-----------------------------------------------------------------------------
|
|
' Name: InvalidateDeviceObjects()
|
|
' Desc: Place code to release non managed objects here
|
|
'-----------------------------------------------------------------------------
|
|
Sub InvalidateDeviceObjects()
|
|
'all objects are managed in this sample
|
|
End Sub
|
|
|
|
'-----------------------------------------------------------------------------
|
|
' Name: RestoreDeviceObjects()
|
|
' Desc:
|
|
'-----------------------------------------------------------------------------
|
|
Sub RestoreDeviceObjects()
|
|
|
|
' Set the world matrix
|
|
Dim matWorld As D3DMATRIX
|
|
D3DXMatrixIdentity matWorld
|
|
g_dev.SetTransform D3DTS_WORLD, matWorld
|
|
|
|
' Set projection matrix
|
|
Dim matProj As D3DMATRIX
|
|
D3DXMatrixPerspectiveFovLH matProj, g_pi / 4, Me.ScaleHeight / Me.ScaleWidth, 0.1, 100
|
|
g_dev.SetTransform D3DTS_PROJECTION, matProj
|
|
|
|
' Set renderstates
|
|
With g_dev
|
|
Call .SetTextureStageState(0, D3DTSS_MINFILTER, D3DTEXF_LINEAR)
|
|
Call .SetTextureStageState(0, D3DTSS_MAGFILTER, D3DTEXF_LINEAR)
|
|
Call .SetTextureStageState(0, D3DTSS_MIPFILTER, D3DTEXF_LINEAR)
|
|
Call .SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_MODULATE)
|
|
Call .SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1)
|
|
Call .SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_DISABLE)
|
|
Call .SetTextureStageState(1, D3DTSS_ALPHAOP, D3DTOP_DISABLE)
|
|
|
|
Call .SetRenderState(D3DRS_SRCBLEND, D3DBLEND_ONE)
|
|
Call .SetRenderState(D3DRS_DESTBLEND, D3DBLEND_ONE)
|
|
Call .SetRenderState(D3DRS_LIGHTING, 0) 'FALSE
|
|
Call .SetRenderState(D3DRS_CULLMODE, D3DCULL_CCW)
|
|
Call .SetRenderState(D3DRS_SHADEMODE, D3DSHADE_FLAT)
|
|
End With
|
|
|
|
End Sub
|
|
|
|
|
|
|
|
|