diff --git a/Terrain.xcodeproj/project.pbxproj b/Terrain.xcodeproj/project.pbxproj index 5a2b1da..a716d5f 100644 --- a/Terrain.xcodeproj/project.pbxproj +++ b/Terrain.xcodeproj/project.pbxproj @@ -51,6 +51,7 @@ C018AD3F21978E690094BE3C /* Queue.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Queue.swift; sourceTree = ""; }; C018AD412197907B0094BE3C /* QueueTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QueueTests.swift; sourceTree = ""; }; C028A6A121A46796005DE718 /* Math.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Math.swift; sourceTree = ""; }; + C04A27A421A6FB4B00FCABFB /* Random.hh */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = Random.hh; sourceTree = ""; }; C08C589F218F46F000EAFC2D /* Algorithms.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Algorithms.swift; sourceTree = ""; }; C08C58A1218F474E00EAFC2D /* TerrainAlgorithms.metal */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.metal; path = TerrainAlgorithms.metal; sourceTree = ""; }; C0C15A8A218DDD85007494E2 /* Terrain.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Terrain.app; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -121,6 +122,7 @@ isa = PBXGroup; children = ( C0C15ABA218E2A90007494E2 /* ShaderTypes.h */, + C04A27A421A6FB4B00FCABFB /* Random.hh */, C0C15AB8218E2A90007494E2 /* Shaders.metal */, C08C58A1218F474E00EAFC2D /* TerrainAlgorithms.metal */, ); diff --git a/Terrain2/Shaders/Random.hh b/Terrain2/Shaders/Random.hh new file mode 100644 index 0000000..d56f137 --- /dev/null +++ b/Terrain2/Shaders/Random.hh @@ -0,0 +1,44 @@ +// +// Random.hh +// Terrain +// +// Created by Eryn Wells on 11/22/18. +// Copyright © 2018 Eryn Wells. All rights reserved. +// + +#ifndef Random_hh +#define Random_hh + +/// A pseudo-random number generator providing several algorithms. +/// - http://reedbeta.com/blog/quick-and-easy-gpu-random-numbers-in-d3d11/ +struct PRNG { + PRNG(uint seed) : mSeed(wangHash(seed)) { } + + /// Generate a random unsigned integer using a linear congruential generator. + uint lcg() { + mSeed = 1664525 * mSeed + 1013904223; + return mSeed; + } + + /// Generate a random unsigned integer using the Xorshift algorithm from George Marsaglia's paper. + uint xorShift() { + mSeed ^= (mSeed << 13); + mSeed ^= (mSeed >> 17); + mSeed ^= (mSeed << 5); + return mSeed; + } + + uint wangHash(uint seed) { + seed = (seed ^ 61) ^ (seed >> 16); + seed *= 9; + seed = seed ^ (seed >> 4); + seed *= 0x27d4eb2d; + seed = seed ^ (seed >> 15); + return seed; + } + + private: + uint mSeed; +}; + +#endif /* Random_hh */ diff --git a/Terrain2/Shaders/TerrainAlgorithms.metal b/Terrain2/Shaders/TerrainAlgorithms.metal index 9b83074..7545a83 100644 --- a/Terrain2/Shaders/TerrainAlgorithms.metal +++ b/Terrain2/Shaders/TerrainAlgorithms.metal @@ -9,40 +9,10 @@ #include #include #include "ShaderTypes.h" +#include "Random.hh" + using namespace metal; -/// A pseudo-random number generator providing several algorithms. -/// - http://reedbeta.com/blog/quick-and-easy-gpu-random-numbers-in-d3d11/ -struct PRNG { - PRNG(uint seed) : mSeed(wangHash(seed)) { } - - /// Generate a random unsigned integer using a linear congruential generator. - uint lcg() { - mSeed = 1664525 * mSeed + 1013904223; - return mSeed; - } - - /// Generate a random unsigned integer using the Xorshift algorithm from George Marsaglia's paper. - uint xorShift() { - mSeed ^= (mSeed << 13); - mSeed ^= (mSeed >> 17); - mSeed ^= (mSeed << 5); - return mSeed; - } - - uint wangHash(uint seed) { - seed = (seed ^ 61) ^ (seed >> 16); - seed *= 9; - seed = seed ^ (seed >> 4); - seed *= 0x27d4eb2d; - seed = seed ^ (seed >> 15); - return seed; - } - -private: - uint mSeed; -}; - kernel void updateGeometryHeights(texture2d texture [[texture(GeneratorTextureIndexIn)]], constant float2 *texCoords [[buffer(GeneratorBufferIndexTexCoords)]], constant Uniforms &uniforms [[buffer(GeneratorBufferIndexUniforms)]],