Raining outside
Blitz3D Forums/Blitz3D Programming/Raining outside
| ||
| Has anyone got the code for a simple rain animation on a texture? re-word: i mean, has anyone got any code that will make rain in 3d OR a animated texture of rain? |
| ||
| There's the ripple-effect thing in the code archives, combined with the Snow/rain/stars code too. ----------- There's a lot more besides just those too but see what works best for you! |
| ||
| I'm not too fussed about sharing this code I've written which will be used in our up and coming RPG. It includes the fogging effect I've been using as well, but you'll need a grayscale image for the fog itself. It's sorta cartoony looking but it can be altered to suit needs, plus it's got splash effects but you'll need a splash image for that too. You need a 'Cam' object and the water splashes are detected on a collision with EntityType's of 2. Then call init_weather with the required effect (see the constants) to initialise and update_weather for each frame. Call clear_weather to clear all entities but this doesn't clear the actual textures used.
;===================================================
; <untitled> RPG, (c)2003 Sunteam Software
; INCLUDE FILE: atmospherics_include.bb
;===================================================
; Weather flags
;----------------
Const w_clear=0 ; = clear
Const w_rain=1 ; = rain
Const w_fog=2 ; = fog
Const num_droplets%=40 ; max number of rain droplets
Const fog_range%=150 ; maximum fog range
Const rain_xval%=40
Const rain_zval%=100
Global fog_sphere1%=0 ; sphere for fog effect
Global weather_limit%=0 ; current weather
; fog texture
Global fog_tex1%=LoadTexture("fx\fog.png")
TextureBlend fog_tex1,2
Global fogt1u#=0.0,fogt1v#=0.0,fogt1a#=0.0
Global fog_tex2%=LoadTexture("fx\fog.png")
Global fogt2u#=0.5,fogt2v#=0.5,fogt2a#=0.0
TextureBlend fog_tex2,2
PositionTexture fog_tex2,0.5,0.5
; rain splash_tex texture
Global splash_tex%=LoadSprite("fx\splash.bmp")
SpriteViewMode splash_tex,2
HideEntity splash_tex
TurnEntity splash_tex,90,0,0
Type rain_droplet
Field id%,vis%
End Type
Type rain_splash
Field id%,r#,a#
End Type
Function init_weather(wstart%)
Local n%,r.rain_droplet
weather_limit=wstart
If wstart And w_rain Then
rain_precip=100
num_raindrops=num_droplets
For n=1 To num_droplets
r=New rain_droplet
r\id=CreateCube()
r\vis=1
ScaleEntity r\id,0.15,0.5,0.15
EntityColor r\id,100,100,255
EntityAlpha r\id,0.3
PositionEntity r\id,EntityX(Cam,True)+Rnd(-rain_xval,rain_xval),EntityY(Cam,True)+Rnd(-100,40),EntityZ(Cam,True)+Rnd(0,rain_zval)
TurnEntity r\id,180,0,0
EntityType r\id,col_rain
EntityRadius r\id,0.15,0.5
Next
EndIf
If wstart And w_fog Then
fog_precip=50
fog_sphere1=CreateSphere()
ScaleEntity fog_sphere1,200,40,fog_range/4
EntityTexture fog_sphere1,fog_tex1,0,0
EntityTexture fog_sphere1,fog_tex2,0,1
FlipMesh fog_sphere1
EntityAlpha fog_sphere1,0.4
EntityShininess fog_sphere1,0.5
PositionEntity fog_sphere1,EntityX(Cam,True),EntityY(Cam,True),EntityZ(Cam,True)
RotateEntity fog_sphere1,-30,180,0
EntityParent fog_sphere1,Cam
CameraFogMode Cam,1
CameraFogRange Cam,10,fog_range
EndIf
End Function
Function update_weather()
Local r.rain_droplet,s.rain_splash
If weather_limit And w_rain Then
For r=Each rain_droplet
PositionEntity r\id,EntityX(r\id),EntityY(r\id)-2,EntityZ(r\id)
If EntityY(r\id,True)<EntityY(Cam,True)-100 Then PositionEntity r\id,EntityX(r\id,True),EntityY(Cam,True)+40,EntityZ(r\id,True),True
If EntityX(r\id,True)<EntityX(Cam,True)-rain_xval Then PositionEntity r\id,EntityX(Cam,True)+rain_xval,EntityY(r\id,True),EntityZ(r\id,True),True
If EntityX(r\id,True)>EntityX(Cam,True)+rain_xval Then PositionEntity r\id,EntityX(Cam,True)-rain_xval,EntityY(r\id,True),EntityZ(r\id,True),True
If EntityZ(r\id,True)<EntityZ(Cam,True) Then PositionEntity r\id,EntityX(r\id,True),EntityY(r\id,True),EntityZ(Cam,True)+rain_zval,True
If EntityZ(r\id,True)>EntityZ(Cam,True)+rain_zval Then PositionEntity r\id,EntityX(r\id,True),EntityY(r\id,True),EntityZ(Cam,True),True
If CountCollisions(r\id)>0 Then
ResetEntity r\id
s=New rain_splash
s\id=CopyEntity(splash_tex)
ShowEntity s\id
s\r=0.2
PositionEntity s\id,EntityX(r\id,True),EntityY(r\id,True)+1,EntityZ(r\id,True)
PositionEntity r\id,EntityX(Cam,True)+Rnd(-rain_xval,rain_xval),EntityY(Cam,True)+Rnd(-100,40),EntityZ(r\id,True),True
s\a=0.6-((1.0-((EntityY(cam,True)-EntityY(s\id,True))/60.0))/2)
ScaleSprite s\id,s\a,s\a
EntityAlpha s\id,s\a
EndIf
Next
For s=Each rain_splash
s\r=s\r+0.05
s\a=s\a-0.02
If s\a<0.1 Then
FreeEntity s\id
Delete s
Else
ScaleSprite s\id,s\r,s\r
EntityAlpha s\id,s\a
EndIf
Next
EndIf
If weather_limit And w_fog Then
fogt1u=fogt1u+0.0001
fogt1v=fogt1v+0.0001
fogt2u=fogt2u-0.0001
fogt2v=fogt2v-0.0001
If fogt1u>1.0 Then fogt1u=fogt1u-1.0
If fogt1v>1.0 Then fogt1v=fogt1v-1.0
If fogt2u<0.0 Then fogt2u=fogt2u+1.0
If fogt2v<0.0 Then fogt2v=fogt2v+1.0
PositionTexture fog_tex1,fogt1u,fogt1v
PositionTexture fog_tex2,fogt2u,fogt2v
fogt1a=fogt1a+0.0005
fogt2a=fogt2a-0.0005
If fogt1a>360.0 Then fogt1a=fogt1a-360.0
If fogt2a<0.0 Then fogt2a=fogt2a-360.0
RotateTexture fog_tex1,fogt1a
RotateTexture fog_tex2,fogt2a
EndIf
End Function
Function clear_weather()
Local r.rain_droplet
For r=Each rain_droplet
FreeEntity r\id
Delete r
Next
If weather_limit And w_fog Then CameraFogMode Cam,0
End Function
It probably needs optimising as well but for the moment I get excellent frame rates with it :) Enjoy. |