mirror of
				https://github.com/ClassiCube/ClassiCube.git
				synced 2025-11-03 11:04:36 -05:00 
			
		
		
		
	
		
			
				
	
	
		
			71 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			71 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
// ClassicalSharp copyright 2014-2016 UnknownShadow200 | Licensed under MIT
 | 
						|
// Based off the incredible work from https://dl.dropboxusercontent.com/u/12694594/lava.txt
 | 
						|
using System;
 | 
						|
using System.Security.Cryptography;
 | 
						|
using ClassicalSharp.Generator;
 | 
						|
using ClassicalSharp;
 | 
						|
 | 
						|
namespace ClassicalSharp {
 | 
						|
	public unsafe class LavaAnimation {
 | 
						|
		float[] flameHeat, potHeat, soupHeat;
 | 
						|
		JavaRandom rnd = null;
 | 
						|
		
 | 
						|
		public unsafe void Tick(int* ptr, int size) {
 | 
						|
			if (rnd == null)
 | 
						|
				rnd = new JavaRandom(new Random().Next());
 | 
						|
			int mask = size - 1, shift = CheckSize(size);
 | 
						|
			
 | 
						|
			int i = 0;
 | 
						|
			for (int y = 0; y < size; y++)
 | 
						|
				for (int x = 0; x < size; x++)
 | 
						|
			{
 | 
						|
				// Calculate the colour at this coordinate in the heatmap
 | 
						|
				float lSoupHeat = 0;
 | 
						|
				int xOffset = x + (int)(1.2 * Math.Sin(y * 22.5 * Utils.Deg2Rad));
 | 
						|
				int yOffset = y + (int)(1.2 * Math.Sin(x * 22.5 * Utils.Deg2Rad));
 | 
						|
				for (int j = 0; j < 9; j++) {
 | 
						|
					int xx = xOffset + (j % 3 - 1);
 | 
						|
					int yy = yOffset + (j / 3 - 1);
 | 
						|
					lSoupHeat += soupHeat[(yy & mask) << shift | (xx & mask)];
 | 
						|
				}
 | 
						|
				
 | 
						|
				float lPotHeat = potHeat[i]                                 // x    , y
 | 
						|
					+ potHeat[y << shift | ((x + 1) & mask)] +              // x + 1, y
 | 
						|
					+ potHeat[((y + 1) & mask) << shift | x] +              // x    , y + 1
 | 
						|
					+ potHeat[((y + 1) & mask) << shift | ((x + 1) & mask)];// x + 1, y + 1
 | 
						|
				
 | 
						|
				soupHeat[i] = lSoupHeat * 0.1f + lPotHeat * 0.2f;
 | 
						|
				potHeat[i] += flameHeat[i];
 | 
						|
				if (potHeat[i] < 0) potHeat[i] = 0;
 | 
						|
				flameHeat[i] -= 0.06f * 0.01f;
 | 
						|
				
 | 
						|
				if (rnd.NextFloat() <= 0.005f)
 | 
						|
					flameHeat[i] = 1.5f * 0.01f;
 | 
						|
				
 | 
						|
				// Output the pixel
 | 
						|
				float col = 2 * soupHeat[i];
 | 
						|
				col = col < 0 ? 0 : col;
 | 
						|
				col = col > 1 ? 1 : col;
 | 
						|
				
 | 
						|
				float r = col * 100 + 155;
 | 
						|
				float g = col * col * 255;
 | 
						|
				float b = col * col * col * col * 128;
 | 
						|
				*ptr = 255 << 24 | (byte)r << 16 | (byte)g << 8 | (byte)b;
 | 
						|
				
 | 
						|
				ptr++; i++;
 | 
						|
			}
 | 
						|
		}
 | 
						|
		
 | 
						|
		int CheckSize(int size) {
 | 
						|
			if (potHeat == null || potHeat.Length < size * size) {
 | 
						|
				flameHeat = new float[size * size];
 | 
						|
				potHeat = new float[size * size];
 | 
						|
				soupHeat = new float[size * size];
 | 
						|
			}
 | 
						|
			
 | 
						|
			int shift = 0;
 | 
						|
			while (size > 1) { shift++; size >>= 1; }
 | 
						|
			return shift;
 | 
						|
		}
 | 
						|
	}
 | 
						|
} |