Code archives/3D Graphics - Effects/pixel precise xoffset yoffset of a screenmesh+screentexture
This code has been declared by its author to be Public Domain code.
Download source code
| |||||
| This shows how to add a pixel precise xoffset or yoffset to a screenmesh+screentexture (useful for fullscreen effects) related to : http://www.blitzbasic.com/codearcs/codearcs.php?code=3256 If you want to remove the blured effect on the screenmesh+screentexture, you need to disable bilinear filtering ( see : http://www.blitzbasic.com/Community/posts.php?topic=103591 ) | |||||
Graphics3D(1000,625,32,2)
InitDX7Hack()
DisableTextureFilters()
SeedRnd(MilliSecs())
Camera = CreateCamera()
CameraRange(Camera,0.1,100)
CameraClsColor(Camera,000,000,000)
Global ThingsCount%
Dim ThingMesh(1000)
For n% = 1 To 1000 Step 1
ThingsCount = ThingsCount + 1
I% = ThingsCount
ThingMesh(I) = CreateCube()
ScaleMesh(ThingMesh(I),1.0/2,1.0/2,1.0/2)
EntityColor(ThingMesh(I),Rand(025,255),Rand(025,255),Rand(025,255))
PositionEntity(ThingMesh(I),Rnd(-15,15),Rnd(-15,15),Rnd(-15,15),True)
Next
OLight = CreateLight(2)
LightRange(OLight,3.0)
LightColor(OLight,224,224,224)
AmbientLight(032,032,032)
ScreenMesh = CreateMesh()
Surface = CreateSurface(ScreenMesh)
AddVertex(Surface,-1.0,0.625,0.0)
VertexTexCoords(Surface,0,Float(0)/1024,Float(0)/1024)
AddVertex(Surface,1.0,0.625,0.0)
VertexTexCoords(Surface,1,Float(1000)/1024,Float(0)/1024)
AddVertex(Surface,-1.0,-0.625,0.0)
VertexTexCoords(Surface,2,Float(0)/1024,Float(625)/1024)
AddVertex(Surface,1.0,-0.625,0.0)
VertexTexCoords(Surface,3,Float(1000)/1024,Float(625)/1024)
AddTriangle(Surface,0,1,2)
AddTriangle(Surface,2,1,3)
UpdateNormals(ScreenMesh)
EntityColor(ScreenMesh,255,255,255)
EntityFX(ScreenMesh,1)
ScreenTexture = CreateTexture(1024,1024,16+32+256)
SetBuffer(TextureBuffer(ScreenTexture))
ClsColor(255,255,255)
Cls()
;ScaleTexture(ScreenTexture,1.0,1.0)
TextureBlend(ScreenTexture,1)
EntityTexture(ScreenMesh,ScreenTexture)
PositionEntity(Camera,0,0,-16,True)
Const CScene% = 1
Const CScreen% = 2
Global RenderMode% = CScreen
Global XOffset% = 0
Global YOffset% = 0
Repeat
MXDiff% = MouseXSpeed()
MYDiff% = MouseYSpeed()
MoveMouse(GraphicsWidth()/2,GraphicsHeight()/2)
TurnEntity(Camera,MYDiff*0.1,-MXDiff*0.1,0)
If( KeyDown(203)=1 )
XOffset = XOffset - 1
Else If( KeyDown(205)=1 )
XOffset = XOffset + 1
Else If( KeyDown(208)=1 )
YOffset = YOffset - 1
Else If( KeyDown(200)=1 )
YOffset = YOffset + 1
EndIf
; If( KeyHit(57)=1 )
; If( RenderMode = CScene )
; RenderMode = CScreen
; Else If( RenderMode = CScreen )
; RenderMode = CScene
; EndIf
; EndIf
PositionRotateEntityLikeOtherEntity(ScreenMesh,Camera)
MoveEntity(ScreenMesh,1.0/Float(1000)*2*XOffset,0.625/Float(625)*2*YOffset,1.0)
WireFrame(False)
If( KeyDown(2)=1 )
WireFrame(True)
EndIf
If( RenderMode = CScene )
For I% = 1 To ThingsCount Step 1
ShowEntity(ThingMesh(I))
Next
HideEntity(ScreenMesh)
SetBuffer(BackBuffer())
RenderWorld()
Color(255,255,255)
CText("RenderMode = Scene",0,0)
Else If( RenderMode = CScreen )
For I% = 1 To ThingsCount Step 1
ShowEntity(ThingMesh(I))
Next
HideEntity(ScreenMesh)
SetBuffer(BackBuffer())
RenderWorld()
CopyRect(0,0,GraphicsWidth(),GraphicsHeight(),0,0,BackBuffer(),TextureBuffer(ScreenTexture))
For I% = 1 To ThingsCount Step 1
HideEntity(ThingMesh(I))
Next
ShowEntity(ScreenMesh)
SetBuffer(BackBuffer())
RenderWorld()
Color(255,255,255)
CText("RenderMode = ScreenMesh+ScreenTexture",0,0)
CText("XOffset = "+XOffset,0,15)
CText("YOffset = "+YOffset,0,30)
EndIf
Flip(1)
Until( KeyDown(1)=1 )
End()
Const D3DTSS_MAGFILTER = 16
Const D3DTSS_MINFILTER = 17
Const D3DTSS_MIPFILTER = 18
Const D3DTSS_MIPMAPLODBIAS = 19
Const D3DTSS_MAXMIPLEVEL = 20
Const D3DTFG_POINT = 1
Const D3DTFG_LINEAR = 2
Const D3DTFP_NONE = 1
Const D3DTFN_POINT = 1
Const D3DTFN_LINEAR = 2
Function InitDX7Hack()
DX7DBF_SetSystemProperties( SystemProperty("Direct3D7"), SystemProperty("Direct3DDevice7"), SystemProperty("DirectDraw7"), SystemProperty("AppHWND"), SystemProperty("AppHINSTANCE") )
End Function
Function DisableTextureFilters()
;DX7DBF_SetMipmapLODBias( -10.0, 0 )
For Level = 0 To 7
DX7DBF_SetTextureStageState( Level, D3DTSS_MAGFILTER, D3DTFG_POINT )
DX7DBF_SetTextureStageState( Level, D3DTSS_MINFILTER, D3DTFN_POINT )
DX7DBF_SetTextureStageState( Level, D3DTSS_MIPFILTER, D3DTFP_NONE )
Next
End Function
Function CText(TextStr$,PX%,PY%)
Text(PX,PY,TextStr,False,False)
End Function
Function PositionEntityLikeOtherEntity(Entity,OEntity)
PositionEntity(Entity,EntityX(OEntity,True),EntityY(OEntity,True),EntityZ(OEntity,True),True)
End Function
Function RotateEntityLikeOtherEntity(Entity,OEntity)
RotateEntity(Entity,EntityPitch(OEntity,True),EntityYaw(OEntity,True),EntityRoll(OEntity,True),True)
End Function
Function PositionRotateEntityLikeOtherEntity(Entity,OEntity)
PositionEntity(Entity,EntityX(OEntity,True),EntityY(OEntity,True),EntityZ(OEntity,True),True)
RotateEntity(Entity,EntityPitch(OEntity,True),EntityYaw(OEntity,True),EntityRoll(OEntity,True),True)
End Function |
Comments
| ||
| Hi RemiD, Just saw this code as you suggested but I'm not sure if you are aware of this error.. Function 'dx7dbf_setsystemproperties' not found Thanks. |
| ||
| Reread the description... You need to use the external lib to desactivate bilinear filtering... But you can use the same code with bilinear filtering activated, here : but since bilinear filtering is activated, the render of the screenmesh+screentexture will be slightly blurred... |
Code Archives Forum