Refraction.
Code: Select all
' *-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*
' Xors3D shading sample: 'Refraction'
' Original source from MoKa (Maxim Miheyev)
' Converted in 2012 by Guevara-chan.
' *-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*
#Include ".\include\Xors3d.bi"
Declare Sub UpdateInput()
Declare Sub UpdateCamera(Camera As Integer,ViewSensivity As Single,MoveSensivity As Single)
Declare Function mLoadSkyBox(d As String,t As String="jpg") As Integer
'====================================
'====================================
' Window
xGraphics3D(800,600,32,0,0)
xSetTextureFiltering(TF_ANISOTROPIC)
'====================================
'====================================
' Font
Var Font=xLoadFont("Tahoma",10)
xSetFont(Font)
'====================================
'====================================
' Varriables
Dim Shared As Integer mXSp,mYSp
Dim Shared As Integer IKdQ,IKdW,IKdE,IKdA,IKdS,IKdD
Dim Shared As Integer IKhF1,EffRefractionNM=TRUE
'====================================
'====================================
' Camera
Dim Shared As Integer gCamera
gCamera=xCreateCamera()
xCameraZoom(gCamera,0.8)
xCameraClsColor(gCamera,0,0,0)
xRotateEntity(gCamera,-20,45,0)
xMoveEntity(gCamera,0,10,-100)
xCameraRange(gCamera,1,6000)
'====================================
'====================================
' SkyBox
Dim Shared As Integer SkyBox
SkyBox=mLoadSkyBox("Media\Extra media\SkyBox\Sky1")
xPositionMesh(SkyBox,0,1,0)
xScaleEntity(SkyBox,3000,1500,3000)
'====================================
'====================================
' Shader
Var tShader=xLoadFXFile("Media\Materials\Refraction.fx")
'====================================
'====================================
' Model
Var tModel=xLoadMesh("Media\Extra media\HellKnight.b3d")
xUpdateNormals(tModel)
Var tTextureNormal=xLoadTexture("Media\Extra media\HellKnight_Normal.jpg")
Var tTextureScreen=xCreateTexture(256,192)
xSetEntityEffect(tModel,tShader)
xSetEffectTechnique(tModel,"RefractionNM")
xSetEffectMatrixSemantic(tModel,"MatWorldViewProj",WORLDVIEWPROJ)
xSetEffectMatrixSemantic(tModel,"MatWorld",WORLD)
' Shader Varriables
xSetEffectTexture(tModel, "tNormal",tTextureNormal)
xSetEffectTexture(tModel, "tScreen",tTextureScreen)
xSetEffectFloat(tModel, "FallOffInt",0.2)
xSetEffectVector(tModel, "FallOffClr",0,0.6,0.8)
xSetEffectFloat(tModel, "FallOffSoft",4)
xSetEffectFloat(tModel, "Refract",0.1)
'====================================
'====================================
' Main Cycle
xMoveMouse(400,300)
Do
UpdateInput()
UpdateCamera(gCamera,0.1,1)
xPositionEntity(SkyBox,xEntityX(gCamera),xEntityY(gCamera),xEntityZ(gCamera))
'====================================
xTurnEntity(tModel,0,0.2,0)
If IKhF1 Then
EffRefractionNM = EffRefractionNM Xor 1
If EffRefractionNM Then
xSetEffectTechnique(tModel,"RefractionNM")
Else
xSetEffectTechnique(tModel,"Refraction")
EndIf
EndIf
'====================================
If xKeyHit(KEY_ESCAPE) Then : Exit Do : EndIf
'====================================
' Render Refraction
xHideEntity(tModel)
xCameraViewport(gCamera,0,0,256,192)
xSetBuffer(xTextureBuffer(tTextureScreen))
xRenderWorld()
xSetBuffer(xBackBuffer())
xCameraViewport(gCamera,0,0,800,600)
xShowEntity(tModel)
'====================================
' Setting Parameters
xSetEffectVector(tModel, "PosCamera",xEntityX(gCamera),xEntityY(gCamera),xEntityZ(gCamera))
'====================================
xRenderWorld()
'====================================
'====================================
xText(10,10,"TrisRendered: "+Str(xTrisRendered()))
xText(10,25,"FPS: "+Str(xGetFPS()))
'====================================
If EffRefractionNM Then
xText(10,575,"Press F1 to Change Refraction Mode to Simple")
Else
xText(10,575,"Press F1 to Change Refraction Mode to Normal Mapped")
EndIf
'====================================
xFlip()
Loop
'====================================
'====================================
' Functions
Sub UpdateInput()
xMoveMouse(400,300)
mXSp=xMouseXSpeed() : mYSp=xMouseYSpeed()
IKdQ=xKeyDown(KEY_Q) : IKdW=xKeyDown(KEY_W)
IKdE=xKeyDown(KEY_E) : IKdA=xKeyDown(KEY_A)
IKdS=xKeyDown(KEY_S) : IKdD=xKeyDown(KEY_D)
IKhF1=xKeyHit(KEY_F1)
End Sub
Function SgnF(Value As Single) As Single' Returns sign of value.
If Value > 0 Then
Return 1
ElseIf Value < 0 Then
Return -1
EndIf
End Function
Sub UpdateCamera(Camera As Integer,ViewSensivity As Single,MoveSensivity As Single)
Dim As Single CamP=xEntityPitch(gCamera)+mYSp*ViewSensivity
If Abs(CamP)>80 Then : CamP=80*SgnF(CamP) : EndIf
xTurnEntity(Camera,0,-mXSp*ViewSensivity,0)
xRotateEntity(Camera,CamP,xEntityYaw(gCamera),0)
xMoveEntity(Camera,(IKdD-IKdA)*MoveSensivity,(IKdE-IKdQ)*MoveSensivity,(IKdW-IKdS)*MoveSensivity)
End Sub
Function mLoadSkyBox(d As String,t As String="jpg") As Integer
Dim As Integer Mesh,Brush,Texture,Surf,v0,v1,v2,v3
Mesh=xCreateMesh()
' Left
' If FileSize(d+"\"+"left."+t)=>0 Then
Texture=xLoadTexture(d+"\"+"left."+t,49)
Brush=xCreateBrush()
xBrushTexture(Brush,Texture)
Surf=xCreateSurface(Mesh,Brush)
v0=xAddVertex(Surf,-1, 1,-1,0,0)
v1=xAddVertex(Surf,-1, 1, 1,1,0)
v2=xAddVertex(Surf,-1,-1,-1,0,1)
v3=xAddVertex(Surf,-1,-1, 1,1,1)
xAddTriangle(Surf,v2,v1,v0)
xAddTriangle(Surf,v1,v2,v3)
' EndIf
' Front
' If FileSize(d+"\"+"front."+t)=>0 Then
Texture=xLoadTexture(d+"\"+"front."+t,49)
Brush=xCreateBrush()
xBrushTexture(Brush,Texture)
Surf=xCreateSurface(Mesh,Brush)
v0=xAddVertex(Surf,-1, 1,1,0,0)
v1=xAddVertex(Surf, 1, 1,1,1,0)
v2=xAddVertex(Surf,-1,-1,1,0,1)
v3=xAddVertex(Surf, 1,-1,1,1,1)
xAddTriangle(Surf,v2,v1,v0)
xAddTriangle(Surf,v1,v2,v3)
' EndIf
' Right
' If FileSize(d+"\"+"right."+t)=>0 Then
Texture=xLoadTexture(d+"\"+"right."+t,49)
Brush=xCreateBrush()
xBrushTexture(Brush,Texture)
Surf=xCreateSurface(Mesh,Brush)
v0=xAddVertex(Surf,1, 1, 1,0,0)
v1=xAddVertex(Surf,1, 1,-1,1,0)
v2=xAddVertex(Surf,1,-1, 1,0,1)
v3=xAddVertex(Surf,1,-1,-1,1,1)
xAddTriangle(Surf,v2,v1,v0)
xAddTriangle(Surf,v1,v2,v3)
' EndIf
' Back
' If FileSize(d+"\"+"back."+t)=>0 Then
Texture=xLoadTexture(d+"\"+"back."+t,49)
Brush=xCreateBrush()
xBrushTexture(Brush,Texture)
Surf=xCreateSurface(Mesh,Brush)
v0=xAddVertex(Surf, 1, 1,-1,0,0)
v1=xAddVertex(Surf,-1, 1,-1,1,0)
v2=xAddVertex(Surf, 1,-1,-1,0,1)
v3=xAddVertex(Surf,-1,-1,-1,1,1)
xAddTriangle(Surf,v2,v1,v0)
xAddTriangle(Surf,v1,v2,v3)
' EndIf
' Bottom
' If FileSize(d+"\"+"bottom."+t)=>0 Then
Texture=xLoadTexture(d+"\"+"bottom."+t,49)
Brush=xCreateBrush()
xBrushTexture(Brush,Texture)
Surf=xCreateSurface(Mesh,Brush)
v0=xAddVertex(Surf,-1,-1, 1,0,0)
v1=xAddVertex(Surf, 1,-1, 1,1,0)
v2=xAddVertex(Surf,-1,-1,-1,0,1)
v3=xAddVertex(Surf, 1,-1,-1,1,1)
xAddTriangle(Surf,v2,v1,v0)
xAddTriangle(Surf,v1,v2,v3)
' EndIf
' Top
' If FileSize(d+"\"+"top."+t)=>0 Then
Texture=xLoadTexture(d+"\"+"top."+t,49)
Brush=xCreateBrush()
xBrushTexture(Brush,Texture)
Surf=xCreateSurface(Mesh,Brush)
v0=xAddVertex(Surf,-1, 1, 1,0,0)
v1=xAddVertex(Surf,-1, 1,-1,1,0)
v2=xAddVertex(Surf, 1, 1, 1,0,1)
v3=xAddVertex(Surf, 1, 1,-1,1,1)
xAddTriangle(Surf,v2,v1,v0)
xAddTriangle(Surf,v1,v2,v3)
' EndIf
xEntityFX(Mesh,1+8)
xFlipMesh(Mesh)
xUpdateNormals(Mesh)
Return Mesh
End Function
'====================================