Jump to content
The Dark Mod Forums

Proper & realistic moving water:


Bikerdude

Recommended Posts

It's a 50 frame loop. You can flip the uv map horizontally. You probably can play back the texture bit slower so it's longer (but less smooth). You could make longer animation. Perhaps the pattern could be a bit more uniform. Anyway it's a loop so in the end it will repeat.

It's only a model...

Link to comment
Share on other sites

  • Replies 77
  • Created
  • Last Reply

Top Posters In This Topic

Ironically naturally drops trickling down glass tend to be repetitive, you have to apply oil, dirt, airflow or a wetting agent in a different location to get the paths to not follow a similar way (if not the identical path) each time. Depending on the source of water, it can be remarkably temporally consistent too.

"The measure of a man's character is what he would do if he knew he never would be found out."

- Baron Thomas Babington Macauley

Link to comment
Share on other sites

Blimey I feel quite pampered just looking at those videos. =-P

"No proposition Euclid wrote,

No formulae the text-books know,

Will turn the bullet from your coat,

Or ward the tulwar's downward blow

Strike hard who cares—shoot straight who can—

The odds are on the cheaper man."

 

From 'Arithmetic on the Frontier' by Rudyard Kipling

Link to comment
Share on other sites

i wonder if you wash more streams of rain down the window in a busier fashion if you could trick the eye into missing the repetitiveness.

Alternatively maybe you could blend multiple scrolling rain normals on top of eachother with different timings, and randomize the starting position of each before a sequence starts?

Link to comment
Share on other sites

I must admit that I like the current example so much that I'm having a little trouble with this "constructive criticism". I suppose any random end-user might say the same things though.

OTOH... how many commercial games even have a rain on window effect? My 2 cents: This would be cool to have repetitive or not. :wub:

Please visit TDM's IndieDB site and help promote the mod:

 

http://www.indiedb.com/mods/the-dark-mod

 

(Yeah, shameless promotion... but traffic is traffic folks...)

Link to comment
Share on other sites

I suppose any random end-user might say the same things though.

ouch. i don't think there's anything wrong with the work at all, it looks phenomenal. This is all very new to TDM, so I think its natural that observers start wondering about how far these new-to-TDM techniques can be pushed. But its obviously not required or expected that arcturus get straight to work improving things to meet approval of the peanut gallery. been thinking about toying with it myself.

Edited by ungoliant
Link to comment
Share on other sites

I must admit that I like the current example so much that I'm having a little trouble with this "constructive criticism".

That's ok :) I also think it could use some more drops. Right now the effect is maybe a bit to subtle.

Alternatively maybe you could blend multiple scrolling rain normals on top of eachother with different timings, and randomize the starting position of each before a sequence starts?

It could work, but you would have straight paths of drops and they would not change shape.

It's only a model...

Link to comment
Share on other sites

Just added this into my mission and its looking great, thanks! :)

Link to comment
Share on other sites

  • 4 months later...

I made a tutorial explaining the process of creating the drops:

 

http://youtu.be/_WigtOd26dU

 

Were your water efforts added to TDM 2.02?

 

I would like to update the Moddb article with a few more videos...

Please visit TDM's IndieDB site and help promote the mod:

 

http://www.indiedb.com/mods/the-dark-mod

 

(Yeah, shameless promotion... but traffic is traffic folks...)

Link to comment
Share on other sites

You should find it in Goldwells mission.

 

Btw.: Very good job, arcturus. I've missed this here but just saw it in GW's mission and it looks bloody amazing.

FM's: Builder Roads, Old Habits, Old Habits Rebuild

Mapping and Scripting: Apples and Peaches

Sculptris Models and Tutorials: Obsttortes Models

My wiki articles: Obstipedia

Texture Blending in DR: DR ASE Blend Exporter

Link to comment
Share on other sites

I was also speaking of the other water assets such as the reflective water. (These are all great showcase videos, I wish they could be used in the article... oh well).

 

I made a 50 frames animated normalmap similar to the one posted by Rich_is_bored. It's made in Blender using the same ocean modifier so the pattern is the same as in the video above. The normalmap is also scrolled. The effect is similar to a single scrolling normalmap but it's slightly better, especially for still water.

 

http://www.youtube.com/watch?v=76tmYwLcqO0

 

Normalmap frames: https://www.dropbox....er_normalmap.7z

 

 

