aboutsummaryrefslogtreecommitdiff
path: root/advtrains/textures
ModeNameSize
-rwxr-xr-xadvtrains_across.png302logplain
-rwxr-xr-xadvtrains_across_anim.png524logplain
-rwxr-xr-xadvtrains_boiler.png413logplain
-rwxr-xr-xadvtrains_chimney.png309logplain
-rwxr-xr-xadvtrains_couple.png339logplain
-rw-r--r--advtrains_cpl_lock.png209logplain
-rw-r--r--advtrains_cpl_unlock.png213logplain
-rwxr-xr-xadvtrains_discouple.png293logplain
-rwxr-xr-xadvtrains_driver_cab.png352logplain
-rwxr-xr-xadvtrains_dtrack_atc_placer.png1259logplain
-rwxr-xr-xadvtrains_dtrack_bumper_placer.png2213logplain
-rwxr-xr-xadvtrains_dtrack_detector_placer.png1253logplain
-rwxr-xr-xadvtrains_dtrack_load_placer.png1248logplain
-rwxr-xr-xadvtrains_dtrack_placer.png1097logplain
-rwxr-xr-xadvtrains_dtrack_rail.png4582logplain
-rwxr-xr-xadvtrains_dtrack_shared.png7141logplain
-rwxr-xr-xadvtrains_dtrack_shared_atc.png7215logplain
-rwxr-xr-xadvtrains_dtrack_shared_detector_off.png7180logplain
-rwxr-xr-xadvtrains_dtrack_shared_detector_on.png7181logplain
-rwxr-xr-xadvtrains_dtrack_shared_load.png7339logplain
-rwxr-xr-xadvtrains_dtrack_shared_unload.png7338logplain
-rwxr-xr-xadvtrains_dtrack_slopeplacer.png2415logplain
-rwxr-xr-xadvtrains_dtrack_unload_placer.png1260logplain
-rwxr-xr-xadvtrains_platform.png193logplain
-rwxr-xr-xadvtrains_retrosignal.png8496logplain
-rwxr-xr-xadvtrains_retrosignal_inv.png2242logplain
-rwxr-xr-xadvtrains_signal_inv.png856logplain
-rwxr-xr-xadvtrains_signal_off.png5882logplain
-rwxr-xr-xadvtrains_signal_on.png5884logplain
-rwxr-xr-xadvtrains_signal_wall_off.png3056logplain
-rwxr-xr-xadvtrains_signal_wall_on.png3043logplain
-rwxr-xr-xadvtrains_track_cr.png33370logplain
-rwxr-xr-xadvtrains_track_cr_45.png33938logplain
-rwxr-xr-xadvtrains_track_placer.png32349logplain
-rwxr-xr-xadvtrains_track_st.png20405logplain
-rwxr-xr-xadvtrains_track_st_45.png39977logplain
-rwxr-xr-xadvtrains_track_swlcr.png33378logplain
-rwxr-xr-xadvtrains_track_swlcr_45.png45772logplain
-rwxr-xr-xadvtrains_track_swlst.png32321logplain
-rwxr-xr-xadvtrains_track_swlst_45.png46408logplain
-rwxr-xr-xadvtrains_track_swrcr.png33670logplain
-rwxr-xr-xadvtrains_track_swrcr_45.png46865logplain
-rwxr-xr-xadvtrains_track_swrst.png32654logplain
-rwxr-xr-xadvtrains_track_swrst_45.png47636logplain
-rwxr-xr-xadvtrains_trackworker.png328logplain
-rw-r--r--advtrains_wagon_placeholder.png723logplain
-rwxr-xr-xadvtrains_wheel.png582logplain
-rwxr-xr-xdrwho_screwdriver.png328logplain
lude "util/numeric.h" #include "util/string.h" #include "exceptions.h" #define NOISE_MAGIC_X 1619 #define NOISE_MAGIC_Y 31337 #define NOISE_MAGIC_Z 52591 #define NOISE_MAGIC_SEED 1013 typedef float (*Interp2dFxn)( float v00, float v10, float v01, float v11, float x, float y); typedef float (*Interp3dFxn)( float v000, float v100, float v010, float v110, float v001, float v101, float v011, float v111, float x, float y, float z); float cos_lookup[16] = { 1.0f, 0.9238f, 0.7071f, 0.3826f, .0f, -0.3826f, -0.7071f, -0.9238f, 1.0f, -0.9238f, -0.7071f, -0.3826f, .0f, 0.3826f, 0.7071f, 0.9238f }; FlagDesc flagdesc_noiseparams[] = { {"defaults", NOISE_FLAG_DEFAULTS}, {"eased", NOISE_FLAG_EASED}, {"absvalue", NOISE_FLAG_ABSVALUE}, {"pointbuffer", NOISE_FLAG_POINTBUFFER}, {"simplex", NOISE_FLAG_SIMPLEX}, {NULL, 0} }; /////////////////////////////////////////////////////////////////////////////// PcgRandom::PcgRandom(u64 state, u64 seq) { seed(state, seq); } void PcgRandom::seed(u64 state, u64 seq) { m_state = 0U; m_inc = (seq << 1u) | 1u; next(); m_state += state; next(); } u32 PcgRandom::next() { u64 oldstate = m_state; m_state = oldstate * 6364136223846793005ULL + m_inc; u32 xorshifted = ((oldstate >> 18u) ^ oldstate) >> 27u; u32 rot = oldstate >> 59u; return (xorshifted >> rot) | (xorshifted << ((-rot) & 31)); } u32 PcgRandom::range(u32 bound) { // If the bound is 0, we cover the whole RNG's range if (bound == 0) return next(); /* This is an optimization of the expression: 0x100000000ull % bound since 64-bit modulo operations typically much slower than 32. */ u32 threshold = -bound % bound; u32 r; /* If the bound is not a multiple of the RNG's range, it may cause bias, e.g. a RNG has a range from 0 to 3 and we take want a number 0 to 2. Using rand() % 3, the number 0 would be twice as likely to appear. With a very large RNG range, the effect becomes less prevalent but still present. This can be solved by modifying the range of the RNG to become a multiple of bound by dropping values above the a threshold. In our example, threshold == 4 % 3 == 1, so reject values < 1 (that is, 0), thus making the range == 3 with no bias. This loop may look dangerous, but will always terminate due to the RNG's property of uniformity. */ while ((r = next()) < threshold) ; return r % bound; } s32 PcgRandom::range(s32 min, s32 max) { if (max < min) throw PrngException("Invalid range (max < min)"); // We have to cast to s64 because otherwise this could overflow, // and signed overflow is undefined behavior. u32 bound = (s64)max - (s64)min + 1; return range(bound) + min; } void PcgRandom::bytes(void *out, size_t len) { u8 *outb = (u8 *)out; int bytes_left = 0; u32 r; while (len--) { if (bytes_left == 0) { bytes_left = sizeof(u32); r = next(); } *outb = r & 0xFF; outb++; bytes_left--; r >>= CHAR_BIT; } } s32 PcgRandom::randNormalDist(s32 min, s32 max, int num_trials) { s32 accum = 0; for (int i = 0; i != num_trials; i++) accum += range(min, max); return myround((float)accum / num_trials); } /////////////////////////////////////////////////////////////////////////////// float noise2d(int x, int y, s32 seed) { unsigned int n = (NOISE_MAGIC_X * x + NOISE_MAGIC_Y * y + NOISE_MAGIC_SEED * seed) & 0x7fffffff; n = (n >> 13) ^ n; n = (n * (n * n * 60493 + 19990303) + 1376312589) & 0x7fffffff; return 1.f - (float)(int)n / 0x40000000; } float noise3d(int x, int y, int z, s32 seed) { unsigned int n = (NOISE_MAGIC_X * x + NOISE_MAGIC_Y * y + NOISE_MAGIC_Z * z + NOISE_MAGIC_SEED * seed) & 0x7fffffff; n = (n >> 13) ^ n; n = (n * (n * n * 60493 + 19990303) + 1376312589) & 0x7fffffff; return 1.f - (float)(int)n / 0x40000000; } inline float dotProduct(float vx, float vy, float wx, float wy) { return vx * wx + vy * wy; } inline float linearInterpolation(float v0, float v1, float t) { return v0 + (v1 - v0) * t; } inline float biLinearInterpolation( float v00, float v10, float v01, float v11, float x, float y) { float tx = easeCurve(x); float ty = easeCurve(y); float u = linearInterpolation(v00, v10, tx); float v = linearInterpolation(v01, v11, tx); return linearInterpolation(u, v, ty); } inline float biLinearInterpolationNoEase( float v00, float v10, float v01, float v11, float x, float y) { float u = linearInterpolation(v00, v10, x); float v = linearInterpolation(v01, v11, x); return linearInterpolation(u, v, y); } float triLinearInterpolation( float v000, float v100, float v010, float v110, float v001, float v101, float v011, float v111, float x, float y, float z) { float tx = easeCurve(x); float ty = easeCurve(y); float tz = easeCurve(z); float u = biLinearInterpolationNoEase(v000, v100, v010, v110, tx, ty); float v = biLinearInterpolationNoEase(v001, v101, v011, v111, tx, ty); return linearInterpolation(u, v, tz); } float triLinearInterpolationNoEase( float v000, float v100, float v010, float v110, float v001, float v101, float v011, float v111, float x, float y, float z) { float u = biLinearInterpolationNoEase(v000, v100, v010, v110, x, y); float v = biLinearInterpolationNoEase(v001, v101, v011, v111, x, y); return linearInterpolation(u, v, z); } float noise2d_gradient(float x, float y, s32 seed, bool eased) { // Calculate the integer coordinates int x0 = myfloor(x); int y0 = myfloor(y); // Calculate the remaining part of the coordinates float xl = x - (float)x0; float yl = y - (float)y0; // Get values for corners of square float v00 = noise2d(x0, y0, seed); float v10 = noise2d(x0+1, y0, seed); float v01 = noise2d(x0, y0+1, seed); float v11 = noise2d(x0+1, y0+1, seed); // Interpolate if (eased) return biLinearInterpolation(v00, v10, v01, v11, xl, yl); return biLinearInterpolationNoEase(v00, v10, v01, v11, xl, yl); } float noise3d_gradient(float x, float y, float z, s32 seed, bool eased) { // Calculate the integer coordinates int x0 = myfloor(x); int y0 = myfloor(y); int z0 = myfloor(z); // Calculate the remaining part of the coordinates float xl = x - (float)x0; float yl = y - (float)y0; float zl = z - (float)z0; // Get values for corners of cube float v000 = noise3d(x0, y0, z0, seed); float v100 = noise3d(x0 + 1, y0, z0, seed); float v010 = noise3d(x0, y0 + 1, z0, seed); float v110 = noise3d(x0 + 1, y0 + 1, z0, seed); float v001 = noise3d(x0, y0, z0 + 1, seed); float v101 = noise3d(x0 + 1, y0, z0 + 1, seed); float v011 = noise3d(x0, y0 + 1, z0 + 1, seed); float v111 = noise3d(x0 + 1, y0 + 1, z0 + 1, seed); // Interpolate if (eased) { return triLinearInterpolation( v000, v100, v010, v110, v001, v101, v011, v111, xl, yl, zl); } return triLinearInterpolationNoEase( v000, v100, v010, v110, v001, v101, v011, v111, xl, yl, zl); } float noise2d_perlin(float x, float y, s32 seed, int octaves, float persistence, bool eased) { float a = 0; float f = 1.0; float g = 1.0; for (int i = 0; i < octaves; i++) { a += g * noise2d_gradient(x * f, y * f, seed + i, eased); f *= 2.0; g *= persistence; } return a; } float noise2d_perlin_abs(float x, float y, s32 seed, int octaves, float persistence, bool eased) { float a = 0; float f = 1.0; float g = 1.0; for (int i = 0; i < octaves; i++) { a += g * std::fabs(noise2d_gradient(x * f, y * f, seed + i, eased)); f *= 2.0; g *= persistence; } return a; } float noise3d_perlin(float x, float y, float z, s32 seed, int octaves, float persistence, bool eased) { float a = 0; float f = 1.0; float g = 1.0; for (int i = 0; i < octaves; i++) { a += g * noise3d_gradient(x * f, y * f, z * f, seed + i, eased); f *= 2.0; g *= persistence; } return a; } float noise3d_perlin_abs(float x, float y, float z, s32 seed, int octaves, float persistence, bool eased) { float a = 0; float f = 1.0; float g = 1.0; for (int i = 0; i < octaves; i++) {