animated_water_refraction

{
noshadows
noimpact
nonsolid
{
	if ( (time * 50) % 49 == 0 )
	program		heatHaze.vfp
	vertexParm	0	time * 0.3 , time * 0 // scroll
	vertexParm	1	3 //magnitude
	fragmentMap	0	 _currentRender
	fragmentMap	1	textures/water_normalmap/water0001.tga
}
{
	if ( (time * 50) % 49 == 1 )
	program		heatHaze.vfp
	vertexParm	0	time * 0.3 , time * 0 // scroll
	vertexParm	1	3 //magnitude
	fragmentMap	0	 _currentRender
	fragmentMap	1	textures/water_normalmap/water0002.tga
}
{
	if ( (time * 50) % 49 == 2 )
	program		heatHaze.vfp
	vertexParm	0	time * 0.3 , time * 0 // scroll
	vertexParm	1	3 //magnitude
	fragmentMap	0	 _currentRender
	fragmentMap	1	textures/water_normalmap/water0003.tga
}
{
	if ( (time * 50) % 49 == 3 )
	program		heatHaze.vfp
	vertexParm	0	time * 0.3 , time * 0 // scroll
	vertexParm	1	3 //magnitude
	fragmentMap	0	 _currentRender
	fragmentMap	1	textures/water_normalmap/water0004.tga
}
{
	if ( (time * 50) % 49 == 4 )
	program		heatHaze.vfp
	vertexParm	0	time * 0.3 , time * 0 // scroll
	vertexParm	1	3 //magnitude
	fragmentMap	0	 _currentRender
	fragmentMap	1	textures/water_normalmap/water0005.tga
}
{
	if ( (time * 50) % 49 == 5 )
	program		heatHaze.vfp
	vertexParm	0	time * 0.3 , time * 0 // scroll
	vertexParm	1	3 //magnitude
	fragmentMap	0	 _currentRender
	fragmentMap	1	textures/water_normalmap/water0006.tga
}
{
	if ( (time * 50) % 49 == 6 )
	program		heatHaze.vfp
	vertexParm	0	time * 0.3 , time * 0 // scroll
	vertexParm	1	3 //magnitude
	fragmentMap	0	 _currentRender
	fragmentMap	1	textures/water_normalmap/water0007.tga
}
{
	if ( (time * 50) % 49 == 7 )
	program		heatHaze.vfp
	vertexParm	0	time * 0.3 , time * 0 // scroll
	vertexParm	1	3 //magnitude
	fragmentMap	0	 _currentRender
	fragmentMap	1	textures/water_normalmap/water0008.tga
}
{
	if ( (time * 50) % 49 == 8 )
	program		heatHaze.vfp
	vertexParm	0	time * 0.3 , time * 0 // scroll
	vertexParm	1	3 //magnitude
	fragmentMap	0	 _currentRender
	fragmentMap	1	textures/water_normalmap/water0009.tga
}
{
	if ( (time * 50) % 49 == 9 )
	program		heatHaze.vfp
	vertexParm	0	time * 0.3 , time * 0 // scroll
	vertexParm	1	3 //magnitude
	fragmentMap	0	 _currentRender
	fragmentMap	1	textures/water_normalmap/water0010.tga
}
{
	if ( (time * 50) % 49 == 10 )
	program		heatHaze.vfp
	vertexParm	0	time * 0.3 , time * 0 // scroll
	vertexParm	1	3 //magnitude
	fragmentMap	0	 _currentRender
	fragmentMap	1	textures/water_normalmap/water0011.tga
}
{
	if ( (time * 50) % 49 == 11 )
	program		heatHaze.vfp
	vertexParm	0	time * 0.3 , time * 0 // scroll
	vertexParm	1	3 //magnitude
	fragmentMap	0	 _currentRender
	fragmentMap	1	textures/water_normalmap/water0012.tga
}
{
	if ( (time * 50) % 49 == 12 )
	program		heatHaze.vfp
	vertexParm	0	time * 0.3 , time * 0 // scroll
	vertexParm	1	3 //magnitude
	fragmentMap	0	 _currentRender
	fragmentMap	1	textures/water_normalmap/water0013.tga
}
{
	if ( (time * 50) % 49 == 13 )
	program		heatHaze.vfp
	vertexParm	0	time * 0.3 , time * 0 // scroll
	vertexParm	1	3 //magnitude
	fragmentMap	0	 _currentRender
	fragmentMap	1	textures/water_normalmap/water0014.tga
}
{
	if ( (time * 50) % 49 == 14 )
	program		heatHaze.vfp
	vertexParm	0	time * 0.3 , time * 0 // scroll
	vertexParm	1	3 //magnitude
	fragmentMap	0	 _currentRender
	fragmentMap	1	textures/water_normalmap/water0015.tga
}
{
	if ( (time * 50) % 49 == 15 )
	program		heatHaze.vfp
	vertexParm	0	time * 0.3 , time * 0 // scroll
	vertexParm	1	3 //magnitude
	fragmentMap	0	 _currentRender
	fragmentMap	1	textures/water_normalmap/water0016.tga
}
{
	if ( (time * 50) % 49 == 16 )
	program		heatHaze.vfp
	vertexParm	0	time * 0.3 , time * 0 // scroll
	vertexParm	1	3 //magnitude
	fragmentMap	0	 _currentRender
	fragmentMap	1	textures/water_normalmap/water0017.tga
}
{
	if ( (time * 50) % 49 == 17 )
	program		heatHaze.vfp
	vertexParm	0	time * 0.3 , time * 0 // scroll
	vertexParm	1	3 //magnitude
	fragmentMap	0	 _currentRender
	fragmentMap	1	textures/water_normalmap/water0018.tga
}
{
	if ( (time * 50) % 49 == 18 )
	program		heatHaze.vfp
	vertexParm	0	time * 0.3 , time * 0 // scroll
	vertexParm	1	3 //magnitude
	fragmentMap	0	 _currentRender
	fragmentMap	1	textures/water_normalmap/water0019.tga
}
{
	if ( (time * 50) % 49 == 19 )
	program		heatHaze.vfp
	vertexParm	0	time * 0.3 , time * 0 // scroll
	vertexParm	1	3 //magnitude
	fragmentMap	0	 _currentRender
	fragmentMap	1	textures/water_normalmap/water0020.tga
}
{
	if ( (time * 50) % 49 == 20 )
	program		heatHaze.vfp
	vertexParm	0	time * 0.3 , time * 0 // scroll
	vertexParm	1	3 //magnitude
	fragmentMap	0	 _currentRender
	fragmentMap	1	textures/water_normalmap/water0021.tga
}
{
	if ( (time * 50) % 49 == 21 )
	program		heatHaze.vfp
	vertexParm	0	time * 0.3 , time * 0 // scroll
	vertexParm	1	3 //magnitude
	fragmentMap	0	 _currentRender
	fragmentMap	1	textures/water_normalmap/water0022.tga
}
{
	if ( (time * 50) % 49 == 22 )
	program		heatHaze.vfp
	vertexParm	0	time * 0.3 , time * 0 // scroll
	vertexParm	1	3 //magnitude
	fragmentMap	0	 _currentRender
	fragmentMap	1	textures/water_normalmap/water0023.tga
}
{
	if ( (time * 50) % 49 == 23 )
	program		heatHaze.vfp
	vertexParm	0	time * 0.3 , time * 0 // scroll
	vertexParm	1	3 //magnitude
	fragmentMap	0	 _currentRender
	fragmentMap	1	textures/water_normalmap/water0024.tga
}
{
	if ( (time * 50) % 49 == 24 )
	program		heatHaze.vfp
	vertexParm	0	time * 0.3 , time * 0 // scroll
	vertexParm	1	3 //magnitude
	fragmentMap	0	 _currentRender
	fragmentMap	1	textures/water_normalmap/water0025.tga
}
	{
	if ( (time * 50) % 49 == 25 )
	program		heatHaze.vfp
	vertexParm	0	time * 0.3 , time * 0 // scroll
	vertexParm	1	3 //magnitude
	fragmentMap	0	 _currentRender
	fragmentMap	1	textures/water_normalmap/water0026.tga
}
{
	if ( (time * 50) % 49 == 26 )
	program		heatHaze.vfp
	vertexParm	0	time * 0.3 , time * 0 // scroll
	vertexParm	1	3 //magnitude
	fragmentMap	0	 _currentRender
	fragmentMap	1	textures/water_normalmap/water0027.tga
}
{
	if ( (time * 50) % 49 == 27 )
	program		heatHaze.vfp
	vertexParm	0	time * 0.3 , time * 0 // scroll
	vertexParm	1	3 //magnitude
	fragmentMap	0	 _currentRender
	fragmentMap	1	textures/water_normalmap/water0028.tga
}
{
	if ( (time * 50) % 49 == 28 )
	program		heatHaze.vfp
	vertexParm	0	time * 0.3 , time * 0 // scroll
	vertexParm	1	3 //magnitude
	fragmentMap	0	 _currentRender
	fragmentMap	1	textures/water_normalmap/water0029.tga
}
{
	if ( (time * 50) % 49 == 29 )
	program		heatHaze.vfp
	vertexParm	0	time * 0.3 , time * 0 // scroll
	vertexParm	1	3 //magnitude
	fragmentMap	0	 _currentRender
	fragmentMap	1	textures/water_normalmap/water0030.tga
}
{
	if ( (time * 50) % 49 == 30 )
	program		heatHaze.vfp
	vertexParm	0	time * 0.3 , time * 0 // scroll
	vertexParm	1	3 //magnitude
	fragmentMap	0	 _currentRender
	fragmentMap	1	textures/water_normalmap/water0031.tga
}
{
	if ( (time * 50) % 49 == 31 )
	program		heatHaze.vfp
	vertexParm	0	time * 0.3 , time * 0 // scroll
	vertexParm	1	3 //magnitude
	fragmentMap	0	 _currentRender
	fragmentMap	1	textures/water_normalmap/water0032.tga
}
{
	if ( (time * 50) % 49 == 32 )
	program		heatHaze.vfp
	vertexParm	0	time * 0.3 , time * 0 // scroll
	vertexParm	1	3 //magnitude
	fragmentMap	0	 _currentRender
	fragmentMap	1	textures/water_normalmap/water0033.tga
}
{
	if ( (time * 50) % 49 == 33 )
	program		heatHaze.vfp
	vertexParm	0	time * 0.3 , time * 0 // scroll
	vertexParm	1	3 //magnitude
	fragmentMap	0	 _currentRender
	fragmentMap	1	textures/water_normalmap/water0034.tga
}
{
	if ( (time * 50) % 49 == 34 )
	program		heatHaze.vfp
	vertexParm	0	time * 0.3 , time * 0 // scroll
	vertexParm	1	3 //magnitude
	fragmentMap	0	 _currentRender
	fragmentMap	1	textures/water_normalmap/water0035.tga
}
{
	if ( (time * 50) % 49 == 35 )
	program		heatHaze.vfp
	vertexParm	0	time * 0.3 , time * 0 // scroll
	vertexParm	1	3 //magnitude
	fragmentMap	0	 _currentRender
	fragmentMap	1	textures/water_normalmap/water0036.tga
}
{
	if ( (time * 50) % 49 == 36 )
	program		heatHaze.vfp
	vertexParm	0	time * 0.3 , time * 0 // scroll
	vertexParm	1	3 //magnitude
	fragmentMap	0	 _currentRender
	fragmentMap	1	textures/water_normalmap/water0037.tga
}
{
	if ( (time * 50) % 49 == 37 )
	program		heatHaze.vfp
	vertexParm	0	time * 0.3 , time * 0 // scroll
	vertexParm	1	3 //magnitude
	fragmentMap	0	 _currentRender
	fragmentMap	1	textures/water_normalmap/water0038.tga
}
{
	if ( (time * 50) % 49 == 38 )
	program		heatHaze.vfp
	vertexParm	0	time * 0.3 , time * 0 // scroll
	vertexParm	1	3 //magnitude
	fragmentMap	0	 _currentRender
	fragmentMap	1	textures/water_normalmap/water0039.tga
}
{
	if ( (time * 50) % 49 == 39 )
	program		heatHaze.vfp
	vertexParm	0	time * 0.3 , time * 0 // scroll
	vertexParm	1	3 //magnitude
	fragmentMap	0	 _currentRender
	fragmentMap	1	textures/water_normalmap/water0040.tga
}
{
	if ( (time * 50) % 49 == 40 )
	program		heatHaze.vfp
	vertexParm	0	time * 0.3 , time * 0 // scroll
	vertexParm	1	3 //magnitude
	fragmentMap	0	 _currentRender
	fragmentMap	1	textures/water_normalmap/water0041.tga
}
{
	if ( (time * 50) % 49 == 41 )
	program		heatHaze.vfp
	vertexParm	0	time * 0.3 , time * 0 // scroll
	vertexParm	1	3 //magnitude
	fragmentMap	0	 _currentRender
	fragmentMap	1	textures/water_normalmap/water0042.tga
}
{
	if ( (time * 50) % 49 == 42 )
	program		heatHaze.vfp
	vertexParm	0	time * 0.3 , time * 0 // scroll
	vertexParm	1	3 //magnitude
	fragmentMap	0	 _currentRender
	fragmentMap	1	textures/water_normalmap/water0043.tga
}
{
	if ( (time * 50) % 49 == 43 )
	program		heatHaze.vfp
	vertexParm	0	time * 0.3 , time * 0 // scroll
	vertexParm	1	3 //magnitude
	fragmentMap	0	 _currentRender
	fragmentMap	1	textures/water_normalmap/water0044.tga
}
{
	if ( (time * 50) % 49 == 44 )
	program		heatHaze.vfp
	vertexParm	0	time * 0.3 , time * 0 // scroll
	vertexParm	1	3 //magnitude
	fragmentMap	0	 _currentRender
	fragmentMap	1	textures/water_normalmap/water0045.tga
}
{
	if ( (time * 50) % 49 == 45 )
	program		heatHaze.vfp
	vertexParm	0	time * 0.3 , time * 0 // scroll
	vertexParm	1	3 //magnitude
	fragmentMap	0	 _currentRender
	fragmentMap	1	textures/water_normalmap/water0046.tga
}
{
	if ( (time * 50) % 49 == 46 )
	program		heatHaze.vfp
	vertexParm	0	time * 0.3 , time * 0 // scroll
	vertexParm	1	3 //magnitude
	fragmentMap	0	 _currentRender
	fragmentMap	1	textures/water_normalmap/water0047.tga
}
{
	if ( (time * 50) % 49 == 47 )
	program		heatHaze.vfp
	vertexParm	0	time * 0.3 , time * 0 // scroll
	vertexParm	1	3 //magnitude
	fragmentMap	0	 _currentRender
	fragmentMap	1	textures/water_normalmap/water0048.tga
}
{
	if ( (time * 50) % 49 == 48 )
	program		heatHaze.vfp
	vertexParm	0	time * 0.3 , time * 0 // scroll
	vertexParm	1	3 //magnitude
	fragmentMap	0	 _currentRender
	fragmentMap	1	textures/water_normalmap/water0049.tga
}
{
	if ( (time * 50) % 49 == 49 )
	program		heatHaze.vfp
	vertexParm	0	time * 0.3 , time * 0 // scroll
	vertexParm	1	3 //magnitude
	fragmentMap	0	 _currentRender
	fragmentMap	1	textures/water_normalmap/water0050.tga
}
}

 

 

Please visit TDM's IndieDB site and help promote the mod:

 

http://www.indiedb.com/mods/the-dark-mod

 

(Yeah, shameless promotion... but traffic is traffic folks...)

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


  • Recent Status Updates

    • nbohr1more

      The FAQ wiki is almost a proper FAQ now. Probably need to spin-off a bunch of the "remedies" for playing older TDM versions into their own article.
      · 1 reply
    • nbohr1more

      Was checking out old translation packs and decided to fire up TDM 1.07. Rightful Property with sub-20 FPS areas yay! ( same areas run at 180FPS with cranked eye candy on 2.12 )
      · 3 replies
    • taffernicus

      i am so euphoric to see new FMs keep coming out and I am keen to try it out in my leisure time, then suddenly my PC is spouting a couple of S.M.A.R.T errors...
      tbf i cannot afford myself to miss my network emulator image file&progress, important ebooks, hyper-v checkpoint & hyper-v export and the precious thief & TDM gamesaves. Don't fall yourself into & lay your hands on crappy SSD
       
      · 7 replies
    • OrbWeaver

      Does anyone actually use the Normalise button in the Surface inspector? Even after looking at the code I'm not quite sure what it's for.
      · 7 replies
    • Ansome

      Turns out my 15th anniversary mission idea has already been done once or twice before! I've been beaten to the punch once again, but I suppose that's to be expected when there's over 170 FMs out there, eh? I'm not complaining though, I love learning new tricks and taking inspiration from past FMs. Best of luck on your own fan missions!
      · 4 replies
×
×
  • Create New...