├── .gitattributes ├── .gitignore ├── DFTs.pdf ├── DX12.h ├── FastNoise.exe ├── FastNoise.pdb ├── FastNoise.sln ├── FastNoise.vcxproj ├── FastNoise.vcxproj.filters ├── FastNoise.vcxproj.user ├── FastNoiseDesign.md ├── LICENSE.txt ├── README.md ├── SBuffer.h ├── SImage.cpp ├── SImage.h ├── SOTPointSets ├── .gitignore ├── LICENSE ├── NumericalCDF.h ├── README.md ├── SOTPointSets.sln ├── SOTPointSets.vcxproj ├── SOTPointSets.vcxproj.filters ├── flower.png ├── flower.txt ├── main.cpp ├── maths.h ├── squarecdf.h ├── star.png └── stb │ ├── LICENSE │ ├── README.md │ ├── stb_image.h │ └── stb_image_write.h ├── analysis ├── circle │ ├── circle_uniform_binomial_2.png │ ├── circle_uniform_binomial_2_histogram.png │ ├── circle_uniform_binomial_2_spectrum.png │ ├── circle_uniform_binomial_3.png │ ├── circle_uniform_binomial_3_histogram.png │ ├── circle_uniform_binomial_3_spectrum.png │ ├── circle_uniform_box_3.png │ ├── circle_uniform_box_3_histogram.png │ ├── circle_uniform_box_3_spectrum.png │ ├── circle_uniform_box_5.png │ ├── circle_uniform_box_5_histogram.png │ ├── circle_uniform_box_5_spectrum.png │ ├── circle_uniform_gauss_0.5.png │ ├── circle_uniform_gauss_0.5_histogram.png │ ├── circle_uniform_gauss_0.5_spectrum.png │ ├── circle_uniform_gauss_0.7.png │ ├── circle_uniform_gauss_0.7_histogram.png │ ├── circle_uniform_gauss_0.7_spectrum.png │ ├── circle_uniform_gauss_1.0.png │ ├── circle_uniform_gauss_1.0_histogram.png │ └── circle_uniform_gauss_1.0_spectrum.png ├── real │ ├── real_tent_binomial_2.png │ ├── real_tent_binomial_2_histogram.png │ ├── real_tent_binomial_2_spatial_error_binomial_2.txt │ ├── real_tent_binomial_2_spatial_error_binomial_3.txt │ ├── real_tent_binomial_2_spatial_error_box_3.txt │ ├── real_tent_binomial_2_spatial_error_box_5.txt │ ├── real_tent_binomial_2_spatial_error_gauss_0.7.txt │ ├── real_tent_binomial_2_spatial_error_gauss_1.0.txt │ ├── real_tent_binomial_2_spectrum.png │ ├── real_tent_binomial_3.png │ ├── real_tent_binomial_3_histogram.png │ ├── real_tent_binomial_3_spatial_error_binomial_2.txt │ ├── real_tent_binomial_3_spatial_error_binomial_3.txt │ ├── real_tent_binomial_3_spatial_error_box_3.txt │ ├── real_tent_binomial_3_spatial_error_box_5.txt │ ├── real_tent_binomial_3_spatial_error_gauss_0.7.txt │ ├── real_tent_binomial_3_spatial_error_gauss_1.0.txt │ ├── real_tent_binomial_3_spectrum.png │ ├── real_tent_box_3.png │ ├── real_tent_box_3_histogram.png │ ├── real_tent_box_3_spatial_error_binomial_2.txt │ ├── real_tent_box_3_spatial_error_binomial_3.txt │ ├── real_tent_box_3_spatial_error_box_3.txt │ ├── real_tent_box_3_spatial_error_box_5.txt │ ├── real_tent_box_3_spatial_error_gauss_0.7.txt │ ├── real_tent_box_3_spatial_error_gauss_1.0.txt │ ├── real_tent_box_3_spectrum.png │ ├── real_tent_box_5.png │ ├── real_tent_box_5_histogram.png │ ├── real_tent_box_5_spatial_error_binomial_2.txt │ ├── real_tent_box_5_spatial_error_binomial_3.txt │ ├── real_tent_box_5_spatial_error_box_3.txt │ ├── real_tent_box_5_spatial_error_box_5.txt │ ├── real_tent_box_5_spatial_error_gauss_0.7.txt │ ├── real_tent_box_5_spatial_error_gauss_1.0.txt │ ├── real_tent_box_5_spectrum.png │ ├── real_tent_gauss_0.7.png │ ├── real_tent_gauss_0.7_histogram.png │ ├── real_tent_gauss_0.7_spatial_error_binomial_2.txt │ ├── real_tent_gauss_0.7_spatial_error_binomial_3.txt │ ├── real_tent_gauss_0.7_spatial_error_box_3.txt │ ├── real_tent_gauss_0.7_spatial_error_box_5.txt │ ├── real_tent_gauss_0.7_spatial_error_gauss_0.7.txt │ ├── real_tent_gauss_0.7_spatial_error_gauss_1.0.txt │ ├── real_tent_gauss_0.7_spectrum.png │ ├── real_tent_gauss_1.0.png │ ├── real_tent_gauss_1.0_histogram.png │ ├── real_tent_gauss_1.0_spatial_error_binomial_2.txt │ ├── real_tent_gauss_1.0_spatial_error_binomial_3.txt │ ├── real_tent_gauss_1.0_spatial_error_box_3.txt │ ├── real_tent_gauss_1.0_spatial_error_box_5.txt │ ├── real_tent_gauss_1.0_spatial_error_gauss_0.7.txt │ ├── real_tent_gauss_1.0_spatial_error_gauss_1.0.txt │ ├── real_tent_gauss_1.0_spectrum.png │ ├── real_uniform_binomial_2.png │ ├── real_uniform_binomial_2_histogram.png │ ├── real_uniform_binomial_2_spatial_error_binomial_2.txt │ ├── real_uniform_binomial_2_spatial_error_binomial_3.txt │ ├── real_uniform_binomial_2_spatial_error_box_3.txt │ ├── real_uniform_binomial_2_spatial_error_box_5.txt │ ├── real_uniform_binomial_2_spatial_error_gauss_0.7.txt │ ├── real_uniform_binomial_2_spatial_error_gauss_1.0.txt │ ├── real_uniform_binomial_2_spectrum.png │ ├── real_uniform_binomial_3.png │ ├── real_uniform_binomial_3_histogram.png │ ├── real_uniform_binomial_3_spatial_error_binomial_2.txt │ ├── real_uniform_binomial_3_spatial_error_binomial_3.txt │ ├── real_uniform_binomial_3_spatial_error_box_3.txt │ ├── real_uniform_binomial_3_spatial_error_box_5.txt │ ├── real_uniform_binomial_3_spatial_error_gauss_0.7.txt │ ├── real_uniform_binomial_3_spatial_error_gauss_1.0.txt │ ├── real_uniform_binomial_3_spectrum.png │ ├── real_uniform_box_3.png │ ├── real_uniform_box_3_histogram.png │ ├── real_uniform_box_3_spatial_error_binomial_2.txt │ ├── real_uniform_box_3_spatial_error_binomial_3.txt │ ├── real_uniform_box_3_spatial_error_box_3.txt │ ├── real_uniform_box_3_spatial_error_box_5.txt │ ├── real_uniform_box_3_spatial_error_gauss_0.7.txt │ ├── real_uniform_box_3_spatial_error_gauss_1.0.txt │ ├── real_uniform_box_3_spectrum.png │ ├── real_uniform_box_5.png │ ├── real_uniform_box_5_histogram.png │ ├── real_uniform_box_5_spatial_error_binomial_2.txt │ ├── real_uniform_box_5_spatial_error_binomial_3.txt │ ├── real_uniform_box_5_spatial_error_box_3.txt │ ├── real_uniform_box_5_spatial_error_box_5.txt │ ├── real_uniform_box_5_spatial_error_gauss_0.7.txt │ ├── real_uniform_box_5_spatial_error_gauss_1.0.txt │ ├── real_uniform_box_5_spectrum.png │ ├── real_uniform_gauss_0.7.png │ ├── real_uniform_gauss_0.7_histogram.png │ ├── real_uniform_gauss_0.7_spatial_error_binomial_2.txt │ ├── real_uniform_gauss_0.7_spatial_error_binomial_3.txt │ ├── real_uniform_gauss_0.7_spatial_error_box_3.txt │ ├── real_uniform_gauss_0.7_spatial_error_box_5.txt │ ├── real_uniform_gauss_0.7_spatial_error_gauss_0.7.txt │ ├── real_uniform_gauss_0.7_spatial_error_gauss_1.0.txt │ ├── real_uniform_gauss_0.7_spectrum.png │ ├── real_uniform_gauss_1.0.png │ ├── real_uniform_gauss_1.0_histogram.png │ ├── real_uniform_gauss_1.0_spatial_error_binomial_2.txt │ ├── real_uniform_gauss_1.0_spatial_error_binomial_3.txt │ ├── real_uniform_gauss_1.0_spatial_error_box_3.txt │ ├── real_uniform_gauss_1.0_spatial_error_box_5.txt │ ├── real_uniform_gauss_1.0_spatial_error_gauss_0.7.txt │ ├── real_uniform_gauss_1.0_spatial_error_gauss_1.0.txt │ ├── real_uniform_gauss_1.0_spectrum.png │ ├── spatial_real_uniform_binomial_2.png │ ├── spatial_real_uniform_binomial_3.png │ ├── spatial_real_uniform_box_3.png │ ├── spatial_real_uniform_box_5.png │ ├── spatial_real_uniform_gauss_0.7.png │ └── spatial_real_uniform_gauss_1.0.png ├── sphere │ ├── sphere_cosine_binomial_2.png │ ├── sphere_cosine_binomial_2_histogram.png │ ├── sphere_cosine_binomial_2_spectrum.png │ ├── sphere_cosine_binomial_3.png │ ├── sphere_cosine_binomial_3_histogram.png │ ├── sphere_cosine_binomial_3_spectrum.png │ ├── sphere_cosine_box_3.png │ ├── sphere_cosine_box_3_histogram.png │ ├── sphere_cosine_box_3_spectrum.png │ ├── sphere_cosine_box_5.png │ ├── sphere_cosine_box_5_histogram.png │ ├── sphere_cosine_box_5_spectrum.png │ ├── sphere_cosine_gauss_0.5.png │ ├── sphere_cosine_gauss_0.5_histogram.png │ ├── sphere_cosine_gauss_0.5_spectrum.png │ ├── sphere_cosine_gauss_0.7.png │ ├── sphere_cosine_gauss_0.7_histogram.png │ ├── sphere_cosine_gauss_0.7_spectrum.png │ ├── sphere_cosine_gauss_1.0.png │ ├── sphere_cosine_gauss_1.0_histogram.png │ ├── sphere_cosine_gauss_1.0_spectrum.png │ ├── sphere_uniform_binomial_2.png │ ├── sphere_uniform_binomial_2_histogram.png │ ├── sphere_uniform_binomial_2_spectrum.png │ ├── sphere_uniform_binomial_3.png │ ├── sphere_uniform_binomial_3_histogram.png │ ├── sphere_uniform_binomial_3_spectrum.png │ ├── sphere_uniform_box_3.png │ ├── sphere_uniform_box_3_histogram.png │ ├── sphere_uniform_box_3_spectrum.png │ ├── sphere_uniform_box_5.png │ ├── sphere_uniform_box_5_histogram.png │ ├── sphere_uniform_box_5_spectrum.png │ ├── sphere_uniform_gauss1_0.png │ ├── sphere_uniform_gauss_0.7.png │ ├── sphere_uniform_gauss_0.7_histogram.png │ ├── sphere_uniform_gauss_0.7_spectrum.png │ ├── sphere_uniform_gauss_1.0.png │ ├── sphere_uniform_gauss_1.0_histogram.png │ └── sphere_uniform_gauss_1.0_spectrum.png ├── temporal │ └── real-128x128x64 │ │ ├── graphs │ │ ├── real_stbn_temporal.png │ │ ├── real_uniform_gauss_1.3435_exponential_0.1_0.1_product_temporal.png │ │ ├── real_uniform_gauss_1.3435_exponential_0.1_0.2_product_temporal.png │ │ ├── real_uniform_gauss_1.3435_exponential_0.1_0.3_product_temporal.png │ │ ├── real_uniform_gauss_1.3435_exponential_0.1_0.4_product_temporal.png │ │ ├── real_uniform_gauss_1.3435_white_over_time_temporal.png │ │ └── real_whitenoise_temporal.png │ │ ├── real_stbn.png │ │ ├── real_stbn_histogram.png │ │ ├── real_stbn_spectrum.png │ │ ├── real_stbn_temporal.csv │ │ ├── real_stbn_temporal.png │ │ ├── real_uniform_gauss_1.3435_exponential_0.1_0.1_product.png │ │ ├── real_uniform_gauss_1.3435_exponential_0.1_0.1_product_histogram.png │ │ ├── real_uniform_gauss_1.3435_exponential_0.1_0.1_product_spectrum.png │ │ ├── real_uniform_gauss_1.3435_exponential_0.1_0.1_product_temporal.csv │ │ ├── real_uniform_gauss_1.3435_exponential_0.1_0.1_product_temporal.png │ │ ├── real_uniform_gauss_1.3435_exponential_0.1_0.2_product.png │ │ ├── real_uniform_gauss_1.3435_exponential_0.1_0.2_product_histogram.png │ │ ├── real_uniform_gauss_1.3435_exponential_0.1_0.2_product_spectrum.png │ │ ├── real_uniform_gauss_1.3435_exponential_0.1_0.2_product_temporal.csv │ │ ├── real_uniform_gauss_1.3435_exponential_0.1_0.2_product_temporal.png │ │ ├── real_uniform_gauss_1.3435_exponential_0.1_0.3_product.png │ │ ├── real_uniform_gauss_1.3435_exponential_0.1_0.3_product_histogram.png │ │ ├── real_uniform_gauss_1.3435_exponential_0.1_0.3_product_spectrum.png │ │ ├── real_uniform_gauss_1.3435_exponential_0.1_0.3_product_temporal.csv │ │ ├── real_uniform_gauss_1.3435_exponential_0.1_0.3_product_temporal.png │ │ ├── real_uniform_gauss_1.3435_exponential_0.1_0.4_product.png │ │ ├── real_uniform_gauss_1.3435_exponential_0.1_0.4_product_histogram.png │ │ ├── real_uniform_gauss_1.3435_exponential_0.1_0.4_product_spectrum.png │ │ ├── real_uniform_gauss_1.3435_exponential_0.1_0.4_product_temporal.csv │ │ ├── real_uniform_gauss_1.3435_exponential_0.1_0.4_product_temporal.png │ │ ├── real_uniform_gauss_1.3435_exponential_0.1_0.5_product.png │ │ ├── real_uniform_gauss_1.3435_exponential_0.1_0.5_product_histogram.png │ │ ├── real_uniform_gauss_1.3435_exponential_0.1_0.5_product_spectrum.png │ │ ├── real_uniform_gauss_1.3435_exponential_0.1_0.5_product_temporal.csv │ │ ├── real_uniform_gauss_1.3435_exponential_0.1_0.5_product_temporal.png │ │ ├── real_uniform_gauss_1.3435_exponential_0.1_temporal.png │ │ ├── real_uniform_gauss_1.3435_white_over_time.png │ │ ├── real_uniform_gauss_1.3435_white_over_time_spectrum.png │ │ ├── real_uniform_gauss_1.3435_white_over_time_temporal.csv │ │ ├── real_uniform_gauss_1.3435_white_over_time_temporal.png │ │ ├── real_whitenoise.png │ │ ├── real_whitenoise_histogram.png │ │ ├── real_whitenoise_spectrum.png │ │ ├── real_whitenoise_temporal.csv │ │ └── real_whitenoise_temporal.png ├── vector2 │ ├── vector2_uniform_binomial_2.png │ ├── vector2_uniform_binomial_2_histogram.png │ ├── vector2_uniform_binomial_2_spectrum.png │ ├── vector2_uniform_binomial_3.png │ ├── vector2_uniform_binomial_3_histogram.png │ ├── vector2_uniform_binomial_3_spectrum.png │ ├── vector2_uniform_box_3.png │ ├── vector2_uniform_box_3_histogram.png │ ├── vector2_uniform_box_3_spectrum.png │ ├── vector2_uniform_box_5.png │ ├── vector2_uniform_box_5_histogram.png │ ├── vector2_uniform_box_5_spectrum.png │ ├── vector2_uniform_gauss_0.5.png │ ├── vector2_uniform_gauss_0.5_histogram.png │ ├── vector2_uniform_gauss_0.5_spectrum.png │ ├── vector2_uniform_gauss_0.7.png │ ├── vector2_uniform_gauss_0.7_histogram.png │ ├── vector2_uniform_gauss_0.7_spectrum.png │ ├── vector2_uniform_gauss_1.0.png │ ├── vector2_uniform_gauss_1.0_histogram.png │ └── vector2_uniform_gauss_1.0_spectrum.png ├── vector3 │ ├── vector3_uniform_binomial_2.png │ ├── vector3_uniform_binomial_2_histogram.png │ ├── vector3_uniform_binomial_2_spectrum.png │ ├── vector3_uniform_binomial_3.png │ ├── vector3_uniform_binomial_3_histogram.png │ ├── vector3_uniform_binomial_3_spectrum.png │ ├── vector3_uniform_box_3.png │ ├── vector3_uniform_box_3_histogram.png │ ├── vector3_uniform_box_3_spectrum.png │ ├── vector3_uniform_box_5.png │ ├── vector3_uniform_box_5_histogram.png │ ├── vector3_uniform_box_5_spectrum.png │ ├── vector3_uniform_gauss_0.5.png │ ├── vector3_uniform_gauss_0.5_histogram.png │ ├── vector3_uniform_gauss_0.5_spectrum.png │ ├── vector3_uniform_gauss_0.7.png │ ├── vector3_uniform_gauss_0.7_histogram.png │ ├── vector3_uniform_gauss_0.7_spectrum.png │ ├── vector3_uniform_gauss_1.0.png │ ├── vector3_uniform_gauss_1.0_histogram.png │ └── vector3_uniform_gauss_1.0_spectrum.png └── vector4 │ ├── vector4_uniform_binomial_2.png │ ├── vector4_uniform_binomial_2_histogram.png │ ├── vector4_uniform_binomial_2_spectrum.png │ ├── vector4_uniform_binomial_3.png │ ├── vector4_uniform_binomial_3_histogram.png │ ├── vector4_uniform_binomial_3_spectrum.png │ ├── vector4_uniform_box_3.png │ ├── vector4_uniform_box_3_histogram.png │ ├── vector4_uniform_box_3_spectrum.png │ ├── vector4_uniform_box_5.png │ ├── vector4_uniform_box_5_histogram.png │ ├── vector4_uniform_box_5_spectrum.png │ ├── vector4_uniform_gauss_0.5.png │ ├── vector4_uniform_gauss_0.5_histogram.png │ ├── vector4_uniform_gauss_0.5_spectrum.png │ ├── vector4_uniform_gauss_0.7.png │ ├── vector4_uniform_gauss_0.7_histogram.png │ ├── vector4_uniform_gauss_0.7_spectrum.png │ ├── vector4_uniform_gauss_1.0.png │ ├── vector4_uniform_gauss_1.0_histogram.png │ └── vector4_uniform_gauss_1.0_spectrum.png ├── buildscripts ├── Build_Debug.bat └── Build_Release.bat ├── dxcompiler.dll ├── dxil.dll ├── fastnoise ├── DX12Utils │ ├── CompileShaders.h │ ├── CompileShaders_dxc.cpp │ ├── CompileShaders_fxc.cpp │ ├── DelayedReleaseTracker.h │ ├── FileCache.cpp │ ├── FileCache.h │ ├── HeapAllocationTracker.h │ ├── ParseCSV.h │ ├── ReadbackHelper.h │ ├── SRGB.h │ ├── TextureCache.cpp │ ├── TextureCache.h │ ├── dxutils.cpp │ ├── dxutils.h │ ├── logfn.h │ ├── stb │ │ ├── LICENSE │ │ ├── stb_image.h │ │ └── stb_image_write.h │ └── tinyexr │ │ ├── README.md │ │ ├── deps │ │ └── miniz │ │ │ ├── LICENSE │ │ │ ├── miniz.c │ │ │ ├── miniz.h │ │ │ └── readme.md │ │ └── tinyexr.h ├── Gigi │ ├── LICENSE.txt │ ├── Screenshot.png │ ├── Technique.json │ ├── fastnoise.gg │ ├── fastnoise.gguser │ ├── fastnoise.hlsl │ ├── init.hlsl │ ├── loss.hlsl │ ├── process.hlsl │ └── swap.hlsl ├── private │ ├── technique.cpp │ └── technique.h ├── public │ ├── all.h │ ├── imgui.h │ ├── pythoninterface.h │ └── technique.h ├── readme.txt └── shaders │ ├── fastnoise.hlsl │ ├── init.hlsl │ ├── loss.hlsl │ └── swap.hlsl ├── logo └── SEED.jpg ├── main.cpp ├── makegaussnoise.bat ├── makenoise.bat ├── noise.zip ├── readme ├── DitherBinomialGauss.png ├── EffectiveSampleCounts.png ├── autocorr.png ├── s_interval_binomial.png-spectrum.png └── s_interval_gauss.png-spectrum.png └── scripts ├── histogram.py ├── makenoise-spatial.py ├── makenoise-temporal.py ├── spectrum.py ├── temporal-plot.py └── temporal.py /.gitattributes: -------------------------------------------------------------------------------- 1 | noise.zip filter=lfs diff=lfs merge=lfs -text 2 | FastNoise.pdb filter=lfs diff=lfs merge=lfs -text 3 | FastNoise.exe filter=lfs diff=lfs merge=lfs -text 4 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .vs/ 2 | x64/ 3 | -------------------------------------------------------------------------------- /DFTs.pdf: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:c7ff0c6bef2c215d33c445868852c4d9bff2b8ca39088f7a0de9155ca7b61efb 3 | size 1540808 4 | -------------------------------------------------------------------------------- /FastNoise.exe: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:69a0fa05663162682da07bf28e560d30aff70b35266cdaaca5b453917c1256ea 3 | size 184320 4 | -------------------------------------------------------------------------------- /FastNoise.pdb: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:e682911bdf70772cab10654799e284cae7c3308503e435bcb2874ee74962edec 3 | size 5263360 4 | -------------------------------------------------------------------------------- /FastNoise.sln: -------------------------------------------------------------------------------- 1 |  2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio Version 17 4 | VisualStudioVersion = 17.0.31919.166 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "FastNoise", "FastNoise.vcxproj", "{97EE41B2-59BA-4588-86E8-2358EB37E1CF}" 7 | EndProject 8 | Global 9 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 10 | Debug|x64 = Debug|x64 11 | Release|x64 = Release|x64 12 | EndGlobalSection 13 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 14 | {97EE41B2-59BA-4588-86E8-2358EB37E1CF}.Debug|x64.ActiveCfg = Debug|x64 15 | {97EE41B2-59BA-4588-86E8-2358EB37E1CF}.Debug|x64.Build.0 = Debug|x64 16 | {97EE41B2-59BA-4588-86E8-2358EB37E1CF}.Release|x64.ActiveCfg = Release|x64 17 | {97EE41B2-59BA-4588-86E8-2358EB37E1CF}.Release|x64.Build.0 = Release|x64 18 | EndGlobalSection 19 | GlobalSection(SolutionProperties) = preSolution 20 | HideSolutionNode = FALSE 21 | EndGlobalSection 22 | GlobalSection(ExtensibilityGlobals) = postSolution 23 | SolutionGuid = {E07804A4-87E1-4EDA-8F19-14092D17B0EA} 24 | EndGlobalSection 25 | EndGlobal 26 | -------------------------------------------------------------------------------- /FastNoise.vcxproj.user: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | real Uniform Box 2 Box 1 product 128 128 1 out/real_uniform_box3x3 5 | WindowsLocalDebugger 6 | 7 | 8 | real Uniform Box 2 Box 1 product 128 128 1 out/real_uniform_box3x3 9 | WindowsLocalDebugger 10 | 11 | -------------------------------------------------------------------------------- /LICENSE.txt: -------------------------------------------------------------------------------- 1 | Copyright (c) 2023 Electronic Arts Inc. All rights reserved. 2 | 3 | Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 4 | 5 | 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 6 | 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 7 | 3. Neither the name of Electronic Arts, Inc. ("EA") nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. 8 | 9 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 10 | -------------------------------------------------------------------------------- /SImage.h: -------------------------------------------------------------------------------- 1 | /////////////////////////////////////////////////////////////////////////////// 2 | // FastNoise - F.A.S.T. Sampling Implementation // 3 | // Copyright (c) 2023 Electronic Arts Inc. All rights reserved. // 4 | /////////////////////////////////////////////////////////////////////////////// 5 | 6 | #pragma once 7 | 8 | #include "DX12.h" 9 | #include 10 | 11 | struct SImage 12 | { 13 | ~SImage(); 14 | 15 | enum PixelConversions 16 | { 17 | PixelsAreU8_SaveAsU8, 18 | PixelsAreF32_SaveAsU8, 19 | PixelsAreF32_SaveAsF32 20 | }; 21 | 22 | bool Load(ID3D12Device* device, const char* fileName); 23 | bool Save(const char* fileName, PixelConversions pixelConversion); 24 | bool SaveRegion(const char* fileName, int x1, int x2, int y1, int y2, PixelConversions pixelConversion); 25 | 26 | void AdoptResource(ID3D12Resource* resource, int width, int height, int components, DXGI_FORMAT format, int bytesPerComponent) 27 | { 28 | if (m_resource && m_releaseResource) 29 | m_resource->Release(); 30 | 31 | m_releaseResource = false; 32 | 33 | m_width = width; 34 | m_height = height; 35 | m_components = components; 36 | m_format = format; 37 | 38 | m_pixels.resize(width * height * components * bytesPerComponent); 39 | 40 | m_resource = resource; 41 | } 42 | 43 | void UploadPixelsToGPU(ID3D12Device* device, ID3D12GraphicsCommandList* cmdList); 44 | void RequestReadback(ID3D12Device* device, ID3D12GraphicsCommandList* cmdList); 45 | void DoReadback(); 46 | 47 | // CPU data 48 | int m_width = 0; 49 | int m_height = 0; 50 | int m_components = 0; 51 | std::vector m_pixels; 52 | std::vector m_F23ToU8pixels; 53 | 54 | // GPU data 55 | bool m_releaseResource = true; 56 | ID3D12Resource* m_resource = nullptr; 57 | DXGI_FORMAT m_format = DXGI_FORMAT_UNKNOWN; 58 | std::vector m_uploadBuffers; 59 | ID3D12Resource* m_readbackBuffer = nullptr; 60 | UINT64 m_readbackBufferRowBytes = 0; 61 | UINT64 m_readbackBufferRowPitch = 0; 62 | 63 | std::wstring m_debugName; 64 | }; 65 | -------------------------------------------------------------------------------- /SOTPointSets/.gitignore: -------------------------------------------------------------------------------- 1 | .vs/* 2 | x64/ 3 | *.user 4 | out/ -------------------------------------------------------------------------------- /SOTPointSets/LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 Alan Wolfe 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /SOTPointSets/NumericalCDF.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include "maths.h" 4 | #include 5 | #include 6 | 7 | #include "stb/stb_image.h" 8 | 9 | struct CDF 10 | { 11 | std::vector CDFSamples; 12 | 13 | float InverseCDF(float y) const 14 | { 15 | auto it = std::lower_bound(CDFSamples.begin(), CDFSamples.end(), y, 16 | [] (const float2& CDFSample, float y) 17 | { 18 | return CDFSample.y < y; 19 | } 20 | ); 21 | 22 | // If the first item is greater than y, return 0 23 | if (it == CDFSamples.begin()) 24 | { 25 | return CDFSamples[0].y; 26 | } 27 | // If the last item is smaller than y, return 1 28 | else if (it == CDFSamples.end()) 29 | { 30 | return CDFSamples[CDFSamples.size() - 1].y; 31 | } 32 | // otherwise, interpolate from it-1 to it 33 | else 34 | { 35 | // The index of the value lower than the value we are searching for 36 | size_t index = it - CDFSamples.begin() - 1; 37 | 38 | // Get the percent we are between the y values 39 | float percentY = (y - CDFSamples[index].y) / (CDFSamples[index + 1].y - CDFSamples[index].y); 40 | 41 | // Use that percent to go from the previous to current percent 42 | return Lerp(CDFSamples[index].x, CDFSamples[index + 1].x, percentY); 43 | } 44 | } 45 | }; 46 | 47 | template 48 | CDF CDFFromCDFFn(float minX, float maxX, int numSamples, const TCDFLambda& CDFLambda) 49 | { 50 | CDF ret; 51 | 52 | // Make CDF samples 53 | ret.CDFSamples.resize(numSamples); 54 | for (int i = 0; i < numSamples; ++i) 55 | { 56 | // We calculate percent this way so we hit 0% and 100% both. 57 | // Normally you'd want to "keep away from the edges" but we want the full range of data here 58 | float percent = float(i) / float(numSamples - 1); 59 | 60 | float x = Lerp(minX, maxX, percent); 61 | float y = CDFLambda(x); 62 | ret.CDFSamples[i] = float2{ x, y }; 63 | } 64 | 65 | return ret; 66 | } 67 | 68 | // pixel values are flipped so that 0 (darker) are denser, and 1 (lighter) are less dense. 69 | struct DensityMap 70 | { 71 | int w = 0; 72 | int h = 0; 73 | std::vector pixels; 74 | }; 75 | 76 | inline DensityMap LoadDensityMap(const char* fileName, bool invert) 77 | { 78 | DensityMap ret; 79 | 80 | // Load the image if we can 81 | int c; 82 | unsigned char* pixels = stbi_load(fileName, &ret.w, &ret.h, &c, 1); 83 | if (!pixels) 84 | { 85 | printf("[ERROR] Could not load image file %s!\n", fileName); 86 | return ret; 87 | } 88 | 89 | // convert to float and store it 90 | ret.pixels.resize(ret.w * ret.h); 91 | for (int i = 0; i < ret.w * ret.h; ++i) 92 | { 93 | if (invert) 94 | ret.pixels[i] = float(pixels[i]) / 255.0f; 95 | else 96 | ret.pixels[i] = 1.0f - float(pixels[i]) / 255.0f; 97 | } 98 | 99 | // Free the loaded image 100 | stbi_image_free(pixels); 101 | 102 | return ret; 103 | } 104 | 105 | inline CDF CDFFromDensityMap(const DensityMap& densityMap, int numSamples, float2 projectionDirection) 106 | { 107 | CDF ret; 108 | 109 | float maxX = (std::abs(projectionDirection.x) + std::abs(projectionDirection.y)) * 0.5f; 110 | float minX = -maxX; 111 | 112 | // Make initial CDF samples, but with a y value of 0. we are going to add the projected pixel values in and then normalize it 113 | ret.CDFSamples.resize(numSamples); 114 | for (int i = 0; i < numSamples; ++i) 115 | { 116 | // We calculate percent this way so we hit 0% and 100% both. 117 | // Normally you'd want to "keep away from the edges" but we want the full range of data here 118 | float percent = float(i) / float(numSamples - 1); 119 | float x = Lerp(minX, maxX, percent); 120 | ret.CDFSamples[i] = float2{ x, 0.0f}; 121 | } 122 | 123 | // Project the pixel values and sum them up to make a PDF 124 | for (int iy = 0; iy < densityMap.h; ++iy) 125 | { 126 | float normalizedIyMin = float(iy) / float(densityMap.h) - 0.5f; 127 | float normalizedIyMax = float(iy + 1) / float(densityMap.h) - 0.5f; 128 | 129 | for (int ix = 0; ix < densityMap.w; ++ix) 130 | { 131 | float pixelValue = densityMap.pixels[iy * densityMap.w + ix]; 132 | 133 | float normalizedIxMin = float(ix) / float(densityMap.w) - 0.5f; 134 | float normalizedIxMax = float(ix + 1) / float(densityMap.w) - 0.5f; 135 | 136 | float projMin = Dot(float2{ normalizedIxMin, normalizedIyMin }, projectionDirection); 137 | float projMax = Dot(float2{ normalizedIxMax, normalizedIyMax }, projectionDirection); 138 | 139 | // assumes a square of +/- 0.5 140 | float maxX = (std::abs(projectionDirection.x) + std::abs(projectionDirection.y)) * 0.5f; 141 | float minX = -maxX; 142 | projMin = (projMin - minX) / (maxX - minX); 143 | projMax = (projMax - minX) / (maxX - minX); 144 | 145 | if (projMin > projMax) 146 | std::swap(projMin, projMax); 147 | 148 | float bucketMin = Clamp(projMin * float(numSamples), 0.0f, float(numSamples)); 149 | float bucketMax = Clamp(projMax * float(numSamples), 0.0f, float(numSamples)); 150 | 151 | while (bucketMin < bucketMax) 152 | { 153 | int bucketIndex = int(std::floor(bucketMin)); 154 | if (bucketIndex >= numSamples) 155 | break; 156 | 157 | float endOfBucket = std::min(std::floor(bucketMin + 1), bucketMax); 158 | float bucketPercent = endOfBucket - bucketMin; 159 | 160 | ret.CDFSamples[bucketIndex].y += pixelValue * bucketPercent; 161 | 162 | bucketMin = float(bucketIndex + 1); 163 | } 164 | } 165 | } 166 | 167 | // Convert the PDF to CDF by making every sample by the sum of the samples that are at or before it 168 | for (int i = 1; i < numSamples; ++i) 169 | ret.CDFSamples[i].y += ret.CDFSamples[i - 1].y; 170 | 171 | // Normalize the CDF so that the first entry is 0, and the last entry is 1 172 | float minCDFSample = ret.CDFSamples[0].y; 173 | float maxCDFSample = ret.CDFSamples[numSamples - 1].y; 174 | 175 | for (float2& p : ret.CDFSamples) 176 | p.y = (p.y - minCDFSample) / (maxCDFSample - minCDFSample); 177 | 178 | 179 | return ret; 180 | } 181 | -------------------------------------------------------------------------------- /SOTPointSets/README.md: -------------------------------------------------------------------------------- 1 | # SOTPointSets 2 | 3 | This code is adapted from the code for my blog post on using sliced optimal transport to make (blue noise) point sets. 4 | 5 | Post: https://blog.demofox.org/2023/12/24/making-blue-noise-point-sets-with-sliced-optimal-transport/ 6 | Code: https://github.com/Atrix256/SOTPointSets 7 | 8 | Example command line, to make a .dat file suitable to initialize a 128x128x32 texture in FastNoise: 9 | flower.png 16384 32 1000 64 512 -------------------------------------------------------------------------------- /SOTPointSets/SOTPointSets.sln: -------------------------------------------------------------------------------- 1 |  2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio Version 17 4 | VisualStudioVersion = 17.7.34221.43 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "SOTPointSets", "SOTPointSets.vcxproj", "{DF216F2D-5F97-4961-A3AB-FE1C9B99D93D}" 7 | EndProject 8 | Global 9 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 10 | Debug|x64 = Debug|x64 11 | Debug|x86 = Debug|x86 12 | Release|x64 = Release|x64 13 | Release|x86 = Release|x86 14 | EndGlobalSection 15 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 16 | {DF216F2D-5F97-4961-A3AB-FE1C9B99D93D}.Debug|x64.ActiveCfg = Debug|x64 17 | {DF216F2D-5F97-4961-A3AB-FE1C9B99D93D}.Debug|x64.Build.0 = Debug|x64 18 | {DF216F2D-5F97-4961-A3AB-FE1C9B99D93D}.Debug|x86.ActiveCfg = Debug|Win32 19 | {DF216F2D-5F97-4961-A3AB-FE1C9B99D93D}.Debug|x86.Build.0 = Debug|Win32 20 | {DF216F2D-5F97-4961-A3AB-FE1C9B99D93D}.Release|x64.ActiveCfg = Release|x64 21 | {DF216F2D-5F97-4961-A3AB-FE1C9B99D93D}.Release|x64.Build.0 = Release|x64 22 | {DF216F2D-5F97-4961-A3AB-FE1C9B99D93D}.Release|x86.ActiveCfg = Release|Win32 23 | {DF216F2D-5F97-4961-A3AB-FE1C9B99D93D}.Release|x86.Build.0 = Release|Win32 24 | EndGlobalSection 25 | GlobalSection(SolutionProperties) = preSolution 26 | HideSolutionNode = FALSE 27 | EndGlobalSection 28 | GlobalSection(ExtensibilityGlobals) = postSolution 29 | SolutionGuid = {E797548D-6D19-44E7-BD67-9993256E0E7E} 30 | EndGlobalSection 31 | EndGlobal 32 | -------------------------------------------------------------------------------- /SOTPointSets/SOTPointSets.vcxproj.filters: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | stb 12 | 13 | 14 | stb 15 | 16 | 17 | 18 | 19 | {0c0afb8a-fc56-42df-b861-79d4c698ba8d} 20 | 21 | 22 | -------------------------------------------------------------------------------- /SOTPointSets/flower.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/SOTPointSets/flower.png -------------------------------------------------------------------------------- /SOTPointSets/flower.txt: -------------------------------------------------------------------------------- 1 | flower.png is from https://www.pexels.com/photo/grayscale-photography-of-rose-57905/ -------------------------------------------------------------------------------- /SOTPointSets/maths.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | static const float c_pi = 3.14159265359f; 4 | static const float c_goldenRatioConjugate = 0.61803398875f; // 1 over phi, which is also just the fractional portion of phi 5 | 6 | struct float2 7 | { 8 | float x, y; 9 | }; 10 | 11 | inline float Dot(const float2& a, const float2& b) 12 | { 13 | return a.x * b.x + a.y * b.y; 14 | } 15 | 16 | inline float Length(const float2& f) 17 | { 18 | return std::sqrt(Dot(f, f)); 19 | } 20 | 21 | inline float DistanceSquared(const float2& a, const float2& b) 22 | { 23 | float2 diff = float2{ a.x - b.x, a.y - b.y }; 24 | return Dot(diff, diff); 25 | } 26 | 27 | // assumes the points are in [0,1]^2 28 | inline float DistanceWrap(const float2& a, const float2& b) 29 | { 30 | float2 diff; 31 | 32 | diff.x = std::abs(a.x - b.x); 33 | if (diff.x > 0.5f) 34 | diff.x = 1.0f - diff.x; 35 | 36 | diff.y = std::abs(a.y - b.y); 37 | if (diff.y > 0.5f) 38 | diff.y = 1.0f - diff.y; 39 | 40 | return Length(diff); 41 | } 42 | 43 | inline float2 Normalize(const float2& f) 44 | { 45 | float len = Length(f); 46 | 47 | float2 ret; 48 | ret.x = f.x / len; 49 | ret.y = f.y / len; 50 | 51 | return ret; 52 | } 53 | 54 | inline float Lerp(float A, float B, float t) 55 | { 56 | return A * (1.0f - t) + B * t; 57 | } 58 | 59 | template 60 | inline T Clamp(T value, T themin, T themax) 61 | { 62 | if (value <= themin) 63 | return themin; 64 | 65 | if (value >= themax) 66 | return themax; 67 | 68 | return value; 69 | } 70 | 71 | inline float Fract(float f) 72 | { 73 | return f - std::floor(f); 74 | } 75 | -------------------------------------------------------------------------------- /SOTPointSets/squarecdf.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include "maths.h" 4 | 5 | // Derived By William Donnelly 6 | 7 | // The square is centered at (0,0) and has width and height of 1. 8 | // So, the square is (x,y) in (-0.5,0.5)^2 9 | // The CDF / ICDF are then shiften to be between -0.5 and 0.5, instead of being from 0 to 1. 10 | namespace Square 11 | { 12 | inline float InverseCDF(float u, float2 d) 13 | { 14 | float c = std::max(std::abs(d.x), std::abs(d.y)); 15 | float s = std::min(std::abs(d.x), std::abs(d.y)); 16 | 17 | if (2 * c * std::abs(u) < c - s) 18 | { 19 | return c * u; 20 | } 21 | else 22 | { 23 | float t = 0.5f * (c + s) - sqrtf(2.0f * s * c * (0.5f - std::abs(u))); 24 | return (u < 0) ? -t : t; 25 | } 26 | } 27 | 28 | inline float CDF(float x, float2 d) 29 | { 30 | float c = std::max(std::abs(d.x), std::abs(d.y)); 31 | float s = std::min(std::abs(d.x), std::abs(d.y)); 32 | 33 | if (std::abs(x) > 0.5 * (c + s)) 34 | { 35 | return (x < 0.0f) ? -0.5f : 0.5f; 36 | } 37 | else if (std::abs(x) < 0.5f * (c - s)) 38 | { 39 | return x / c; 40 | } 41 | else 42 | { 43 | float fromEnd = (0.5f * (c + s) - std::abs(x)); 44 | float u = 0.5f - 0.5f * fromEnd * fromEnd / (c * s); 45 | return (x < 0.0f) ? -u : u; 46 | } 47 | } 48 | 49 | inline float PDF(float x, float2 d) 50 | { 51 | float c = std::max(std::abs(d.x), std::abs(d.y)); 52 | float s = std::min(std::abs(d.x), std::abs(d.y)); 53 | 54 | if (abs(x) < 0.5f * (c - s)) 55 | { 56 | return 1 / c; 57 | } 58 | else if (abs(x) < 0.5f * (c + s)) 59 | { 60 | float fromEnd = (0.5f * (c + s) - std::abs(x)); 61 | return fromEnd / (c * s); 62 | } 63 | else 64 | { 65 | return 0.0f; 66 | } 67 | } 68 | }; -------------------------------------------------------------------------------- /SOTPointSets/star.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/SOTPointSets/star.png -------------------------------------------------------------------------------- /SOTPointSets/stb/LICENSE: -------------------------------------------------------------------------------- 1 | This software is available under 2 licenses -- choose whichever you prefer. 2 | ------------------------------------------------------------------------------ 3 | ALTERNATIVE A - MIT License 4 | Copyright (c) 2017 Sean Barrett 5 | Permission is hereby granted, free of charge, to any person obtaining a copy of 6 | this software and associated documentation files (the "Software"), to deal in 7 | the Software without restriction, including without limitation the rights to 8 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies 9 | of the Software, and to permit persons to whom the Software is furnished to do 10 | so, subject to the following conditions: 11 | The above copyright notice and this permission notice shall be included in all 12 | copies or substantial portions of the Software. 13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 19 | SOFTWARE. 20 | ------------------------------------------------------------------------------ 21 | ALTERNATIVE B - Public Domain (www.unlicense.org) 22 | This is free and unencumbered software released into the public domain. 23 | Anyone is free to copy, modify, publish, use, compile, sell, or distribute this 24 | software, either in source code form or as a compiled binary, for any purpose, 25 | commercial or non-commercial, and by any means. 26 | In jurisdictions that recognize copyright laws, the author or authors of this 27 | software dedicate any and all copyright interest in the software to the public 28 | domain. We make this dedication for the benefit of the public at large and to 29 | the detriment of our heirs and successors. We intend this dedication to be an 30 | overt act of relinquishment in perpetuity of all present and future rights to 31 | this software under copyright law. 32 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 33 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 34 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 35 | AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 36 | ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 37 | WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 38 | -------------------------------------------------------------------------------- /analysis/circle/circle_uniform_binomial_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/circle/circle_uniform_binomial_2.png -------------------------------------------------------------------------------- /analysis/circle/circle_uniform_binomial_2_histogram.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/circle/circle_uniform_binomial_2_histogram.png -------------------------------------------------------------------------------- /analysis/circle/circle_uniform_binomial_2_spectrum.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/circle/circle_uniform_binomial_2_spectrum.png -------------------------------------------------------------------------------- /analysis/circle/circle_uniform_binomial_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/circle/circle_uniform_binomial_3.png -------------------------------------------------------------------------------- /analysis/circle/circle_uniform_binomial_3_histogram.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/circle/circle_uniform_binomial_3_histogram.png -------------------------------------------------------------------------------- /analysis/circle/circle_uniform_binomial_3_spectrum.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/circle/circle_uniform_binomial_3_spectrum.png -------------------------------------------------------------------------------- /analysis/circle/circle_uniform_box_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/circle/circle_uniform_box_3.png -------------------------------------------------------------------------------- /analysis/circle/circle_uniform_box_3_histogram.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/circle/circle_uniform_box_3_histogram.png -------------------------------------------------------------------------------- /analysis/circle/circle_uniform_box_3_spectrum.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/circle/circle_uniform_box_3_spectrum.png -------------------------------------------------------------------------------- /analysis/circle/circle_uniform_box_5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/circle/circle_uniform_box_5.png -------------------------------------------------------------------------------- /analysis/circle/circle_uniform_box_5_histogram.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/circle/circle_uniform_box_5_histogram.png -------------------------------------------------------------------------------- /analysis/circle/circle_uniform_box_5_spectrum.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/circle/circle_uniform_box_5_spectrum.png -------------------------------------------------------------------------------- /analysis/circle/circle_uniform_gauss_0.5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/circle/circle_uniform_gauss_0.5.png -------------------------------------------------------------------------------- /analysis/circle/circle_uniform_gauss_0.5_histogram.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/circle/circle_uniform_gauss_0.5_histogram.png -------------------------------------------------------------------------------- /analysis/circle/circle_uniform_gauss_0.5_spectrum.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/circle/circle_uniform_gauss_0.5_spectrum.png -------------------------------------------------------------------------------- /analysis/circle/circle_uniform_gauss_0.7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/circle/circle_uniform_gauss_0.7.png -------------------------------------------------------------------------------- /analysis/circle/circle_uniform_gauss_0.7_histogram.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/circle/circle_uniform_gauss_0.7_histogram.png -------------------------------------------------------------------------------- /analysis/circle/circle_uniform_gauss_0.7_spectrum.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/circle/circle_uniform_gauss_0.7_spectrum.png -------------------------------------------------------------------------------- /analysis/circle/circle_uniform_gauss_1.0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/circle/circle_uniform_gauss_1.0.png -------------------------------------------------------------------------------- /analysis/circle/circle_uniform_gauss_1.0_histogram.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/circle/circle_uniform_gauss_1.0_histogram.png -------------------------------------------------------------------------------- /analysis/circle/circle_uniform_gauss_1.0_spectrum.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/circle/circle_uniform_gauss_1.0_spectrum.png -------------------------------------------------------------------------------- /analysis/real/real_tent_binomial_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/real/real_tent_binomial_2.png -------------------------------------------------------------------------------- /analysis/real/real_tent_binomial_2_histogram.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/real/real_tent_binomial_2_histogram.png -------------------------------------------------------------------------------- /analysis/real/real_tent_binomial_2_spatial_error_binomial_2.txt: -------------------------------------------------------------------------------- 1 | 6.189114441370936054e-02 2 | -------------------------------------------------------------------------------- /analysis/real/real_tent_binomial_2_spatial_error_binomial_3.txt: -------------------------------------------------------------------------------- 1 | 4.342782302753680351e-02 2 | -------------------------------------------------------------------------------- /analysis/real/real_tent_binomial_2_spatial_error_box_3.txt: -------------------------------------------------------------------------------- 1 | 6.250332422872101334e-02 2 | -------------------------------------------------------------------------------- /analysis/real/real_tent_binomial_2_spatial_error_box_5.txt: -------------------------------------------------------------------------------- 1 | 3.193920267969802690e-02 2 | -------------------------------------------------------------------------------- /analysis/real/real_tent_binomial_2_spatial_error_gauss_0.7.txt: -------------------------------------------------------------------------------- 1 | 8.217398341618560587e-02 2 | -------------------------------------------------------------------------------- /analysis/real/real_tent_binomial_2_spatial_error_gauss_1.0.txt: -------------------------------------------------------------------------------- 1 | 3.764307250460911108e-02 2 | -------------------------------------------------------------------------------- /analysis/real/real_tent_binomial_2_spectrum.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/real/real_tent_binomial_2_spectrum.png -------------------------------------------------------------------------------- /analysis/real/real_tent_binomial_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/real/real_tent_binomial_3.png -------------------------------------------------------------------------------- /analysis/real/real_tent_binomial_3_histogram.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/real/real_tent_binomial_3_histogram.png -------------------------------------------------------------------------------- /analysis/real/real_tent_binomial_3_spatial_error_binomial_2.txt: -------------------------------------------------------------------------------- 1 | 6.585800227039688426e-02 2 | -------------------------------------------------------------------------------- /analysis/real/real_tent_binomial_3_spatial_error_binomial_3.txt: -------------------------------------------------------------------------------- 1 | 4.460953189799087698e-02 2 | -------------------------------------------------------------------------------- /analysis/real/real_tent_binomial_3_spatial_error_box_3.txt: -------------------------------------------------------------------------------- 1 | 6.094885816681738788e-02 2 | -------------------------------------------------------------------------------- /analysis/real/real_tent_binomial_3_spatial_error_box_5.txt: -------------------------------------------------------------------------------- 1 | 3.115829682832244041e-02 2 | -------------------------------------------------------------------------------- /analysis/real/real_tent_binomial_3_spatial_error_gauss_0.7.txt: -------------------------------------------------------------------------------- 1 | 8.614419311070145580e-02 2 | -------------------------------------------------------------------------------- /analysis/real/real_tent_binomial_3_spatial_error_gauss_1.0.txt: -------------------------------------------------------------------------------- 1 | 3.791376431349931242e-02 2 | -------------------------------------------------------------------------------- /analysis/real/real_tent_binomial_3_spectrum.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/real/real_tent_binomial_3_spectrum.png -------------------------------------------------------------------------------- /analysis/real/real_tent_box_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/real/real_tent_box_3.png -------------------------------------------------------------------------------- /analysis/real/real_tent_box_3_histogram.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/real/real_tent_box_3_histogram.png -------------------------------------------------------------------------------- /analysis/real/real_tent_box_3_spatial_error_binomial_2.txt: -------------------------------------------------------------------------------- 1 | 7.157593818030806576e-02 2 | -------------------------------------------------------------------------------- /analysis/real/real_tent_box_3_spatial_error_binomial_3.txt: -------------------------------------------------------------------------------- 1 | 4.762624619082288929e-02 2 | -------------------------------------------------------------------------------- /analysis/real/real_tent_box_3_spatial_error_box_3.txt: -------------------------------------------------------------------------------- 1 | 5.282856487618792229e-02 2 | -------------------------------------------------------------------------------- /analysis/real/real_tent_box_3_spatial_error_box_5.txt: -------------------------------------------------------------------------------- 1 | 3.399752841501987866e-02 2 | -------------------------------------------------------------------------------- /analysis/real/real_tent_box_3_spatial_error_gauss_0.7.txt: -------------------------------------------------------------------------------- 1 | 9.122308641893572823e-02 2 | -------------------------------------------------------------------------------- /analysis/real/real_tent_box_3_spatial_error_gauss_1.0.txt: -------------------------------------------------------------------------------- 1 | 4.067307375823083632e-02 2 | -------------------------------------------------------------------------------- /analysis/real/real_tent_box_3_spectrum.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/real/real_tent_box_3_spectrum.png -------------------------------------------------------------------------------- /analysis/real/real_tent_box_5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/real/real_tent_box_5.png -------------------------------------------------------------------------------- /analysis/real/real_tent_box_5_histogram.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/real/real_tent_box_5_histogram.png -------------------------------------------------------------------------------- /analysis/real/real_tent_box_5_spatial_error_binomial_2.txt: -------------------------------------------------------------------------------- 1 | 9.135499055293974657e-02 2 | -------------------------------------------------------------------------------- /analysis/real/real_tent_box_5_spatial_error_binomial_3.txt: -------------------------------------------------------------------------------- 1 | 6.697566031686628951e-02 2 | -------------------------------------------------------------------------------- /analysis/real/real_tent_box_5_spatial_error_box_3.txt: -------------------------------------------------------------------------------- 1 | 7.646452950145532501e-02 2 | -------------------------------------------------------------------------------- /analysis/real/real_tent_box_5_spatial_error_box_5.txt: -------------------------------------------------------------------------------- 1 | 2.433469258401211449e-02 2 | -------------------------------------------------------------------------------- /analysis/real/real_tent_box_5_spatial_error_gauss_0.7.txt: -------------------------------------------------------------------------------- 1 | 1.062192046252722899e-01 2 | -------------------------------------------------------------------------------- /analysis/real/real_tent_box_5_spatial_error_gauss_1.0.txt: -------------------------------------------------------------------------------- 1 | 5.573676656585458550e-02 2 | -------------------------------------------------------------------------------- /analysis/real/real_tent_box_5_spectrum.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/real/real_tent_box_5_spectrum.png -------------------------------------------------------------------------------- /analysis/real/real_tent_gauss_0.7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/real/real_tent_gauss_0.7.png -------------------------------------------------------------------------------- /analysis/real/real_tent_gauss_0.7_histogram.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/real/real_tent_gauss_0.7_histogram.png -------------------------------------------------------------------------------- /analysis/real/real_tent_gauss_0.7_spatial_error_binomial_2.txt: -------------------------------------------------------------------------------- 1 | 6.176119008504361851e-02 2 | -------------------------------------------------------------------------------- /analysis/real/real_tent_gauss_0.7_spatial_error_binomial_3.txt: -------------------------------------------------------------------------------- 1 | 4.324738441148424234e-02 2 | -------------------------------------------------------------------------------- /analysis/real/real_tent_gauss_0.7_spatial_error_box_3.txt: -------------------------------------------------------------------------------- 1 | 6.157877336321934680e-02 2 | -------------------------------------------------------------------------------- /analysis/real/real_tent_gauss_0.7_spatial_error_box_5.txt: -------------------------------------------------------------------------------- 1 | 2.981030683677619517e-02 2 | -------------------------------------------------------------------------------- /analysis/real/real_tent_gauss_0.7_spatial_error_gauss_0.7.txt: -------------------------------------------------------------------------------- 1 | 8.120099117343186623e-02 2 | -------------------------------------------------------------------------------- /analysis/real/real_tent_gauss_0.7_spatial_error_gauss_1.0.txt: -------------------------------------------------------------------------------- 1 | 3.706359796498482490e-02 2 | -------------------------------------------------------------------------------- /analysis/real/real_tent_gauss_0.7_spectrum.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/real/real_tent_gauss_0.7_spectrum.png -------------------------------------------------------------------------------- /analysis/real/real_tent_gauss_1.0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/real/real_tent_gauss_1.0.png -------------------------------------------------------------------------------- /analysis/real/real_tent_gauss_1.0_histogram.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/real/real_tent_gauss_1.0_histogram.png -------------------------------------------------------------------------------- /analysis/real/real_tent_gauss_1.0_spatial_error_binomial_2.txt: -------------------------------------------------------------------------------- 1 | 6.921469975530845919e-02 2 | -------------------------------------------------------------------------------- /analysis/real/real_tent_gauss_1.0_spatial_error_binomial_3.txt: -------------------------------------------------------------------------------- 1 | 4.668216151974559358e-02 2 | -------------------------------------------------------------------------------- /analysis/real/real_tent_gauss_1.0_spatial_error_box_3.txt: -------------------------------------------------------------------------------- 1 | 6.217177667962896920e-02 2 | -------------------------------------------------------------------------------- /analysis/real/real_tent_gauss_1.0_spatial_error_box_5.txt: -------------------------------------------------------------------------------- 1 | 3.103215796527915293e-02 2 | -------------------------------------------------------------------------------- /analysis/real/real_tent_gauss_1.0_spatial_error_gauss_0.7.txt: -------------------------------------------------------------------------------- 1 | 8.906079040765491062e-02 2 | -------------------------------------------------------------------------------- /analysis/real/real_tent_gauss_1.0_spatial_error_gauss_1.0.txt: -------------------------------------------------------------------------------- 1 | 3.923106797415880365e-02 2 | -------------------------------------------------------------------------------- /analysis/real/real_tent_gauss_1.0_spectrum.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/real/real_tent_gauss_1.0_spectrum.png -------------------------------------------------------------------------------- /analysis/real/real_uniform_binomial_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/real/real_uniform_binomial_2.png -------------------------------------------------------------------------------- /analysis/real/real_uniform_binomial_2_histogram.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/real/real_uniform_binomial_2_histogram.png -------------------------------------------------------------------------------- /analysis/real/real_uniform_binomial_2_spatial_error_binomial_2.txt: -------------------------------------------------------------------------------- 1 | 6.715914327460692501e-02 2 | -------------------------------------------------------------------------------- /analysis/real/real_uniform_binomial_2_spatial_error_binomial_3.txt: -------------------------------------------------------------------------------- 1 | 4.607022380124914385e-02 2 | -------------------------------------------------------------------------------- /analysis/real/real_uniform_binomial_2_spatial_error_box_3.txt: -------------------------------------------------------------------------------- 1 | 7.196361118695200620e-02 2 | -------------------------------------------------------------------------------- /analysis/real/real_uniform_binomial_2_spatial_error_box_5.txt: -------------------------------------------------------------------------------- 1 | 3.557293215630765587e-02 2 | -------------------------------------------------------------------------------- /analysis/real/real_uniform_binomial_2_spatial_error_gauss_0.7.txt: -------------------------------------------------------------------------------- 1 | 9.237953599691298145e-02 2 | -------------------------------------------------------------------------------- /analysis/real/real_uniform_binomial_2_spatial_error_gauss_1.0.txt: -------------------------------------------------------------------------------- 1 | 3.985214965816844673e-02 2 | -------------------------------------------------------------------------------- /analysis/real/real_uniform_binomial_2_spectrum.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/real/real_uniform_binomial_2_spectrum.png -------------------------------------------------------------------------------- /analysis/real/real_uniform_binomial_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/real/real_uniform_binomial_3.png -------------------------------------------------------------------------------- /analysis/real/real_uniform_binomial_3_histogram.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/real/real_uniform_binomial_3_histogram.png -------------------------------------------------------------------------------- /analysis/real/real_uniform_binomial_3_spatial_error_binomial_2.txt: -------------------------------------------------------------------------------- 1 | 7.273964454090729725e-02 2 | -------------------------------------------------------------------------------- /analysis/real/real_uniform_binomial_3_spatial_error_binomial_3.txt: -------------------------------------------------------------------------------- 1 | 4.802283343629795698e-02 2 | -------------------------------------------------------------------------------- /analysis/real/real_uniform_binomial_3_spatial_error_box_3.txt: -------------------------------------------------------------------------------- 1 | 7.027043679101779849e-02 2 | -------------------------------------------------------------------------------- /analysis/real/real_uniform_binomial_3_spatial_error_box_5.txt: -------------------------------------------------------------------------------- 1 | 3.545217925180894902e-02 2 | -------------------------------------------------------------------------------- /analysis/real/real_uniform_binomial_3_spatial_error_gauss_0.7.txt: -------------------------------------------------------------------------------- 1 | 9.809322616037452480e-02 2 | -------------------------------------------------------------------------------- /analysis/real/real_uniform_binomial_3_spatial_error_gauss_1.0.txt: -------------------------------------------------------------------------------- 1 | 4.069370702636448955e-02 2 | -------------------------------------------------------------------------------- /analysis/real/real_uniform_binomial_3_spectrum.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/real/real_uniform_binomial_3_spectrum.png -------------------------------------------------------------------------------- /analysis/real/real_uniform_box_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/real/real_uniform_box_3.png -------------------------------------------------------------------------------- /analysis/real/real_uniform_box_3_histogram.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/real/real_uniform_box_3_histogram.png -------------------------------------------------------------------------------- /analysis/real/real_uniform_box_3_spatial_error_binomial_2.txt: -------------------------------------------------------------------------------- 1 | 8.132508000106934698e-02 2 | -------------------------------------------------------------------------------- /analysis/real/real_uniform_box_3_spatial_error_binomial_3.txt: -------------------------------------------------------------------------------- 1 | 5.246416154088014844e-02 2 | -------------------------------------------------------------------------------- /analysis/real/real_uniform_box_3_spatial_error_box_3.txt: -------------------------------------------------------------------------------- 1 | 5.884141111728746071e-02 2 | -------------------------------------------------------------------------------- /analysis/real/real_uniform_box_3_spatial_error_box_5.txt: -------------------------------------------------------------------------------- 1 | 3.811472269585130385e-02 2 | -------------------------------------------------------------------------------- /analysis/real/real_uniform_box_3_spatial_error_gauss_0.7.txt: -------------------------------------------------------------------------------- 1 | 1.054367216526993500e-01 2 | -------------------------------------------------------------------------------- /analysis/real/real_uniform_box_3_spatial_error_gauss_1.0.txt: -------------------------------------------------------------------------------- 1 | 4.430559479498196590e-02 2 | -------------------------------------------------------------------------------- /analysis/real/real_uniform_box_3_spectrum.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/real/real_uniform_box_3_spectrum.png -------------------------------------------------------------------------------- /analysis/real/real_uniform_box_5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/real/real_uniform_box_5.png -------------------------------------------------------------------------------- /analysis/real/real_uniform_box_5_histogram.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/real/real_uniform_box_5_histogram.png -------------------------------------------------------------------------------- /analysis/real/real_uniform_box_5_spatial_error_binomial_2.txt: -------------------------------------------------------------------------------- 1 | 1.075669782483218428e-01 2 | -------------------------------------------------------------------------------- /analysis/real/real_uniform_box_5_spatial_error_binomial_3.txt: -------------------------------------------------------------------------------- 1 | 7.846359624429778690e-02 2 | -------------------------------------------------------------------------------- /analysis/real/real_uniform_box_5_spatial_error_box_3.txt: -------------------------------------------------------------------------------- 1 | 9.010997893122213442e-02 2 | -------------------------------------------------------------------------------- /analysis/real/real_uniform_box_5_spatial_error_box_5.txt: -------------------------------------------------------------------------------- 1 | 2.719597169273891071e-02 2 | -------------------------------------------------------------------------------- /analysis/real/real_uniform_box_5_spatial_error_gauss_0.7.txt: -------------------------------------------------------------------------------- 1 | 1.253213597063617957e-01 2 | -------------------------------------------------------------------------------- /analysis/real/real_uniform_box_5_spatial_error_gauss_1.0.txt: -------------------------------------------------------------------------------- 1 | 6.510524768595025991e-02 2 | -------------------------------------------------------------------------------- /analysis/real/real_uniform_box_5_spectrum.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/real/real_uniform_box_5_spectrum.png -------------------------------------------------------------------------------- /analysis/real/real_uniform_gauss_0.7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/real/real_uniform_gauss_0.7.png -------------------------------------------------------------------------------- /analysis/real/real_uniform_gauss_0.7_histogram.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/real/real_uniform_gauss_0.7_histogram.png -------------------------------------------------------------------------------- /analysis/real/real_uniform_gauss_0.7_spatial_error_binomial_2.txt: -------------------------------------------------------------------------------- 1 | 6.670808914649377364e-02 2 | -------------------------------------------------------------------------------- /analysis/real/real_uniform_gauss_0.7_spatial_error_binomial_3.txt: -------------------------------------------------------------------------------- 1 | 4.582834598764033707e-02 2 | -------------------------------------------------------------------------------- /analysis/real/real_uniform_gauss_0.7_spatial_error_box_3.txt: -------------------------------------------------------------------------------- 1 | 7.101890382418592218e-02 2 | -------------------------------------------------------------------------------- /analysis/real/real_uniform_gauss_0.7_spatial_error_box_5.txt: -------------------------------------------------------------------------------- 1 | 3.397211103472255744e-02 2 | -------------------------------------------------------------------------------- /analysis/real/real_uniform_gauss_0.7_spatial_error_gauss_0.7.txt: -------------------------------------------------------------------------------- 1 | 9.087029738260316014e-02 2 | -------------------------------------------------------------------------------- /analysis/real/real_uniform_gauss_0.7_spatial_error_gauss_1.0.txt: -------------------------------------------------------------------------------- 1 | 3.933286084532242044e-02 2 | -------------------------------------------------------------------------------- /analysis/real/real_uniform_gauss_0.7_spectrum.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/real/real_uniform_gauss_0.7_spectrum.png -------------------------------------------------------------------------------- /analysis/real/real_uniform_gauss_1.0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/real/real_uniform_gauss_1.0.png -------------------------------------------------------------------------------- /analysis/real/real_uniform_gauss_1.0_histogram.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/real/real_uniform_gauss_1.0_histogram.png -------------------------------------------------------------------------------- /analysis/real/real_uniform_gauss_1.0_spatial_error_binomial_2.txt: -------------------------------------------------------------------------------- 1 | 7.766647488383802977e-02 2 | -------------------------------------------------------------------------------- /analysis/real/real_uniform_gauss_1.0_spatial_error_binomial_3.txt: -------------------------------------------------------------------------------- 1 | 5.106106337054907435e-02 2 | -------------------------------------------------------------------------------- /analysis/real/real_uniform_gauss_1.0_spatial_error_box_3.txt: -------------------------------------------------------------------------------- 1 | 7.096833223588576434e-02 2 | -------------------------------------------------------------------------------- /analysis/real/real_uniform_gauss_1.0_spatial_error_box_5.txt: -------------------------------------------------------------------------------- 1 | 3.553474638552517328e-02 2 | -------------------------------------------------------------------------------- /analysis/real/real_uniform_gauss_1.0_spatial_error_gauss_0.7.txt: -------------------------------------------------------------------------------- 1 | 1.021776520163200086e-01 2 | -------------------------------------------------------------------------------- /analysis/real/real_uniform_gauss_1.0_spatial_error_gauss_1.0.txt: -------------------------------------------------------------------------------- 1 | 4.264609359548177103e-02 2 | -------------------------------------------------------------------------------- /analysis/real/real_uniform_gauss_1.0_spectrum.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/real/real_uniform_gauss_1.0_spectrum.png -------------------------------------------------------------------------------- /analysis/real/spatial_real_uniform_binomial_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/real/spatial_real_uniform_binomial_2.png -------------------------------------------------------------------------------- /analysis/real/spatial_real_uniform_binomial_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/real/spatial_real_uniform_binomial_3.png -------------------------------------------------------------------------------- /analysis/real/spatial_real_uniform_box_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/real/spatial_real_uniform_box_3.png -------------------------------------------------------------------------------- /analysis/real/spatial_real_uniform_box_5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/real/spatial_real_uniform_box_5.png -------------------------------------------------------------------------------- /analysis/real/spatial_real_uniform_gauss_0.7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/real/spatial_real_uniform_gauss_0.7.png -------------------------------------------------------------------------------- /analysis/real/spatial_real_uniform_gauss_1.0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/real/spatial_real_uniform_gauss_1.0.png -------------------------------------------------------------------------------- /analysis/sphere/sphere_cosine_binomial_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/sphere/sphere_cosine_binomial_2.png -------------------------------------------------------------------------------- /analysis/sphere/sphere_cosine_binomial_2_histogram.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/sphere/sphere_cosine_binomial_2_histogram.png -------------------------------------------------------------------------------- /analysis/sphere/sphere_cosine_binomial_2_spectrum.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/sphere/sphere_cosine_binomial_2_spectrum.png -------------------------------------------------------------------------------- /analysis/sphere/sphere_cosine_binomial_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/sphere/sphere_cosine_binomial_3.png -------------------------------------------------------------------------------- /analysis/sphere/sphere_cosine_binomial_3_histogram.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/sphere/sphere_cosine_binomial_3_histogram.png -------------------------------------------------------------------------------- /analysis/sphere/sphere_cosine_binomial_3_spectrum.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/sphere/sphere_cosine_binomial_3_spectrum.png -------------------------------------------------------------------------------- /analysis/sphere/sphere_cosine_box_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/sphere/sphere_cosine_box_3.png -------------------------------------------------------------------------------- /analysis/sphere/sphere_cosine_box_3_histogram.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/sphere/sphere_cosine_box_3_histogram.png -------------------------------------------------------------------------------- /analysis/sphere/sphere_cosine_box_3_spectrum.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/sphere/sphere_cosine_box_3_spectrum.png -------------------------------------------------------------------------------- /analysis/sphere/sphere_cosine_box_5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/sphere/sphere_cosine_box_5.png -------------------------------------------------------------------------------- /analysis/sphere/sphere_cosine_box_5_histogram.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/sphere/sphere_cosine_box_5_histogram.png -------------------------------------------------------------------------------- /analysis/sphere/sphere_cosine_box_5_spectrum.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/sphere/sphere_cosine_box_5_spectrum.png -------------------------------------------------------------------------------- /analysis/sphere/sphere_cosine_gauss_0.5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/sphere/sphere_cosine_gauss_0.5.png -------------------------------------------------------------------------------- /analysis/sphere/sphere_cosine_gauss_0.5_histogram.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/sphere/sphere_cosine_gauss_0.5_histogram.png -------------------------------------------------------------------------------- /analysis/sphere/sphere_cosine_gauss_0.5_spectrum.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/sphere/sphere_cosine_gauss_0.5_spectrum.png -------------------------------------------------------------------------------- /analysis/sphere/sphere_cosine_gauss_0.7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/sphere/sphere_cosine_gauss_0.7.png -------------------------------------------------------------------------------- /analysis/sphere/sphere_cosine_gauss_0.7_histogram.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/sphere/sphere_cosine_gauss_0.7_histogram.png -------------------------------------------------------------------------------- /analysis/sphere/sphere_cosine_gauss_0.7_spectrum.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/sphere/sphere_cosine_gauss_0.7_spectrum.png -------------------------------------------------------------------------------- /analysis/sphere/sphere_cosine_gauss_1.0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/sphere/sphere_cosine_gauss_1.0.png -------------------------------------------------------------------------------- /analysis/sphere/sphere_cosine_gauss_1.0_histogram.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/sphere/sphere_cosine_gauss_1.0_histogram.png -------------------------------------------------------------------------------- /analysis/sphere/sphere_cosine_gauss_1.0_spectrum.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/sphere/sphere_cosine_gauss_1.0_spectrum.png -------------------------------------------------------------------------------- /analysis/sphere/sphere_uniform_binomial_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/sphere/sphere_uniform_binomial_2.png -------------------------------------------------------------------------------- /analysis/sphere/sphere_uniform_binomial_2_histogram.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/sphere/sphere_uniform_binomial_2_histogram.png -------------------------------------------------------------------------------- /analysis/sphere/sphere_uniform_binomial_2_spectrum.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/sphere/sphere_uniform_binomial_2_spectrum.png -------------------------------------------------------------------------------- /analysis/sphere/sphere_uniform_binomial_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/sphere/sphere_uniform_binomial_3.png -------------------------------------------------------------------------------- /analysis/sphere/sphere_uniform_binomial_3_histogram.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/sphere/sphere_uniform_binomial_3_histogram.png -------------------------------------------------------------------------------- /analysis/sphere/sphere_uniform_binomial_3_spectrum.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/sphere/sphere_uniform_binomial_3_spectrum.png -------------------------------------------------------------------------------- /analysis/sphere/sphere_uniform_box_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/sphere/sphere_uniform_box_3.png -------------------------------------------------------------------------------- /analysis/sphere/sphere_uniform_box_3_histogram.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/sphere/sphere_uniform_box_3_histogram.png -------------------------------------------------------------------------------- /analysis/sphere/sphere_uniform_box_3_spectrum.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/sphere/sphere_uniform_box_3_spectrum.png -------------------------------------------------------------------------------- /analysis/sphere/sphere_uniform_box_5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/sphere/sphere_uniform_box_5.png -------------------------------------------------------------------------------- /analysis/sphere/sphere_uniform_box_5_histogram.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/sphere/sphere_uniform_box_5_histogram.png -------------------------------------------------------------------------------- /analysis/sphere/sphere_uniform_box_5_spectrum.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/sphere/sphere_uniform_box_5_spectrum.png -------------------------------------------------------------------------------- /analysis/sphere/sphere_uniform_gauss1_0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/sphere/sphere_uniform_gauss1_0.png -------------------------------------------------------------------------------- /analysis/sphere/sphere_uniform_gauss_0.7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/sphere/sphere_uniform_gauss_0.7.png -------------------------------------------------------------------------------- /analysis/sphere/sphere_uniform_gauss_0.7_histogram.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/sphere/sphere_uniform_gauss_0.7_histogram.png -------------------------------------------------------------------------------- /analysis/sphere/sphere_uniform_gauss_0.7_spectrum.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/sphere/sphere_uniform_gauss_0.7_spectrum.png -------------------------------------------------------------------------------- /analysis/sphere/sphere_uniform_gauss_1.0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/sphere/sphere_uniform_gauss_1.0.png -------------------------------------------------------------------------------- /analysis/sphere/sphere_uniform_gauss_1.0_histogram.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/sphere/sphere_uniform_gauss_1.0_histogram.png -------------------------------------------------------------------------------- /analysis/sphere/sphere_uniform_gauss_1.0_spectrum.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/sphere/sphere_uniform_gauss_1.0_spectrum.png -------------------------------------------------------------------------------- /analysis/temporal/real-128x128x64/graphs/real_stbn_temporal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/temporal/real-128x128x64/graphs/real_stbn_temporal.png -------------------------------------------------------------------------------- /analysis/temporal/real-128x128x64/graphs/real_uniform_gauss_1.3435_exponential_0.1_0.1_product_temporal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/temporal/real-128x128x64/graphs/real_uniform_gauss_1.3435_exponential_0.1_0.1_product_temporal.png -------------------------------------------------------------------------------- /analysis/temporal/real-128x128x64/graphs/real_uniform_gauss_1.3435_exponential_0.1_0.2_product_temporal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/temporal/real-128x128x64/graphs/real_uniform_gauss_1.3435_exponential_0.1_0.2_product_temporal.png -------------------------------------------------------------------------------- /analysis/temporal/real-128x128x64/graphs/real_uniform_gauss_1.3435_exponential_0.1_0.3_product_temporal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/temporal/real-128x128x64/graphs/real_uniform_gauss_1.3435_exponential_0.1_0.3_product_temporal.png -------------------------------------------------------------------------------- /analysis/temporal/real-128x128x64/graphs/real_uniform_gauss_1.3435_exponential_0.1_0.4_product_temporal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/temporal/real-128x128x64/graphs/real_uniform_gauss_1.3435_exponential_0.1_0.4_product_temporal.png -------------------------------------------------------------------------------- /analysis/temporal/real-128x128x64/graphs/real_uniform_gauss_1.3435_white_over_time_temporal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/temporal/real-128x128x64/graphs/real_uniform_gauss_1.3435_white_over_time_temporal.png -------------------------------------------------------------------------------- /analysis/temporal/real-128x128x64/graphs/real_whitenoise_temporal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/temporal/real-128x128x64/graphs/real_whitenoise_temporal.png -------------------------------------------------------------------------------- /analysis/temporal/real-128x128x64/real_stbn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/temporal/real-128x128x64/real_stbn.png -------------------------------------------------------------------------------- /analysis/temporal/real-128x128x64/real_stbn_histogram.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/temporal/real-128x128x64/real_stbn_histogram.png -------------------------------------------------------------------------------- /analysis/temporal/real-128x128x64/real_stbn_spectrum.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/temporal/real-128x128x64/real_stbn_spectrum.png -------------------------------------------------------------------------------- /analysis/temporal/real-128x128x64/real_stbn_temporal.csv: -------------------------------------------------------------------------------- 1 | 2.857859963892118993e-02 2 | 2.545073432579188569e-02 3 | 2.279370805203182956e-02 4 | 2.057829777156858567e-02 5 | 1.865006711935039349e-02 6 | 1.692409053090337262e-02 7 | 1.540888819436859146e-02 8 | 1.404120214915222445e-02 9 | 1.281122982477064451e-02 10 | 1.176142159674334504e-02 11 | 1.081512437874487635e-02 12 | 9.982357654957488280e-03 13 | 9.261465208783070668e-03 14 | 8.597926026780635528e-03 15 | 8.056991086251324985e-03 16 | 7.576183326201663994e-03 17 | 7.179182834571823206e-03 18 | 6.810614653370667890e-03 19 | 6.490012114551711730e-03 20 | 6.275965120745605023e-03 21 | 6.072562037931362143e-03 22 | 5.890817717944703269e-03 23 | 5.766116845888398339e-03 24 | 5.621977790557211065e-03 25 | 5.544199561522820952e-03 26 | 5.446357984368229918e-03 27 | 5.386412509329628097e-03 28 | 5.288023754033291737e-03 29 | 5.271697893469156834e-03 30 | 5.252151018448227363e-03 31 | 5.205522570803796344e-03 32 | 5.212008537000586104e-03 33 | 5.205608820413883120e-03 34 | 5.174374539901601538e-03 35 | 5.141071822560130782e-03 36 | 5.119398789460927884e-03 37 | 5.118446113223556852e-03 38 | 5.159448090548896144e-03 39 | 5.127734838108678056e-03 40 | 5.115980793060012632e-03 41 | 5.117009742514271910e-03 42 | 5.092207697575738996e-03 43 | 5.104223424731394766e-03 44 | 5.107711085300511468e-03 45 | 5.106118356359462540e-03 46 | 5.104324369730659644e-03 47 | 5.089792241065983248e-03 48 | 5.106331614552751114e-03 49 | 5.101642898331790014e-03 50 | 5.095610916174259271e-03 51 | 5.070881725282781922e-03 52 | 5.037563536669079078e-03 53 | 5.035007968534697953e-03 54 | 5.039241491315524582e-03 55 | 5.069554243217002515e-03 56 | 5.070535297378623608e-03 57 | 5.089007845689885734e-03 58 | 5.069975402333893634e-03 59 | 5.095970056824381152e-03 60 | 5.097800816724035178e-03 61 | 5.099882846115368767e-03 62 | 5.103256614272044280e-03 63 | 5.071760270665796010e-03 64 | 5.077146021208523916e-03 65 | -------------------------------------------------------------------------------- /analysis/temporal/real-128x128x64/real_stbn_temporal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/temporal/real-128x128x64/real_stbn_temporal.png -------------------------------------------------------------------------------- /analysis/temporal/real-128x128x64/real_uniform_gauss_1.3435_exponential_0.1_0.1_product.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/temporal/real-128x128x64/real_uniform_gauss_1.3435_exponential_0.1_0.1_product.png -------------------------------------------------------------------------------- /analysis/temporal/real-128x128x64/real_uniform_gauss_1.3435_exponential_0.1_0.1_product_histogram.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/temporal/real-128x128x64/real_uniform_gauss_1.3435_exponential_0.1_0.1_product_histogram.png -------------------------------------------------------------------------------- /analysis/temporal/real-128x128x64/real_uniform_gauss_1.3435_exponential_0.1_0.1_product_spectrum.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/temporal/real-128x128x64/real_uniform_gauss_1.3435_exponential_0.1_0.1_product_spectrum.png -------------------------------------------------------------------------------- /analysis/temporal/real-128x128x64/real_uniform_gauss_1.3435_exponential_0.1_0.1_product_temporal.csv: -------------------------------------------------------------------------------- 1 | 2.702305422194443627e-02 2 | 2.376354554016018791e-02 3 | 2.132262787752792210e-02 4 | 1.923940870074988471e-02 5 | 1.735719430011289227e-02 6 | 1.570426726842229920e-02 7 | 1.422239128227753731e-02 8 | 1.287003679239549087e-02 9 | 1.169995563818645307e-02 10 | 1.067056168247634482e-02 11 | 9.753754602243017505e-03 12 | 8.931900600467234524e-03 13 | 8.207560876219656756e-03 14 | 7.564757366653405632e-03 15 | 7.013269760681238411e-03 16 | 6.518309009670199446e-03 17 | 6.099871602802646973e-03 18 | 5.731106282925573295e-03 19 | 5.446307741693286707e-03 20 | 5.151670652146693972e-03 21 | 4.944356912416939323e-03 22 | 4.744495616267069109e-03 23 | 4.580015205096745791e-03 24 | 4.456220876104480949e-03 25 | 4.320916517094268612e-03 26 | 4.217448711994636369e-03 27 | 4.157306894597380051e-03 28 | 4.078802187641798228e-03 29 | 4.052351766125276110e-03 30 | 4.007527596805982549e-03 31 | 3.971476095539965522e-03 32 | 3.929509817004457443e-03 33 | 3.912297581342804968e-03 34 | 3.890970703893970126e-03 35 | 3.881272603392416608e-03 36 | 3.881299469413036600e-03 37 | 3.875349433101816718e-03 38 | 3.860861795321494580e-03 39 | 3.836477098795782782e-03 40 | 3.849746865932941915e-03 41 | 3.839641199796480983e-03 42 | 3.836062890106654074e-03 43 | 3.823233183534050037e-03 44 | 3.828918038193149329e-03 45 | 3.827636995006716489e-03 46 | 3.817858354797266582e-03 47 | 3.820815747883170733e-03 48 | 3.830348632117505821e-03 49 | 3.818681549778597199e-03 50 | 3.815017588689344208e-03 51 | 3.815371669913036196e-03 52 | 3.815732919302551682e-03 53 | 3.813882897481215856e-03 54 | 3.810494319743143194e-03 55 | 3.824309645340253153e-03 56 | 3.821447418232367093e-03 57 | 3.819431498963024411e-03 58 | 3.810300241569001319e-03 59 | 3.794642869707678251e-03 60 | 3.824347755611953725e-03 61 | 3.826063443303668286e-03 62 | 3.824070857861551053e-03 63 | 3.811260894320161238e-03 64 | 3.801080013202812625e-03 65 | -------------------------------------------------------------------------------- /analysis/temporal/real-128x128x64/real_uniform_gauss_1.3435_exponential_0.1_0.1_product_temporal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/temporal/real-128x128x64/real_uniform_gauss_1.3435_exponential_0.1_0.1_product_temporal.png -------------------------------------------------------------------------------- /analysis/temporal/real-128x128x64/real_uniform_gauss_1.3435_exponential_0.1_0.2_product.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/temporal/real-128x128x64/real_uniform_gauss_1.3435_exponential_0.1_0.2_product.png -------------------------------------------------------------------------------- /analysis/temporal/real-128x128x64/real_uniform_gauss_1.3435_exponential_0.1_0.2_product_histogram.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/temporal/real-128x128x64/real_uniform_gauss_1.3435_exponential_0.1_0.2_product_histogram.png -------------------------------------------------------------------------------- /analysis/temporal/real-128x128x64/real_uniform_gauss_1.3435_exponential_0.1_0.2_product_spectrum.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/temporal/real-128x128x64/real_uniform_gauss_1.3435_exponential_0.1_0.2_product_spectrum.png -------------------------------------------------------------------------------- /analysis/temporal/real-128x128x64/real_uniform_gauss_1.3435_exponential_0.1_0.2_product_temporal.csv: -------------------------------------------------------------------------------- 1 | 2.565676024754099879e-02 2 | 2.263908273639678170e-02 3 | 2.037986435469280738e-02 4 | 1.841695763704231242e-02 5 | 1.666054228948470745e-02 6 | 1.510353794686890294e-02 7 | 1.368538688514659568e-02 8 | 1.246934199480510645e-02 9 | 1.137273254717542821e-02 10 | 1.038745091775154263e-02 11 | 9.522038803234943866e-03 12 | 8.753494934359989238e-03 13 | 8.060392352742648883e-03 14 | 7.457560023023811387e-03 15 | 6.963308377784050221e-03 16 | 6.526255301641544111e-03 17 | 6.127175077068343356e-03 18 | 5.796883889200640273e-03 19 | 5.511447570308059506e-03 20 | 5.279548897453919566e-03 21 | 5.096114714082135115e-03 22 | 4.923725489891186968e-03 23 | 4.763700791422863061e-03 24 | 4.651804453582849934e-03 25 | 4.550602103605478309e-03 26 | 4.487716776514530728e-03 27 | 4.400680244981445416e-03 28 | 4.344792619413841497e-03 29 | 4.305345408989384379e-03 30 | 4.267874330118332470e-03 31 | 4.252227784270569411e-03 32 | 4.220242059922003040e-03 33 | 4.204181745307666689e-03 34 | 4.202119421068093406e-03 35 | 4.176864005333449578e-03 36 | 4.171508062087847003e-03 37 | 4.162895186402345606e-03 38 | 4.153635280924343823e-03 39 | 4.155442430215173025e-03 40 | 4.170046440187840341e-03 41 | 4.169759113948527142e-03 42 | 4.150948524178285637e-03 43 | 4.134995387677274647e-03 44 | 4.124342987665593867e-03 45 | 4.131108486729859197e-03 46 | 4.130369350641187147e-03 47 | 4.119613361478592986e-03 48 | 4.121818045931548678e-03 49 | 4.126541215041778718e-03 50 | 4.126688551061042168e-03 51 | 4.113030749712253374e-03 52 | 4.117165922382900849e-03 53 | 4.114522297228767438e-03 54 | 4.122765653721909528e-03 55 | 4.105776513598763562e-03 56 | 4.113402840868410001e-03 57 | 4.107594590945362091e-03 58 | 4.110876595422331518e-03 59 | 4.121466577882960947e-03 60 | 4.118861957217073537e-03 61 | 4.113027861872945411e-03 62 | 4.121592244024922108e-03 63 | 4.102116982649765646e-03 64 | 4.107617650925313689e-03 65 | -------------------------------------------------------------------------------- /analysis/temporal/real-128x128x64/real_uniform_gauss_1.3435_exponential_0.1_0.2_product_temporal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/temporal/real-128x128x64/real_uniform_gauss_1.3435_exponential_0.1_0.2_product_temporal.png -------------------------------------------------------------------------------- /analysis/temporal/real-128x128x64/real_uniform_gauss_1.3435_exponential_0.1_0.3_product.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/temporal/real-128x128x64/real_uniform_gauss_1.3435_exponential_0.1_0.3_product.png -------------------------------------------------------------------------------- /analysis/temporal/real-128x128x64/real_uniform_gauss_1.3435_exponential_0.1_0.3_product_histogram.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/temporal/real-128x128x64/real_uniform_gauss_1.3435_exponential_0.1_0.3_product_histogram.png -------------------------------------------------------------------------------- /analysis/temporal/real-128x128x64/real_uniform_gauss_1.3435_exponential_0.1_0.3_product_spectrum.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/temporal/real-128x128x64/real_uniform_gauss_1.3435_exponential_0.1_0.3_product_spectrum.png -------------------------------------------------------------------------------- /analysis/temporal/real-128x128x64/real_uniform_gauss_1.3435_exponential_0.1_0.3_product_temporal.csv: -------------------------------------------------------------------------------- 1 | 2.512233358229746041e-02 2 | 2.227378173547994028e-02 3 | 2.003543781897388493e-02 4 | 1.811401402533584920e-02 5 | 1.643333708861897946e-02 6 | 1.489868704657140025e-02 7 | 1.354512411051387449e-02 8 | 1.234756279139619627e-02 9 | 1.126589857274961845e-02 10 | 1.032423007436732848e-02 11 | 9.479893643132623199e-03 12 | 8.749439211115027717e-03 13 | 8.110956030744137166e-03 14 | 7.558403070272433702e-03 15 | 7.072125665913584110e-03 16 | 6.641409166862299179e-03 17 | 6.273689536564495788e-03 18 | 5.955591301993302424e-03 19 | 5.694742169469233818e-03 20 | 5.468878468054276694e-03 21 | 5.291430377215577963e-03 22 | 5.128302895511635713e-03 23 | 5.002635480041638452e-03 24 | 4.880918612461216007e-03 25 | 4.782799302911957574e-03 26 | 4.711454496101410289e-03 27 | 4.644329371413650695e-03 28 | 4.595702842346764509e-03 29 | 4.559364695874694451e-03 30 | 4.516833250673649852e-03 31 | 4.504256352461678652e-03 32 | 4.473364747778689303e-03 33 | 4.440793886484251628e-03 34 | 4.420706467544031210e-03 35 | 4.417873860819264940e-03 36 | 4.406097635026193400e-03 37 | 4.420361141905733947e-03 38 | 4.403256003271609903e-03 39 | 4.392222848990468519e-03 40 | 4.386423119407928395e-03 41 | 4.388727863036023108e-03 42 | 4.383310421477990167e-03 43 | 4.378199157956159590e-03 44 | 4.369356005125698932e-03 45 | 4.375666549460595356e-03 46 | 4.378655692851468433e-03 47 | 4.378077121243210100e-03 48 | 4.379621899729518528e-03 49 | 4.384820494130670619e-03 50 | 4.393282216061267058e-03 51 | 4.391410609860964785e-03 52 | 4.392715116366499063e-03 53 | 4.383202277877838900e-03 54 | 4.382468809424071646e-03 55 | 4.389077182300824519e-03 56 | 4.387436712854238946e-03 57 | 4.375040783452695259e-03 58 | 4.376793565314001690e-03 59 | 4.380795389504271546e-03 60 | 4.382195642111194264e-03 61 | 4.385210558705189381e-03 62 | 4.375716446675071911e-03 63 | 4.367865354215529593e-03 64 | 4.365773868875657063e-03 65 | -------------------------------------------------------------------------------- /analysis/temporal/real-128x128x64/real_uniform_gauss_1.3435_exponential_0.1_0.3_product_temporal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/temporal/real-128x128x64/real_uniform_gauss_1.3435_exponential_0.1_0.3_product_temporal.png -------------------------------------------------------------------------------- /analysis/temporal/real-128x128x64/real_uniform_gauss_1.3435_exponential_0.1_0.4_product.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/temporal/real-128x128x64/real_uniform_gauss_1.3435_exponential_0.1_0.4_product.png -------------------------------------------------------------------------------- /analysis/temporal/real-128x128x64/real_uniform_gauss_1.3435_exponential_0.1_0.4_product_histogram.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/temporal/real-128x128x64/real_uniform_gauss_1.3435_exponential_0.1_0.4_product_histogram.png -------------------------------------------------------------------------------- /analysis/temporal/real-128x128x64/real_uniform_gauss_1.3435_exponential_0.1_0.4_product_spectrum.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/temporal/real-128x128x64/real_uniform_gauss_1.3435_exponential_0.1_0.4_product_spectrum.png -------------------------------------------------------------------------------- /analysis/temporal/real-128x128x64/real_uniform_gauss_1.3435_exponential_0.1_0.4_product_temporal.csv: -------------------------------------------------------------------------------- 1 | 2.463949519723192955e-02 2 | 2.191431539992248767e-02 3 | 1.977434143308648765e-02 4 | 1.790045107348621836e-02 5 | 1.622826564760431606e-02 6 | 1.473944195778900852e-02 7 | 1.339634596961236657e-02 8 | 1.223851593426876147e-02 9 | 1.119312434294249779e-02 10 | 1.025865085253455967e-02 11 | 9.430178826339548001e-03 12 | 8.733412359540854847e-03 13 | 8.089124684447080230e-03 14 | 7.547181393990647427e-03 15 | 7.074335180275018176e-03 16 | 6.667400128689917639e-03 17 | 6.347666339579511284e-03 18 | 6.058504693086239588e-03 19 | 5.809851867716421710e-03 20 | 5.584553321256843957e-03 21 | 5.410195102416170618e-03 22 | 5.267794784553900267e-03 23 | 5.159109195147144368e-03 24 | 5.038161829381610467e-03 25 | 4.973489885993297166e-03 26 | 4.891732810332806262e-03 27 | 4.844595031733956760e-03 28 | 4.795932022808436709e-03 29 | 4.768104632217958980e-03 30 | 4.740878462994390675e-03 31 | 4.718534974267983920e-03 32 | 4.696838448389376898e-03 33 | 4.676930301960568678e-03 34 | 4.672704101071828604e-03 35 | 4.645179664647783140e-03 36 | 4.624789437816648197e-03 37 | 4.610377248249202149e-03 38 | 4.612266509514108270e-03 39 | 4.615910482912341170e-03 40 | 4.609020539269725360e-03 41 | 4.601762482291895349e-03 42 | 4.615537999117377659e-03 43 | 4.618812101876161938e-03 44 | 4.616827165940082418e-03 45 | 4.605820812378369489e-03 46 | 4.616674848391255984e-03 47 | 4.601387363005879881e-03 48 | 4.599407834957364334e-03 49 | 4.616574385773132214e-03 50 | 4.620969397610763703e-03 51 | 4.624371966261199909e-03 52 | 4.610624994949860146e-03 53 | 4.619591219387245498e-03 54 | 4.619107088367791283e-03 55 | 4.611373910343930654e-03 56 | 4.591352227048739985e-03 57 | 4.589854663620516161e-03 58 | 4.592274914189446722e-03 59 | 4.609370435824319129e-03 60 | 4.604817050501957415e-03 61 | 4.599540139263638000e-03 62 | 4.605967118555097904e-03 63 | 4.593742929550932372e-03 64 | 4.595648558583360910e-03 65 | -------------------------------------------------------------------------------- /analysis/temporal/real-128x128x64/real_uniform_gauss_1.3435_exponential_0.1_0.4_product_temporal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/temporal/real-128x128x64/real_uniform_gauss_1.3435_exponential_0.1_0.4_product_temporal.png -------------------------------------------------------------------------------- /analysis/temporal/real-128x128x64/real_uniform_gauss_1.3435_exponential_0.1_0.5_product.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/temporal/real-128x128x64/real_uniform_gauss_1.3435_exponential_0.1_0.5_product.png -------------------------------------------------------------------------------- /analysis/temporal/real-128x128x64/real_uniform_gauss_1.3435_exponential_0.1_0.5_product_histogram.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/temporal/real-128x128x64/real_uniform_gauss_1.3435_exponential_0.1_0.5_product_histogram.png -------------------------------------------------------------------------------- /analysis/temporal/real-128x128x64/real_uniform_gauss_1.3435_exponential_0.1_0.5_product_spectrum.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/temporal/real-128x128x64/real_uniform_gauss_1.3435_exponential_0.1_0.5_product_spectrum.png -------------------------------------------------------------------------------- /analysis/temporal/real-128x128x64/real_uniform_gauss_1.3435_exponential_0.1_0.5_product_temporal.csv: -------------------------------------------------------------------------------- 1 | 2.440753448174374368e-02 2 | 2.178928630880736309e-02 3 | 1.968569449528140280e-02 4 | 1.783155536286649620e-02 5 | 1.617082113850078912e-02 6 | 1.470278160362581583e-02 7 | 1.338862279516308922e-02 8 | 1.224798060951714194e-02 9 | 1.121967119519774909e-02 10 | 1.031259656726189917e-02 11 | 9.504252703460579210e-03 12 | 8.804653661420087929e-03 13 | 8.204548957607632823e-03 14 | 7.668876391090521764e-03 15 | 7.200439026911642504e-03 16 | 6.802002746428590513e-03 17 | 6.464385066036471873e-03 18 | 6.176302125799658718e-03 19 | 5.945099412019854562e-03 20 | 5.741732931376462325e-03 21 | 5.556978164085215645e-03 22 | 5.395538052264515702e-03 23 | 5.302999993364075106e-03 24 | 5.204088629988124978e-03 25 | 5.133185538448848187e-03 26 | 5.074384189340064820e-03 27 | 5.033285270160526084e-03 28 | 4.982172894347940313e-03 29 | 4.938605924284389902e-03 30 | 4.896203565311184162e-03 31 | 4.874083458591389230e-03 32 | 4.876944793444976632e-03 33 | 4.852426619982645045e-03 34 | 4.802421604058703525e-03 35 | 4.805274559683480988e-03 36 | 4.806661757931087950e-03 37 | 4.809363090097860255e-03 38 | 4.797174796242384062e-03 39 | 4.795681349944774102e-03 40 | 4.790651057224284276e-03 41 | 4.799246995043321244e-03 42 | 4.793355618860244312e-03 43 | 4.789810151860957217e-03 44 | 4.782238644483801683e-03 45 | 4.770492396528548153e-03 46 | 4.782577361127294396e-03 47 | 4.780806132143824820e-03 48 | 4.781738443102169327e-03 49 | 4.800298575800776568e-03 50 | 4.790404911648222033e-03 51 | 4.793816300246302002e-03 52 | 4.771811031619540254e-03 53 | 4.783509416036058060e-03 54 | 4.785561746241737482e-03 55 | 4.791501181396104828e-03 56 | 4.796858787953570645e-03 57 | 4.798218520327806810e-03 58 | 4.787302512580860793e-03 59 | 4.776539246536187083e-03 60 | 4.769205249899171120e-03 61 | 4.763532144200715614e-03 62 | 4.775440324221359549e-03 63 | 4.764823104616800961e-03 64 | 4.769362471671861371e-03 65 | -------------------------------------------------------------------------------- /analysis/temporal/real-128x128x64/real_uniform_gauss_1.3435_exponential_0.1_0.5_product_temporal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/temporal/real-128x128x64/real_uniform_gauss_1.3435_exponential_0.1_0.5_product_temporal.png -------------------------------------------------------------------------------- /analysis/temporal/real-128x128x64/real_uniform_gauss_1.3435_exponential_0.1_temporal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/temporal/real-128x128x64/real_uniform_gauss_1.3435_exponential_0.1_temporal.png -------------------------------------------------------------------------------- /analysis/temporal/real-128x128x64/real_uniform_gauss_1.3435_white_over_time.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/temporal/real-128x128x64/real_uniform_gauss_1.3435_white_over_time.png -------------------------------------------------------------------------------- /analysis/temporal/real-128x128x64/real_uniform_gauss_1.3435_white_over_time_spectrum.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/temporal/real-128x128x64/real_uniform_gauss_1.3435_white_over_time_spectrum.png -------------------------------------------------------------------------------- /analysis/temporal/real-128x128x64/real_uniform_gauss_1.3435_white_over_time_temporal.csv: -------------------------------------------------------------------------------- 1 | 2.395776103322198522e-02 2 | 2.171300770053400178e-02 3 | 1.970180600614590202e-02 4 | 1.789460099594226278e-02 5 | 1.628424568964380315e-02 6 | 1.482917847172995733e-02 7 | 1.356430343582744336e-02 8 | 1.243942222725051040e-02 9 | 1.145581673809767734e-02 10 | 1.058056865315080627e-02 11 | 9.819651978117334076e-03 12 | 9.156261653609438014e-03 13 | 8.570627236066066801e-03 14 | 8.081697926773521307e-03 15 | 7.649634247857827786e-03 16 | 7.285911918458738701e-03 17 | 6.974086007688994407e-03 18 | 6.719218626734243388e-03 19 | 6.491213510765569614e-03 20 | 6.303100084695935877e-03 21 | 6.151806424443418894e-03 22 | 6.018233664731802157e-03 23 | 5.901175622346291512e-03 24 | 5.832537555864884121e-03 25 | 5.768121700641902320e-03 26 | 5.714459913892187479e-03 27 | 5.682388295115367929e-03 28 | 5.645044541972453131e-03 29 | 5.624280811586127894e-03 30 | 5.615797813137663602e-03 31 | 5.580943643353169885e-03 32 | 5.570071620328418197e-03 33 | 5.579354043760573201e-03 34 | 5.572881508638661587e-03 35 | 5.531314806175370233e-03 36 | 5.525358320967827148e-03 37 | 5.492770308510367544e-03 38 | 5.485717381391709210e-03 39 | 5.498845090824221009e-03 40 | 5.506572990644625736e-03 41 | 5.510799315983510444e-03 42 | 5.499871839968679607e-03 43 | 5.505091705932312757e-03 44 | 5.489954535713942839e-03 45 | 5.477715578290429620e-03 46 | 5.477509772983520271e-03 47 | 5.477669842565959825e-03 48 | 5.479194430835316806e-03 49 | 5.484480150681239966e-03 50 | 5.482151459372914051e-03 51 | 5.477500374893473634e-03 52 | 5.487552968722666895e-03 53 | 5.420072225371650766e-03 54 | 5.416680252236330019e-03 55 | 5.435440602252740450e-03 56 | 5.449784325052301967e-03 57 | 5.457789026949230390e-03 58 | 5.460265741620402846e-03 59 | 5.470547028948636106e-03 60 | 5.463574741179580939e-03 61 | 5.491507499730270692e-03 62 | 5.503757701184357719e-03 63 | 5.491967847947168586e-03 64 | 5.496833561536408098e-03 65 | -------------------------------------------------------------------------------- /analysis/temporal/real-128x128x64/real_uniform_gauss_1.3435_white_over_time_temporal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/temporal/real-128x128x64/real_uniform_gauss_1.3435_white_over_time_temporal.png -------------------------------------------------------------------------------- /analysis/temporal/real-128x128x64/real_whitenoise.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/temporal/real-128x128x64/real_whitenoise.png -------------------------------------------------------------------------------- /analysis/temporal/real-128x128x64/real_whitenoise_histogram.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/temporal/real-128x128x64/real_whitenoise_histogram.png -------------------------------------------------------------------------------- /analysis/temporal/real-128x128x64/real_whitenoise_spectrum.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/temporal/real-128x128x64/real_whitenoise_spectrum.png -------------------------------------------------------------------------------- /analysis/temporal/real-128x128x64/real_whitenoise_temporal.csv: -------------------------------------------------------------------------------- 1 | 1.212933726816685098e-01 2 | 1.101364931077288695e-01 3 | 9.994222908844475894e-02 4 | 9.092123417337456825e-02 5 | 8.235900861749932689e-02 6 | 7.523384336991516264e-02 7 | 6.873683095091052964e-02 8 | 6.309400046178105514e-02 9 | 5.793281051536160187e-02 10 | 5.361388193529961071e-02 11 | 4.968328156180114308e-02 12 | 4.625805798142304526e-02 13 | 4.317976079359043401e-02 14 | 4.077330414382671075e-02 15 | 3.865158983015382771e-02 16 | 3.671784121026554215e-02 17 | 3.554180060852822620e-02 18 | 3.416443762799163675e-02 19 | 3.324206708728048160e-02 20 | 3.224878641529564660e-02 21 | 3.129043814870662715e-02 22 | 3.070959746475258184e-02 23 | 3.028510326807417469e-02 24 | 2.979571019465152362e-02 25 | 2.935000698822874676e-02 26 | 2.889683827018229428e-02 27 | 2.872977931049967848e-02 28 | 2.866834707856159847e-02 29 | 2.848243924866539906e-02 30 | 2.858618785824225753e-02 31 | 2.829573830442797325e-02 32 | 2.824188098289328805e-02 33 | 2.820127279749099977e-02 34 | 2.836854572575696690e-02 35 | 2.826245948289799262e-02 36 | 2.796155064395670561e-02 37 | 2.788460651958687281e-02 38 | 2.765169757094109240e-02 39 | 2.764482151230279391e-02 40 | 2.794157699092071970e-02 41 | 2.818698216357248473e-02 42 | 2.795309160651259991e-02 43 | 2.768792059425723151e-02 44 | 2.778954644715678560e-02 45 | 2.759155482052296632e-02 46 | 2.746760759322480414e-02 47 | 2.750475166462738180e-02 48 | 2.758923291098955982e-02 49 | 2.749784322121389540e-02 50 | 2.728893257421363336e-02 51 | 2.748877442972260873e-02 52 | 2.755719353637383837e-02 53 | 2.751334600241620715e-02 54 | 2.762666091272331786e-02 55 | 2.747358046406081847e-02 56 | 2.764441635629203559e-02 57 | 2.756888678744238985e-02 58 | 2.765537791122198163e-02 59 | 2.761614246546481230e-02 60 | 2.772854214969495967e-02 61 | 2.773037615047639973e-02 62 | 2.800665962318779276e-02 63 | 2.770082876829783186e-02 64 | 2.760714471117012986e-02 65 | -------------------------------------------------------------------------------- /analysis/temporal/real-128x128x64/real_whitenoise_temporal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/temporal/real-128x128x64/real_whitenoise_temporal.png -------------------------------------------------------------------------------- /analysis/vector2/vector2_uniform_binomial_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/vector2/vector2_uniform_binomial_2.png -------------------------------------------------------------------------------- /analysis/vector2/vector2_uniform_binomial_2_histogram.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/vector2/vector2_uniform_binomial_2_histogram.png -------------------------------------------------------------------------------- /analysis/vector2/vector2_uniform_binomial_2_spectrum.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/vector2/vector2_uniform_binomial_2_spectrum.png -------------------------------------------------------------------------------- /analysis/vector2/vector2_uniform_binomial_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/vector2/vector2_uniform_binomial_3.png -------------------------------------------------------------------------------- /analysis/vector2/vector2_uniform_binomial_3_histogram.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/vector2/vector2_uniform_binomial_3_histogram.png -------------------------------------------------------------------------------- /analysis/vector2/vector2_uniform_binomial_3_spectrum.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/vector2/vector2_uniform_binomial_3_spectrum.png -------------------------------------------------------------------------------- /analysis/vector2/vector2_uniform_box_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/vector2/vector2_uniform_box_3.png -------------------------------------------------------------------------------- /analysis/vector2/vector2_uniform_box_3_histogram.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/vector2/vector2_uniform_box_3_histogram.png -------------------------------------------------------------------------------- /analysis/vector2/vector2_uniform_box_3_spectrum.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/vector2/vector2_uniform_box_3_spectrum.png -------------------------------------------------------------------------------- /analysis/vector2/vector2_uniform_box_5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/vector2/vector2_uniform_box_5.png -------------------------------------------------------------------------------- /analysis/vector2/vector2_uniform_box_5_histogram.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/vector2/vector2_uniform_box_5_histogram.png -------------------------------------------------------------------------------- /analysis/vector2/vector2_uniform_box_5_spectrum.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/vector2/vector2_uniform_box_5_spectrum.png -------------------------------------------------------------------------------- /analysis/vector2/vector2_uniform_gauss_0.5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/vector2/vector2_uniform_gauss_0.5.png -------------------------------------------------------------------------------- /analysis/vector2/vector2_uniform_gauss_0.5_histogram.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/vector2/vector2_uniform_gauss_0.5_histogram.png -------------------------------------------------------------------------------- /analysis/vector2/vector2_uniform_gauss_0.5_spectrum.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/vector2/vector2_uniform_gauss_0.5_spectrum.png -------------------------------------------------------------------------------- /analysis/vector2/vector2_uniform_gauss_0.7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/vector2/vector2_uniform_gauss_0.7.png -------------------------------------------------------------------------------- /analysis/vector2/vector2_uniform_gauss_0.7_histogram.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/vector2/vector2_uniform_gauss_0.7_histogram.png -------------------------------------------------------------------------------- /analysis/vector2/vector2_uniform_gauss_0.7_spectrum.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/vector2/vector2_uniform_gauss_0.7_spectrum.png -------------------------------------------------------------------------------- /analysis/vector2/vector2_uniform_gauss_1.0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/vector2/vector2_uniform_gauss_1.0.png -------------------------------------------------------------------------------- /analysis/vector2/vector2_uniform_gauss_1.0_histogram.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/vector2/vector2_uniform_gauss_1.0_histogram.png -------------------------------------------------------------------------------- /analysis/vector2/vector2_uniform_gauss_1.0_spectrum.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/vector2/vector2_uniform_gauss_1.0_spectrum.png -------------------------------------------------------------------------------- /analysis/vector3/vector3_uniform_binomial_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/vector3/vector3_uniform_binomial_2.png -------------------------------------------------------------------------------- /analysis/vector3/vector3_uniform_binomial_2_histogram.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/vector3/vector3_uniform_binomial_2_histogram.png -------------------------------------------------------------------------------- /analysis/vector3/vector3_uniform_binomial_2_spectrum.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/vector3/vector3_uniform_binomial_2_spectrum.png -------------------------------------------------------------------------------- /analysis/vector3/vector3_uniform_binomial_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/vector3/vector3_uniform_binomial_3.png -------------------------------------------------------------------------------- /analysis/vector3/vector3_uniform_binomial_3_histogram.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/vector3/vector3_uniform_binomial_3_histogram.png -------------------------------------------------------------------------------- /analysis/vector3/vector3_uniform_binomial_3_spectrum.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/vector3/vector3_uniform_binomial_3_spectrum.png -------------------------------------------------------------------------------- /analysis/vector3/vector3_uniform_box_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/vector3/vector3_uniform_box_3.png -------------------------------------------------------------------------------- /analysis/vector3/vector3_uniform_box_3_histogram.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/vector3/vector3_uniform_box_3_histogram.png -------------------------------------------------------------------------------- /analysis/vector3/vector3_uniform_box_3_spectrum.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/vector3/vector3_uniform_box_3_spectrum.png -------------------------------------------------------------------------------- /analysis/vector3/vector3_uniform_box_5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/vector3/vector3_uniform_box_5.png -------------------------------------------------------------------------------- /analysis/vector3/vector3_uniform_box_5_histogram.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/vector3/vector3_uniform_box_5_histogram.png -------------------------------------------------------------------------------- /analysis/vector3/vector3_uniform_box_5_spectrum.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/vector3/vector3_uniform_box_5_spectrum.png -------------------------------------------------------------------------------- /analysis/vector3/vector3_uniform_gauss_0.5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/vector3/vector3_uniform_gauss_0.5.png -------------------------------------------------------------------------------- /analysis/vector3/vector3_uniform_gauss_0.5_histogram.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/vector3/vector3_uniform_gauss_0.5_histogram.png -------------------------------------------------------------------------------- /analysis/vector3/vector3_uniform_gauss_0.5_spectrum.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/vector3/vector3_uniform_gauss_0.5_spectrum.png -------------------------------------------------------------------------------- /analysis/vector3/vector3_uniform_gauss_0.7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/vector3/vector3_uniform_gauss_0.7.png -------------------------------------------------------------------------------- /analysis/vector3/vector3_uniform_gauss_0.7_histogram.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/vector3/vector3_uniform_gauss_0.7_histogram.png -------------------------------------------------------------------------------- /analysis/vector3/vector3_uniform_gauss_0.7_spectrum.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/vector3/vector3_uniform_gauss_0.7_spectrum.png -------------------------------------------------------------------------------- /analysis/vector3/vector3_uniform_gauss_1.0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/vector3/vector3_uniform_gauss_1.0.png -------------------------------------------------------------------------------- /analysis/vector3/vector3_uniform_gauss_1.0_histogram.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/vector3/vector3_uniform_gauss_1.0_histogram.png -------------------------------------------------------------------------------- /analysis/vector3/vector3_uniform_gauss_1.0_spectrum.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/vector3/vector3_uniform_gauss_1.0_spectrum.png -------------------------------------------------------------------------------- /analysis/vector4/vector4_uniform_binomial_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/vector4/vector4_uniform_binomial_2.png -------------------------------------------------------------------------------- /analysis/vector4/vector4_uniform_binomial_2_histogram.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/vector4/vector4_uniform_binomial_2_histogram.png -------------------------------------------------------------------------------- /analysis/vector4/vector4_uniform_binomial_2_spectrum.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/vector4/vector4_uniform_binomial_2_spectrum.png -------------------------------------------------------------------------------- /analysis/vector4/vector4_uniform_binomial_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/vector4/vector4_uniform_binomial_3.png -------------------------------------------------------------------------------- /analysis/vector4/vector4_uniform_binomial_3_histogram.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/vector4/vector4_uniform_binomial_3_histogram.png -------------------------------------------------------------------------------- /analysis/vector4/vector4_uniform_binomial_3_spectrum.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/vector4/vector4_uniform_binomial_3_spectrum.png -------------------------------------------------------------------------------- /analysis/vector4/vector4_uniform_box_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/vector4/vector4_uniform_box_3.png -------------------------------------------------------------------------------- /analysis/vector4/vector4_uniform_box_3_histogram.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/vector4/vector4_uniform_box_3_histogram.png -------------------------------------------------------------------------------- /analysis/vector4/vector4_uniform_box_3_spectrum.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/vector4/vector4_uniform_box_3_spectrum.png -------------------------------------------------------------------------------- /analysis/vector4/vector4_uniform_box_5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/vector4/vector4_uniform_box_5.png -------------------------------------------------------------------------------- /analysis/vector4/vector4_uniform_box_5_histogram.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/vector4/vector4_uniform_box_5_histogram.png -------------------------------------------------------------------------------- /analysis/vector4/vector4_uniform_box_5_spectrum.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/vector4/vector4_uniform_box_5_spectrum.png -------------------------------------------------------------------------------- /analysis/vector4/vector4_uniform_gauss_0.5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/vector4/vector4_uniform_gauss_0.5.png -------------------------------------------------------------------------------- /analysis/vector4/vector4_uniform_gauss_0.5_histogram.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/vector4/vector4_uniform_gauss_0.5_histogram.png -------------------------------------------------------------------------------- /analysis/vector4/vector4_uniform_gauss_0.5_spectrum.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/vector4/vector4_uniform_gauss_0.5_spectrum.png -------------------------------------------------------------------------------- /analysis/vector4/vector4_uniform_gauss_0.7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/vector4/vector4_uniform_gauss_0.7.png -------------------------------------------------------------------------------- /analysis/vector4/vector4_uniform_gauss_0.7_histogram.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/vector4/vector4_uniform_gauss_0.7_histogram.png -------------------------------------------------------------------------------- /analysis/vector4/vector4_uniform_gauss_0.7_spectrum.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/vector4/vector4_uniform_gauss_0.7_spectrum.png -------------------------------------------------------------------------------- /analysis/vector4/vector4_uniform_gauss_1.0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/vector4/vector4_uniform_gauss_1.0.png -------------------------------------------------------------------------------- /analysis/vector4/vector4_uniform_gauss_1.0_histogram.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/vector4/vector4_uniform_gauss_1.0_histogram.png -------------------------------------------------------------------------------- /analysis/vector4/vector4_uniform_gauss_1.0_spectrum.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/analysis/vector4/vector4_uniform_gauss_1.0_spectrum.png -------------------------------------------------------------------------------- /buildscripts/Build_Debug.bat: -------------------------------------------------------------------------------- 1 | echo [FASTNOISE] Build DEBUG 2 | 3 | "C:\Program Files\Microsoft Visual Studio\2022\Professional\Msbuild\Current\Bin\MSBuild.exe" FastNoise.sln /property:Configuration=Debug 4 | -------------------------------------------------------------------------------- /buildscripts/Build_Release.bat: -------------------------------------------------------------------------------- 1 | echo [FASTNOISE] Build RELEASE 2 | 3 | "C:\Program Files\Microsoft Visual Studio\2022\Professional\Msbuild\Current\Bin\MSBuild.exe" FastNoise.sln /property:Configuration=Release 4 | -------------------------------------------------------------------------------- /dxcompiler.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/dxcompiler.dll -------------------------------------------------------------------------------- /dxil.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/dxil.dll -------------------------------------------------------------------------------- /fastnoise/DX12Utils/CompileShaders.h: -------------------------------------------------------------------------------- 1 | /////////////////////////////////////////////////////////////////////////////// 2 | // FastNoise - F.A.S.T. Sampling Implementation // 3 | // Copyright (c) 2023 Electronic Arts Inc. All rights reserved. // 4 | /////////////////////////////////////////////////////////////////////////////// 5 | 6 | #pragma once 7 | 8 | #include 9 | 10 | #include 11 | #include 12 | 13 | #include "DX12Utils/logfn.h" 14 | 15 | namespace DX12Utils 16 | { 17 | bool MakeComputePSO_DXC( 18 | ID3D12Device* device, 19 | LPCWSTR shaderDir, 20 | LPCWSTR shaderFile, 21 | const char* entryPoint, 22 | const char* shaderModel, 23 | const D3D_SHADER_MACRO* defines, 24 | ID3D12RootSignature* rootSig, 25 | ID3D12PipelineState** pso, 26 | bool debugShaders, 27 | LPCWSTR debugName, 28 | TLogFn logFn); 29 | 30 | bool MakeComputePSO_FXC( 31 | ID3D12Device* device, 32 | LPCWSTR shaderDir, 33 | LPCWSTR shaderFile, 34 | const char* entryPoint, 35 | const char* shaderModel, 36 | const D3D_SHADER_MACRO* defines, 37 | ID3D12RootSignature* rootSig, 38 | ID3D12PipelineState** pso, 39 | bool debugShaders, 40 | LPCWSTR debugName, 41 | TLogFn logFn); 42 | 43 | std::vector CompileShaderToByteCode_DXC( 44 | LPCWSTR shaderDir, 45 | LPCWSTR shaderFile, 46 | const char* entryPoint, 47 | const char* shaderModel, 48 | const D3D_SHADER_MACRO* defines, 49 | bool debugShaders, 50 | TLogFn logFn); 51 | 52 | std::vector CompileShaderToByteCode_FXC( 53 | LPCWSTR shaderDir, 54 | LPCWSTR shaderFile, 55 | const char* entryPoint, 56 | const char* shaderModel, 57 | const D3D_SHADER_MACRO* defines, 58 | bool debugShaders, 59 | TLogFn logFn); 60 | } -------------------------------------------------------------------------------- /fastnoise/DX12Utils/DelayedReleaseTracker.h: -------------------------------------------------------------------------------- 1 | /////////////////////////////////////////////////////////////////////////////// 2 | // FastNoise - F.A.S.T. Sampling Implementation // 3 | // Copyright (c) 2023 Electronic Arts Inc. All rights reserved. // 4 | /////////////////////////////////////////////////////////////////////////////// 5 | 6 | #pragma once 7 | 8 | #include 9 | #include 10 | 11 | namespace DX12Utils 12 | { 13 | 14 | class DelayedReleaseTracker 15 | { 16 | public: 17 | void OnNewFrame(int maxFramesInFlight) 18 | { 19 | // advance the age of each object. Free them when it's safe to do so. 20 | m_objects.erase( 21 | std::remove_if(m_objects.begin(), m_objects.end(), 22 | [maxFramesInFlight](Object& object) 23 | { 24 | object.age++; 25 | if (object.age >= maxFramesInFlight) 26 | { 27 | object.object->Release(); 28 | return true; 29 | } 30 | return false; 31 | } 32 | ), 33 | m_objects.end() 34 | ); 35 | } 36 | 37 | void Add(ID3D12DeviceChild* object) 38 | { 39 | if (!object) 40 | return; 41 | 42 | m_objects.push_back({ object, 0 }); 43 | } 44 | 45 | void Release() 46 | { 47 | // This assumes there are no more frames in flight and that it's safe to release everything 48 | for (Object& object : m_objects) 49 | object.object->Release(); 50 | m_objects.clear(); 51 | } 52 | 53 | private: 54 | struct Object 55 | { 56 | ID3D12DeviceChild* object = nullptr; 57 | int age = 0; 58 | }; 59 | 60 | std::vector m_objects; 61 | }; 62 | 63 | }; // namespace DX12Utils -------------------------------------------------------------------------------- /fastnoise/DX12Utils/FileCache.cpp: -------------------------------------------------------------------------------- 1 | /////////////////////////////////////////////////////////////////////////////// 2 | // FastNoise - F.A.S.T. Sampling Implementation // 3 | // Copyright (c) 2023 Electronic Arts Inc. All rights reserved. // 4 | /////////////////////////////////////////////////////////////////////////////// 5 | 6 | #include "FileCache.h" 7 | 8 | #include 9 | 10 | std::unordered_map DX12Utils::FileCache::s_cache; 11 | 12 | namespace DX12Utils 13 | { 14 | 15 | FileCache::File& FileCache::Get(const char* fileName) 16 | { 17 | // normalize the string by making it canonical and making it lower case 18 | std::string s = std::filesystem::weakly_canonical(fileName).string(); 19 | std::transform(s.begin(), s.end(), s.begin(), [](unsigned char c) { return std::tolower(c); }); 20 | 21 | // If we don't have an entry for this file, create one 22 | // Add an extra null character at the end for text files. 23 | // We'll report the size as size-1 to account for this. 24 | if (s_cache.count(s) == 0) 25 | { 26 | File newFile; 27 | 28 | FILE* file = nullptr; 29 | fopen_s(&file, s.c_str(), "rb"); 30 | if (file) 31 | { 32 | fseek(file, 0, SEEK_END); 33 | newFile.bytes.resize(ftell(file) + 1); 34 | fseek(file, 0, SEEK_SET); 35 | fread(newFile.bytes.data(), 1, newFile.bytes.size() - 1, file); 36 | newFile.bytes[newFile.bytes.size() - 1] = 0; 37 | fclose(file); 38 | } 39 | 40 | s_cache[s] = newFile; 41 | } 42 | 43 | // return the entry for this file 44 | return s_cache[s]; 45 | } 46 | 47 | }; //namespace DX12Utils 48 | -------------------------------------------------------------------------------- /fastnoise/DX12Utils/FileCache.h: -------------------------------------------------------------------------------- 1 | /////////////////////////////////////////////////////////////////////////////// 2 | // FastNoise - F.A.S.T. Sampling Implementation // 3 | // Copyright (c) 2023 Electronic Arts Inc. All rights reserved. // 4 | /////////////////////////////////////////////////////////////////////////////// 5 | 6 | #pragma once 7 | 8 | #include 9 | #include 10 | #include 11 | 12 | namespace DX12Utils 13 | { 14 | 15 | class FileCache 16 | { 17 | public: 18 | struct File 19 | { 20 | bool Valid() 21 | { 22 | return bytes.size() > 0; 23 | } 24 | 25 | size_t GetSize() const 26 | { 27 | // Note that we add an extra null character on the end for text files, so size is really size-1 28 | size_t ret = bytes.size(); 29 | if (ret > 0) 30 | ret--; 31 | return ret; 32 | } 33 | 34 | const char* GetBytes() const 35 | { 36 | return bytes.data(); 37 | } 38 | 39 | private: 40 | friend class FileCache; 41 | 42 | // Hidden away because we add an extra character for a null terminator for text files 43 | std::vector bytes; 44 | }; 45 | 46 | static File& Get(const char* fileName); 47 | 48 | static bool Remove(const char* fileName) 49 | { 50 | if (s_cache.count(fileName) == 0) 51 | return false; 52 | 53 | s_cache.erase(fileName); 54 | return true; 55 | } 56 | 57 | static void ClearCache() 58 | { 59 | std::unordered_map empty; 60 | std::swap(s_cache, empty); 61 | } 62 | 63 | private: 64 | FileCache() {} // This is a static class 65 | 66 | private: 67 | static std::unordered_map s_cache; 68 | }; 69 | 70 | }; //namespace DX12Utils 71 | -------------------------------------------------------------------------------- /fastnoise/DX12Utils/HeapAllocationTracker.h: -------------------------------------------------------------------------------- 1 | /////////////////////////////////////////////////////////////////////////////// 2 | // FastNoise - F.A.S.T. Sampling Implementation // 3 | // Copyright (c) 2023 Electronic Arts Inc. All rights reserved. // 4 | /////////////////////////////////////////////////////////////////////////////// 5 | 6 | #pragma once 7 | 8 | #include 9 | #include 10 | 11 | #ifdef _DEBUG 12 | #define DO_DEBUG() true 13 | #define HEAP_DEBUG_TEXT() __FILE__ " " TOSTRING(__LINE__) 14 | #else 15 | #define DO_DEBUG() false 16 | #define HEAP_DEBUG_TEXT() "" 17 | #endif 18 | 19 | namespace DX12Utils 20 | { 21 | 22 | class HeapAllocationTracker 23 | { 24 | public: 25 | void Init(ID3D12DescriptorHeap* heap, int descriptorCount, int descriptorSize) 26 | { 27 | m_delayedFreeLists.resize(1); 28 | m_heap = heap; 29 | m_allocated.clear(); 30 | m_allocated.resize(descriptorCount, 0); 31 | m_descriptorSize = descriptorSize; 32 | 33 | #if DO_DEBUG() 34 | m_debugText.clear(); 35 | m_debugText.resize(descriptorCount); 36 | #endif 37 | } 38 | 39 | // When something external claims specific indices, use this function. 40 | void MarkIndexAllocated(int index, const char* debugText) 41 | { 42 | m_allocated[index] = true; 43 | 44 | #if DO_DEBUG() 45 | m_debugText[index] = debugText; 46 | #endif 47 | } 48 | 49 | bool Allocate(int& allocatedIndex, const char* debugText) 50 | { 51 | for (int i = 0; i < (int)m_allocated.size(); ++i) 52 | { 53 | if (!m_allocated[i]) 54 | { 55 | MarkIndexAllocated(i, debugText); 56 | allocatedIndex = i; 57 | return true; 58 | } 59 | } 60 | return false; 61 | } 62 | 63 | bool Allocate(int& allocatedIndex, int count, const char* debugText) 64 | { 65 | // scan for a group of free indices 66 | for (int i = 0; i < (int)m_allocated.size(); ++i) 67 | { 68 | // If we ran out of indices, we are done 69 | if (i + count - 1 >= (int)m_allocated.size()) 70 | return false; 71 | 72 | // See if this run of indices is free 73 | bool ok = true; 74 | for (int index = 0; index < count; ++index) 75 | { 76 | if (m_allocated[i + index]) 77 | { 78 | ok = false; 79 | break; 80 | } 81 | } 82 | 83 | // if we had enough free, allocate them all and return success, along with where the block starts. 84 | if (ok) 85 | { 86 | allocatedIndex = i; 87 | for (int index = 0; index < count; ++index) 88 | MarkIndexAllocated(i + index, debugText); 89 | return true; 90 | } 91 | 92 | // otherwise, skip to the end of the "not ok" section 93 | i += count - 1; 94 | } 95 | return false; 96 | } 97 | 98 | void Free(int index) 99 | { 100 | m_delayedFreeLists[m_frameIndex].push_back(index); 101 | } 102 | 103 | void Free(int index, int count) 104 | { 105 | for (int i = 0; i < count; ++i) 106 | m_delayedFreeLists[m_frameIndex].push_back(index + i); 107 | } 108 | 109 | int AllocatedCount() const 110 | { 111 | int ret = 0; 112 | for (const bool& b : m_allocated) 113 | ret += b ? 1 : 0; 114 | return ret; 115 | } 116 | 117 | void FlushFreeList(int freeListIndex) 118 | { 119 | for (int index : m_delayedFreeLists[freeListIndex]) 120 | m_allocated[index] = false; 121 | m_delayedFreeLists[freeListIndex].clear(); 122 | } 123 | 124 | void FlushFreeLists() 125 | { 126 | for (int index = 0; index < m_delayedFreeLists.size(); ++index) 127 | FlushFreeList(index); 128 | } 129 | 130 | void OnNewFrame(int framesInFlight) 131 | { 132 | if (framesInFlight > m_delayedFreeLists.size()) 133 | m_delayedFreeLists.resize(framesInFlight); 134 | 135 | m_frameIndex = (m_frameIndex + 1) % (int)m_delayedFreeLists.size(); 136 | FlushFreeList(m_frameIndex); 137 | } 138 | 139 | D3D12_CPU_DESCRIPTOR_HANDLE GetCPUHandle(int index) const 140 | { 141 | D3D12_CPU_DESCRIPTOR_HANDLE ret; 142 | ret.ptr = m_heap->GetCPUDescriptorHandleForHeapStart().ptr + index * m_descriptorSize; 143 | return ret; 144 | } 145 | 146 | D3D12_GPU_DESCRIPTOR_HANDLE GetGPUHandle(int index) const 147 | { 148 | D3D12_GPU_DESCRIPTOR_HANDLE ret; 149 | ret.ptr = m_heap->GetGPUDescriptorHandleForHeapStart().ptr + index * m_descriptorSize; 150 | return ret; 151 | } 152 | 153 | void Release() 154 | { 155 | m_allocated.clear(); 156 | 157 | m_heap = nullptr; 158 | m_descriptorSize = 0; 159 | 160 | m_frameIndex = 0; 161 | m_delayedFreeLists.clear(); 162 | } 163 | 164 | private: 165 | std::vector m_allocated; 166 | 167 | ID3D12DescriptorHeap* m_heap = nullptr; 168 | int m_descriptorSize = 0; 169 | 170 | int m_frameIndex = 0; 171 | std::vector> m_delayedFreeLists; 172 | 173 | #if DO_DEBUG() 174 | std::vector m_debugText; 175 | #endif 176 | }; 177 | 178 | } // namespace DX12Utils -------------------------------------------------------------------------------- /fastnoise/DX12Utils/ParseCSV.h: -------------------------------------------------------------------------------- 1 | /////////////////////////////////////////////////////////////////////////////// 2 | // FastNoise - F.A.S.T. Sampling Implementation // 3 | // Copyright (c) 2023 Electronic Arts Inc. All rights reserved. // 4 | /////////////////////////////////////////////////////////////////////////////// 5 | 6 | // This file was created manually for DX12 unit tests, to write the logic for each unit test 7 | 8 | #pragma once 9 | 10 | #include 11 | 12 | namespace DX12Utils 13 | { 14 | 15 | namespace ParseCSV 16 | { 17 | inline bool IsNewLine(char c) 18 | { 19 | return c == '\r' || c == '\n'; 20 | } 21 | 22 | inline bool IsWhiteSpace(char c) 23 | { 24 | return c == ' ' || c == '\t'; 25 | } 26 | 27 | inline bool IsQuote(char c) 28 | { 29 | return c == '\'' || c == '\"'; 30 | } 31 | 32 | inline std::string_view SkipToNewLine(const std::string_view& string) 33 | { 34 | // Skip forward until a new line or null 35 | int i = 0; 36 | while (string[i] && !IsNewLine(string[i])) 37 | i++; 38 | 39 | // Skip forward until not a new line 40 | while (IsNewLine(string[i])) 41 | i++; 42 | 43 | return std::string_view(&string[i]); 44 | } 45 | 46 | inline bool GetNextToken(std::string_view& string, std::string_view& token) 47 | { 48 | if (string.length() == 0) 49 | return false; 50 | 51 | // go until newline, comma, or null 52 | int tokenEnd = 0; 53 | while (tokenEnd < string.length() && string[tokenEnd] != ',' && !IsNewLine(string[tokenEnd])) 54 | tokenEnd++; 55 | 56 | // Get the token 57 | token = string.substr(0, tokenEnd); 58 | 59 | // If we hit a comma, skip it. If we hit a newline, skip until a non newline. 60 | if (tokenEnd < string.length()) 61 | { 62 | if (string[tokenEnd] == ',') 63 | { 64 | tokenEnd++; 65 | } 66 | else if (IsNewLine(string[tokenEnd])) 67 | { 68 | while (tokenEnd < string.length() && IsNewLine(string[tokenEnd])) 69 | tokenEnd++; 70 | } 71 | } 72 | 73 | // remove the token from the string 74 | string.remove_prefix(tokenEnd); 75 | 76 | // Remove any white space from the front of the token 77 | // Also remove a quote if present 78 | { 79 | int i = 0; 80 | while (i < token.length() && IsWhiteSpace(token[i])) 81 | i++; 82 | if (i < token.length() && IsQuote(token[i])) 83 | i++; 84 | token.remove_prefix(i); 85 | } 86 | 87 | // Remove any white space from the back of the token 88 | // Also remove a quote if present 89 | { 90 | int i = (int)token.length() - 1; 91 | while (i > 0 && IsWhiteSpace(token[i])) 92 | i--; 93 | 94 | if (i > 0 && IsQuote(token[i])) 95 | i--; 96 | 97 | token.remove_suffix(token.length() - 1 - i); 98 | } 99 | 100 | return true; 101 | } 102 | 103 | template 104 | bool ForEachValue(const char* csv, bool skipHeader, const LAMBDA& lambda) 105 | { 106 | if (!csv) 107 | return true; 108 | 109 | std::string_view csvData = csv; 110 | if (skipHeader) 111 | csvData = SkipToNewLine(csvData); 112 | 113 | std::string_view token; 114 | std::string tokenS; 115 | int tokenIndex = 0; 116 | while (GetNextToken(csvData, token)) 117 | { 118 | tokenS = token; 119 | if (!lambda(tokenIndex, tokenS.c_str())) 120 | return false; 121 | tokenIndex++; 122 | } 123 | 124 | return true; 125 | } 126 | } 127 | 128 | }; // namespace DX12Utils -------------------------------------------------------------------------------- /fastnoise/DX12Utils/SRGB.h: -------------------------------------------------------------------------------- 1 | /////////////////////////////////////////////////////////////////////////////// 2 | // FastNoise - F.A.S.T. Sampling Implementation // 3 | // Copyright (c) 2023 Electronic Arts Inc. All rights reserved. // 4 | /////////////////////////////////////////////////////////////////////////////// 5 | 6 | #pragma once 7 | 8 | #include 9 | #include "SRGB.h" 10 | 11 | namespace DX12Utils 12 | { 13 | // adapted from https://github.com/TheRealMJP/BakingLab 14 | 15 | inline float SRGBToLinear(float color) 16 | { 17 | float x = color / 12.92f; 18 | float y = std::pow((color + 0.055f) / 1.055f, 2.4f); 19 | return color <= 0.04045f ? x : y; 20 | } 21 | 22 | inline float LinearTosRGB(float color) 23 | { 24 | float x = color * 12.92f; 25 | float y = std::pow(color, 1.0f / 2.4f) * 1.055f - 0.055f; 26 | return color < 0.0031308f ? x : y; 27 | } 28 | 29 | inline unsigned char SRGBToLinear(unsigned char color) 30 | { 31 | float f = float(color) / 255.0f; 32 | f = SRGBToLinear(f); 33 | f *= 255.0f; 34 | if (f < 0.0f) 35 | f = 0.0f; 36 | if (f > 255.0f) 37 | f = 255.0f; 38 | return (unsigned char)f; 39 | } 40 | 41 | inline unsigned char LinearTosRGB(unsigned char color) 42 | { 43 | float f = float(color) / 255.0f; 44 | f = LinearTosRGB(f); 45 | f *= 255.0f; 46 | if (f < 0.0f) 47 | f = 0.0f; 48 | if (f > 255.0f) 49 | f = 255.0f; 50 | return (unsigned char)f; 51 | } 52 | 53 | }; // namespace DX12Utils -------------------------------------------------------------------------------- /fastnoise/DX12Utils/TextureCache.h: -------------------------------------------------------------------------------- 1 | /////////////////////////////////////////////////////////////////////////////// 2 | // FastNoise - F.A.S.T. Sampling Implementation // 3 | // Copyright (c) 2023 Electronic Arts Inc. All rights reserved. // 4 | /////////////////////////////////////////////////////////////////////////////// 5 | 6 | #pragma once 7 | 8 | #include 9 | #include 10 | #include 11 | #include "SRGB.h" 12 | 13 | namespace DX12Utils 14 | { 15 | 16 | class TextureCache 17 | { 18 | public: 19 | enum class Type 20 | { 21 | U8, 22 | F32 23 | }; 24 | 25 | struct Texture 26 | { 27 | bool Valid() 28 | { 29 | return pixels.size() > 0; 30 | } 31 | 32 | int SizeOfPixel() const 33 | { 34 | return channels * SizeOfChannel(); 35 | } 36 | 37 | int SizeOfChannel() const 38 | { 39 | return (type == Type::F32) ? 4 : 1; 40 | } 41 | 42 | int width = 0; 43 | int height = 0; 44 | int channels = 0; 45 | Type type = Type::U8; 46 | std::vector pixels; 47 | std::string fileName; 48 | }; 49 | 50 | static Texture& Get(const char* fileName); 51 | 52 | static Texture GetAs(const char* fileName, bool sourceIsSRGB, Type desiredType, bool desiredSRGB, int desiredChannels = 0); 53 | 54 | static bool Remove(const char* fileName) 55 | { 56 | if (s_cache.count(fileName) == 0) 57 | return false; 58 | 59 | s_cache.erase(fileName); 60 | return true; 61 | } 62 | 63 | static void ClearCache() 64 | { 65 | std::unordered_map empty; 66 | std::swap(s_cache, empty); 67 | } 68 | 69 | private: 70 | TextureCache() {} // This is a static class 71 | 72 | static Texture s_invalidTexture; 73 | 74 | private: 75 | static std::unordered_map s_cache; 76 | }; 77 | 78 | }; // namespace DX12Utils -------------------------------------------------------------------------------- /fastnoise/DX12Utils/logfn.h: -------------------------------------------------------------------------------- 1 | /////////////////////////////////////////////////////////////////////////////// 2 | // FastNoise - F.A.S.T. Sampling Implementation // 3 | // Copyright (c) 2023 Electronic Arts Inc. All rights reserved. // 4 | /////////////////////////////////////////////////////////////////////////////// 5 | 6 | #pragma once 7 | 8 | enum class LogLevel : int 9 | { 10 | Info, 11 | Warn, 12 | Error 13 | }; 14 | using TLogFn = void (*)(LogLevel level, const char* msg, ...); 15 | -------------------------------------------------------------------------------- /fastnoise/DX12Utils/stb/LICENSE: -------------------------------------------------------------------------------- 1 | This software is available under 2 licenses -- choose whichever you prefer. 2 | ------------------------------------------------------------------------------ 3 | ALTERNATIVE A - MIT License 4 | Copyright (c) 2017 Sean Barrett 5 | Permission is hereby granted, free of charge, to any person obtaining a copy of 6 | this software and associated documentation files (the "Software"), to deal in 7 | the Software without restriction, including without limitation the rights to 8 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies 9 | of the Software, and to permit persons to whom the Software is furnished to do 10 | so, subject to the following conditions: 11 | The above copyright notice and this permission notice shall be included in all 12 | copies or substantial portions of the Software. 13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 19 | SOFTWARE. 20 | ------------------------------------------------------------------------------ 21 | ALTERNATIVE B - Public Domain (www.unlicense.org) 22 | This is free and unencumbered software released into the public domain. 23 | Anyone is free to copy, modify, publish, use, compile, sell, or distribute this 24 | software, either in source code form or as a compiled binary, for any purpose, 25 | commercial or non-commercial, and by any means. 26 | In jurisdictions that recognize copyright laws, the author or authors of this 27 | software dedicate any and all copyright interest in the software to the public 28 | domain. We make this dedication for the benefit of the public at large and to 29 | the detriment of our heirs and successors. We intend this dedication to be an 30 | overt act of relinquishment in perpetuity of all present and future rights to 31 | this software under copyright law. 32 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 33 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 34 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 35 | AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 36 | ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 37 | WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 38 | -------------------------------------------------------------------------------- /fastnoise/DX12Utils/tinyexr/deps/miniz/LICENSE: -------------------------------------------------------------------------------- 1 | Copyright 2013-2014 RAD Game Tools and Valve Software 2 | Copyright 2010-2014 Rich Geldreich and Tenacious Software LLC 3 | 4 | All Rights Reserved. 5 | 6 | Permission is hereby granted, free of charge, to any person obtaining a copy 7 | of this software and associated documentation files (the "Software"), to deal 8 | in the Software without restriction, including without limitation the rights 9 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | copies of the Software, and to permit persons to whom the Software is 11 | furnished to do so, subject to the following conditions: 12 | 13 | The above copyright notice and this permission notice shall be included in 14 | all copies or substantial portions of the Software. 15 | 16 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 22 | THE SOFTWARE. 23 | -------------------------------------------------------------------------------- /fastnoise/DX12Utils/tinyexr/deps/miniz/readme.md: -------------------------------------------------------------------------------- 1 | ## Miniz 2 | 3 | Miniz is a lossless, high performance data compression library in a single source file that implements the zlib (RFC 1950) and Deflate (RFC 1951) compressed data format specification standards. It supports the most commonly used functions exported by the zlib library, but is a completely independent implementation so zlib's licensing requirements do not apply. Miniz also contains simple to use functions for writing .PNG format image files and reading/writing/appending .ZIP format archives. Miniz's compression speed has been tuned to be comparable to zlib's, and it also has a specialized real-time compressor function designed to compare well against fastlz/minilzo. 4 | 5 | ## Usage 6 | 7 | Please use the files from the [releases page](https://github.com/richgel999/miniz/releases) in your projects. Do not use the git checkout directly! The different source and header files are [amalgamated](https://www.sqlite.org/amalgamation.html) into one `miniz.c`/`miniz.h` pair in a build step (`amalgamate.sh`). Include `miniz.c` and `miniz.h` in your project to use Miniz. 8 | 9 | ## Features 10 | 11 | * MIT licensed 12 | * A portable, single source and header file library written in plain C. Tested with GCC, clang and Visual Studio. 13 | * Easily tuned and trimmed down by defines 14 | * A drop-in replacement for zlib's most used API's (tested in several open source projects that use zlib, such as libpng and libzip). 15 | * Fills a single threaded performance vs. compression ratio gap between several popular real-time compressors and zlib. For example, at level 1, miniz.c compresses around 5-9% better than minilzo, but is approx. 35% slower. At levels 2-9, miniz.c is designed to compare favorably against zlib's ratio and speed. See the miniz performance comparison page for example timings. 16 | * Not a block based compressor: miniz.c fully supports stream based processing using a coroutine-style implementation. The zlib-style API functions can be called a single byte at a time if that's all you've got. 17 | * Easy to use. The low-level compressor (tdefl) and decompressor (tinfl) have simple state structs which can be saved/restored as needed with simple memcpy's. The low-level codec API's don't use the heap in any way. 18 | * Entire inflater (including optional zlib header parsing and Adler-32 checking) is implemented in a single function as a coroutine, which is separately available in a small (~550 line) source file: miniz_tinfl.c 19 | * A fairly complete (but totally optional) set of .ZIP archive manipulation and extraction API's. The archive functionality is intended to solve common problems encountered in embedded, mobile, or game development situations. (The archive API's are purposely just powerful enough to write an entire archiver given a bit of additional higher-level logic.) 20 | 21 | ## Known Problems 22 | 23 | * No support for encrypted archives. Not sure how useful this stuff is in practice. 24 | * Minimal documentation. The assumption is that the user is already familiar with the basic zlib API. I need to write an API wiki - for now I've tried to place key comments before each enum/API, and I've included 6 examples that demonstrate how to use the module's major features. 25 | 26 | ## Special Thanks 27 | 28 | Thanks to Alex Evans for the PNG writer function. Also, thanks to Paul Holden and Thorsten Scheuermann for feedback and testing, Matt Pritchard for all his encouragement, and Sean Barrett's various public domain libraries for inspiration (and encouraging me to write miniz.c in C, which was much more enjoyable and less painful than I thought it would be considering I've been programming in C++ for so long). 29 | 30 | Thanks to Bruce Dawson for reporting a problem with the level_and_flags archive API parameter (which is fixed in v1.12) and general feedback, and Janez Zemva for indirectly encouraging me into writing more examples. 31 | 32 | ## Patents 33 | 34 | I was recently asked if miniz avoids patent issues. miniz purposely uses the same core algorithms as the ones used by zlib. The compressor uses vanilla hash chaining as described [here](https://datatracker.ietf.org/doc/html/rfc1951#section-4). Also see the [gzip FAQ](https://web.archive.org/web/20160308045258/http://www.gzip.org/#faq11). In my opinion, if miniz falls prey to a patent attack then zlib/gzip are likely to be at serious risk too. 35 | -------------------------------------------------------------------------------- /fastnoise/Gigi/LICENSE.txt: -------------------------------------------------------------------------------- 1 | Copyright (c) 2023 Electronic Arts Inc. All rights reserved. 2 | 3 | Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 4 | 5 | 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 6 | 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 7 | 3. Neither the name of Electronic Arts, Inc. ("EA") nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. 8 | 9 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 10 | -------------------------------------------------------------------------------- /fastnoise/Gigi/Screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/fastnoise/Gigi/Screenshot.png -------------------------------------------------------------------------------- /fastnoise/Gigi/Technique.json: -------------------------------------------------------------------------------- 1 | { 2 | "Title":"Filter Adapted Spatiotemporal Sampling For Real Time Rendering", 3 | "Description":"The Gigi technique that was code generated to make the FAST noise generation command line utility. Not runable as is in the viewer, the command line utility calls this in a loop.", 4 | "Author":"Donnelly et al", 5 | "Tags":"compute,noise,utility", 6 | "Technique": "fastnoise.gg", 7 | "Website": "https://www.ea.com/seed/news/spatio-temporal-sampling", 8 | "Screenshot":"Screenshot.png", 9 | "License":"LICENSE.txt", 10 | "GigiVersion":"0.99b", 11 | } -------------------------------------------------------------------------------- /fastnoise/Gigi/fastnoise.gguser: -------------------------------------------------------------------------------- 1 | { 2 | "resourceViewType": 4, 3 | "resourceViewResourceIndex": 1, 4 | "importedResources": [ 5 | { 6 | "nodeName": "Filter", 7 | "isATexture": false, 8 | "buffer": { 9 | "type": "Int", 10 | "count": 20, 11 | "BLASOpaque": true 12 | } 13 | }, 14 | { 15 | "nodeName": "InitBuffer", 16 | "isATexture": false, 17 | "buffer": { 18 | "BLASOpaque": true 19 | } 20 | } 21 | ], 22 | "savedVariables": [ 23 | { 24 | "name": "TextureSize", 25 | "value": "0,64,1" 26 | }, 27 | { 28 | "name": "rngSeed", 29 | "value": "1338" 30 | }, 31 | { 32 | "name": "Iteration", 33 | "value": "0" 34 | }, 35 | { 36 | "name": "filterMin", 37 | "value": "0,0,0" 38 | }, 39 | { 40 | "name": "filterMax", 41 | "value": "0,0,0" 42 | }, 43 | { 44 | "name": "filterOffset", 45 | "value": "0,0,0" 46 | }, 47 | { 48 | "name": "swapSuppression", 49 | "value": "64" 50 | }, 51 | { 52 | "name": "filterX", 53 | "value": "0" 54 | }, 55 | { 56 | "name": "filterY", 57 | "value": "0" 58 | }, 59 | { 60 | "name": "filterZ", 61 | "value": "0" 62 | }, 63 | { 64 | "name": "filterXparams", 65 | "value": "1.000000,0.000000,0.000000,0.000000" 66 | }, 67 | { 68 | "name": "filterYparams", 69 | "value": "1.000000,0.000000,0.000000,0.000000" 70 | }, 71 | { 72 | "name": "filterZparams", 73 | "value": "1.000000,0.000000,0.000000,0.000000" 74 | }, 75 | { 76 | "name": "separate", 77 | "value": "false" 78 | }, 79 | { 80 | "name": "separateWeight", 81 | "value": "0.500000" 82 | }, 83 | { 84 | "name": "sampleSpace", 85 | "value": "0" 86 | }, 87 | { 88 | "name": "sampleDistribution", 89 | "value": "0" 90 | }, 91 | { 92 | "name": "key", 93 | "value": "0,0,0,0" 94 | }, 95 | { 96 | "name": "scrambleBits", 97 | "value": "0" 98 | }, 99 | { 100 | "name": "InitFromBuffer", 101 | "value": "false" 102 | } 103 | ] 104 | } -------------------------------------------------------------------------------- /fastnoise/Gigi/fastnoise.hlsl: -------------------------------------------------------------------------------- 1 | 2 | 3 | uint wang_hash_init(uint3 seed) 4 | { 5 | return uint(seed.x * uint(1973) + seed.y * uint(9277) + seed.z * uint(26699)) | uint(1); 6 | } 7 | 8 | uint wang_hash_uint(inout uint seed) 9 | { 10 | seed = uint(seed ^ uint(61)) ^ uint(seed >> uint(16)); 11 | seed *= uint(9); 12 | seed = seed ^ (seed >> 4); 13 | seed *= uint(0x27d4eb2d); 14 | seed = seed ^ (seed >> 15); 15 | return seed; 16 | } 17 | 18 | float wang_hash_float01(inout uint state) 19 | { 20 | return float(wang_hash_uint(state) & 0x00FFFFFF) / float(0x01000000); 21 | } 22 | 23 | uint roundFunction(uint subkey, uint r) 24 | { 25 | uint seed = subkey ^ r; 26 | return wang_hash_uint(seed); 27 | } 28 | 29 | // Permutes xy components of the index based on a random "key" 30 | // bits is the number of bits to scramble 31 | uint3 getOtherIndex(uint3 index, uint4 key, uint bits) 32 | { 33 | uint mask = (1 << bits) - 1; 34 | uint2 lr = index.xy & mask; 35 | uint2 highIndex = index.xy & ~mask; 36 | 37 | // Use other bits as part of randomization 38 | key ^= index.zzzz ^ highIndex.xyxy; 39 | 40 | // 3 round Feistel network 41 | lr = lr.yx ^ uint2(0, roundFunction(key.x, lr.y) & mask); 42 | lr = lr.yx ^ uint2(0, roundFunction(key.y, lr.y) & mask); 43 | lr = lr.yx ^ uint2(0, roundFunction(key.z, lr.y) & mask); 44 | 45 | // XOR with the final component of the key 46 | lr ^= uint2(key.w >> bits, key.w) & mask; 47 | 48 | // 3 round Feistel network - inverse 49 | lr = lr.yx ^ uint2(roundFunction(key.z, lr.x) & mask, 0); 50 | lr = lr.yx ^ uint2(roundFunction(key.y, lr.x) & mask, 0); 51 | lr = lr.yx ^ uint2(roundFunction(key.x, lr.x) & mask, 0); 52 | 53 | return uint3(highIndex | lr, index.z); 54 | } 55 | 56 | 57 | float2 squareToDiskPolar(float2 u) 58 | { 59 | float2 rTheta; 60 | if (u.x == 0 && u.y == 0) 61 | rTheta = float2(0, 0); 62 | 63 | float r, theta; 64 | if (abs(u.x) > abs(u.y)) 65 | { 66 | rTheta.x = u.x; 67 | rTheta.y = 0.78539816339f * (u.y / u.x); 68 | } 69 | else 70 | { 71 | rTheta.x = u.y; 72 | rTheta.y = 1.57079632679f - 0.78539816339f * (u.x / u.y); 73 | } 74 | return rTheta; 75 | } 76 | 77 | // Split a single uint into pieces with different numbers of bits in each component 78 | uint2 splitBits(uint x, uint2 bits) 79 | { 80 | return (x >> uint2(bits.y, 0)) & ((1 << bits) - 1); 81 | } 82 | 83 | uint3 splitBits(uint x, uint3 bits) 84 | { 85 | return (x >> uint3(bits.y + bits.z, bits.z, 0)) & ((1 << bits) - 1); 86 | } 87 | 88 | uint4 splitBits(uint x, uint4 bits) 89 | { 90 | return (x >> uint4(bits.y + bits.z + bits.w, bits.z + bits.w, bits.w, 0)) & ((1 << bits) - 1); 91 | } 92 | 93 | 94 | 95 | // Scramble low 4 bits of both components of x using multiplication by a 96 | // TODO: generalize to 3D and variable number of low bits 97 | uint2 scramble(uint2 x, uint a) 98 | { 99 | //Put low bits of x into a single number 100 | uint n = ((x.x & 0xF) << 4) | (x.y & 0xF); 101 | 102 | // Multiply by a mod 2^8 103 | uint m = (n * a) & 0xFF; 104 | 105 | // Keep high bits of x, but use lower bits of m 106 | uint2 y = x & uint2(0xFFFFFFF0, 0xFFFFFFF0); 107 | y.x |= (m >> 4) & 0xF; 108 | y.y |= (m & 0xF); 109 | return y; 110 | } 111 | -------------------------------------------------------------------------------- /fastnoise/Gigi/loss.hlsl: -------------------------------------------------------------------------------- 1 | /*$(ShaderResources)*/ 2 | 3 | #include "fastnoise.hlsl" 4 | 5 | // Evaluate the two-point function 6 | float K2(float4 x, float4 y) 7 | { 8 | float K = 0.0f; 9 | if (/*$(Variable:sampleSpace)*/ == SampleSpace::Real) 10 | { 11 | K = -abs(x.x - y.x); 12 | } 13 | else if (/*$(Variable:sampleSpace)*/ == SampleSpace::Circle) 14 | { 15 | K = -min(abs(x.x - y.x), min(abs(x.x - y.x + 1.0f), abs(x.x - y.x - 1.0f))); 16 | } 17 | else if (/*$(Variable:sampleSpace)*/ == SampleSpace::Vector2) 18 | { 19 | K = -length(x.xy - y.xy); 20 | } 21 | else if (/*$(Variable:sampleSpace)*/ == SampleSpace::Vector3) 22 | { 23 | K = -length(x.xyz - y.xyz); 24 | } 25 | else if (/*$(Variable:sampleSpace)*/ == SampleSpace::Vector4) 26 | { 27 | K = -length(x - y); 28 | } 29 | else if (/*$(Variable:sampleSpace)*/ == SampleSpace::Sphere) 30 | { 31 | K = -acos(saturate(dot(2*x.xyz-1, 2*y.xyz-1))); 32 | } 33 | 34 | return K; 35 | } 36 | 37 | float combineFilter(int3 index, float filterX, float filterY, float filterZ) 38 | { 39 | float F = 0.0f; 40 | if (/*$(Variable:separate)*/) 41 | { 42 | if (index.z == 0) 43 | { 44 | F += filterX * filterY* /*$(Variable:separateWeight)*/; 45 | } 46 | if (index.x == 0 && index.y == 0) 47 | { 48 | F += filterZ* (1.0f - /*$(Variable:separateWeight)*/); 49 | } 50 | } 51 | else 52 | { 53 | F = filterX * filterY * filterZ; 54 | } 55 | return F; 56 | } 57 | 58 | // Currently 3D box filter 59 | float doubledFilter(int3 i, int3 filterMin, int3 filterMax, int3 filterOffset) 60 | { 61 | float3 filter = 0.0f; 62 | if (i.x >= filterMin.x && i.x <= filterMax.x) 63 | { 64 | filter.x = Filter[i.x + filterOffset.x]; 65 | } 66 | if (i.y >= filterMin.y && i.y <= filterMax.y) 67 | { 68 | filter.y = Filter[i.y + filterOffset.y]; 69 | } 70 | if (i.z >= filterMin.z && i.z <= filterMax.z) 71 | { 72 | filter.z = Filter[i.z + filterOffset.z]; 73 | } 74 | return combineFilter(i, filter.x, filter.y, filter.z); 75 | } 76 | 77 | /*$(_compute:Loss)*/(uint3 DTid : SV_DispatchThreadID) 78 | { 79 | int3 index = DTid; 80 | float4 currentValue = SampleTexture[index]; 81 | 82 | int3 otherIndex = getOtherIndex(index, /*$(Variable:key)*/, /*$(Variable:scrambleBits)*/); 83 | float4 otherValue = SampleTexture[otherIndex]; 84 | 85 | uint3 textureSize = /*$(Variable:TextureSize)*/; 86 | 87 | int3 filterMin = /*$(Variable:filterMin)*/; 88 | int3 filterMax = /*$(Variable:filterMax)*/; 89 | int3 filterOffset = /*$(Variable:filterOffset)*/; 90 | 91 | float deltaLoss = 0.0f; 92 | 93 | for (int i = filterMin.x; i <= filterMax.x; ++i) 94 | { 95 | float filterX = Filter[i + filterOffset.x]; 96 | 97 | for (int j = filterMin.y; j <= filterMax.y; ++j) 98 | { 99 | float filterY = Filter[j + filterOffset.y]; 100 | 101 | for (int k = filterMin.z; k <= filterMax.z; ++k) { 102 | 103 | float filterZ = Filter[k + filterOffset.z]; 104 | 105 | float F = combineFilter(int3(i, j, k), filterX, filterY, filterZ); 106 | 107 | float4 neighbourValue = SampleTexture[uint3(index + int3(i, j, k)) % textureSize]; 108 | deltaLoss += F * (K2(otherValue, neighbourValue) - K2(currentValue, neighbourValue)); 109 | 110 | } 111 | } 112 | } 113 | 114 | // Wrap indices 115 | int3 dij = min(abs(index - otherIndex), min(abs(index - otherIndex - int3(textureSize)), abs(index - otherIndex + int3(textureSize)))); 116 | float Fij = doubledFilter(dij, filterMin, filterMax, filterOffset); 117 | float Fii = doubledFilter(int3(0, 0, 0), filterMin, filterMax, filterOffset); 118 | 119 | deltaLoss += (Fij - Fii) * K2(currentValue, otherValue); 120 | 121 | LossTexture[index] = deltaLoss; 122 | 123 | } 124 | -------------------------------------------------------------------------------- /fastnoise/Gigi/process.hlsl: -------------------------------------------------------------------------------- 1 | /*$(ShaderResources)*/ 2 | 3 | uint wang_hash_init(uint3 seed) 4 | { 5 | return uint(seed.x * uint(1973) + seed.y * uint(9277) + seed.z * uint(26699)) | uint(1); 6 | } 7 | 8 | uint wang_hash_uint(inout uint seed) 9 | { 10 | seed = uint(seed ^ uint(61)) ^ uint(seed >> uint(16)); 11 | seed *= uint(9); 12 | seed = seed ^ (seed >> 4); 13 | seed *= uint(0x27d4eb2d); 14 | seed = seed ^ (seed >> 15); 15 | return seed; 16 | } 17 | 18 | float wang_hash_float01(inout uint state) 19 | { 20 | return float(wang_hash_uint(state) & 0x00FFFFFF) / float(0x01000000); 21 | } 22 | 23 | /*$(_compute:Process)*/(uint3 DTid : SV_DispatchThreadID) 24 | { 25 | float4 input = Texture[DTid.xy]; 26 | 27 | // use the iteration index as the per pixel rng seed to get different random numbers each iteration 28 | uint rng = wang_hash_init(uint3(DTid.xy, /*$(Variable:Iteration)*/)); 29 | 30 | // as a test, monte carlo integrate some noise 31 | Texture[DTid.xy] = lerp(input.rgba, float4(wang_hash_float01(rng), wang_hash_float01(rng), 0.0f, 1.0f), 1.0f / float(1+/*$(Variable:Iteration)*/)); 32 | 33 | // Sum up the iteration values. Do this so we can see the value on the CPU to see how to shuttle data back from GPU to CPU 34 | if (DTid.x == 0 && DTid.y == 0) 35 | Data[0].iterationSum = Data[0].iterationSum + /*$(Variable:Iteration)*/; 36 | } 37 | -------------------------------------------------------------------------------- /fastnoise/Gigi/swap.hlsl: -------------------------------------------------------------------------------- 1 | /*$(ShaderResources)*/ 2 | 3 | #include "fastnoise.hlsl" 4 | 5 | /*$(_compute:Swap)*/(uint3 DTid : SV_DispatchThreadID) 6 | { 7 | // 1. Total loss for the swap is sum of loss texture at source and destination 8 | uint3 index = DTid; 9 | uint3 otherIndex = getOtherIndex(index, /*$(Variable:key)*/, /*$(Variable:scrambleBits)*/); 10 | 11 | float loss = LossTexture[index] + LossTexture[otherIndex]; 12 | 13 | // 2. Only one out of each pair does the swap, so check if we have the lower index 14 | int3 textureSize = /*$(Variable:TextureSize)*/; 15 | uint3 flatten = uint3(textureSize.y * textureSize.z, textureSize.z, 1); 16 | bool lesser = dot(flatten, index) < dot(flatten, otherIndex); 17 | 18 | // 3. Only do swap a fraction of the time, this helps convergence in the early iterations 19 | // TODO: We should adjust this based on the number of swaps - if it's above a threshold, then don't execute the swap 20 | 21 | 22 | uint iteration = /*$(Variable:Iteration)*/; 23 | uint randomSeed = wang_hash_init(DTid + iteration); 24 | uint randomValue = wang_hash_uint(randomSeed); 25 | uint swapSuppression = /*$(Variable:swapSuppression)*/; 26 | bool swapCheck = (randomValue % swapSuppression) == 0; 27 | 28 | if (lesser && loss < 0 && swapCheck) 29 | { 30 | float4 value = SampleTexture[index]; 31 | float4 otherValue = SampleTexture[otherIndex]; 32 | SampleTexture[index] = otherValue; 33 | SampleTexture[otherIndex] = value; 34 | 35 | uint oldSwaps; 36 | InterlockedAdd(Data[0].swaps, 1, oldSwaps); 37 | 38 | } 39 | 40 | // Output debugging info to a texture 41 | // Should have equal numbers of red and green pixels 42 | //float4 debugValue = 0.0f; 43 | //if (loss < 0) { 44 | // debugValue = float4(lesser, 1 - lesser, -loss, 1.0f); 45 | //} 46 | //float4 debugValue = float4(loss, loss, loss, 1.0f); 47 | //SwapDebug[index] = debugValue; 48 | 49 | // DEBUG: check that this defines an involution 50 | //uint2 otherOtherIndex = scramble(scramble(otherIndex, a) ^ uint2(0, 1), b); 51 | //SwapDebug[index] = float4(otherOtherIndex, 0.0f, 1.0f); 52 | 53 | } 54 | -------------------------------------------------------------------------------- /fastnoise/public/all.h: -------------------------------------------------------------------------------- 1 | /////////////////////////////////////////////////////////////////////////////// 2 | // FastNoise - F.A.S.T. Sampling Implementation // 3 | // Copyright (c) 2023 Electronic Arts Inc. All rights reserved. // 4 | /////////////////////////////////////////////////////////////////////////////// 5 | 6 | #pragma once 7 | 8 | #include "./technique.h" 9 | #include "./imgui.h" 10 | #include "./pythoninterface.h" 11 | -------------------------------------------------------------------------------- /fastnoise/public/imgui.h: -------------------------------------------------------------------------------- 1 | /////////////////////////////////////////////////////////////////////////////// 2 | // FastNoise - F.A.S.T. Sampling Implementation // 3 | // Copyright (c) 2023 Electronic Arts Inc. All rights reserved. // 4 | /////////////////////////////////////////////////////////////////////////////// 5 | 6 | #pragma once 7 | 8 | #include "technique.h" 9 | 10 | namespace fastnoise 11 | { 12 | inline void ShowToolTip(const char* tooltip) 13 | { 14 | if (!tooltip || !tooltip[0]) 15 | return; 16 | 17 | ImGui::SameLine(); 18 | ImGui::PushStyleColor(ImGuiCol_Text, IM_COL32(255, 255, 0, 255)); 19 | ImGui::Text("[?]"); 20 | ImGui::PopStyleColor(); 21 | if (ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenDisabled)) 22 | ImGui::SetTooltip("%s", tooltip); 23 | } 24 | 25 | void MakeUI(Context* context, ID3D12CommandQueue* commandQueue) 26 | { 27 | ImGui::PushID("gigi_fastnoise"); 28 | 29 | { 30 | float width = ImGui::GetContentRegionAvail().x / 6.0f; 31 | ImGui::PushID("filterXparams"); 32 | ImGui::PushItemWidth(width); 33 | ImGui::InputFloat("##X", &context->m_input.variable_filterXparams[0]); 34 | ImGui::SameLine(); 35 | ImGui::InputFloat("##Y", &context->m_input.variable_filterXparams[1]); 36 | ImGui::SameLine(); 37 | ImGui::InputFloat("##Z", &context->m_input.variable_filterXparams[2]); 38 | ImGui::SameLine(); 39 | ImGui::InputFloat("##W", &context->m_input.variable_filterXparams[3]); 40 | ImGui::SameLine(); 41 | ImGui::Text("filterXparams"); 42 | ImGui::PopItemWidth(); 43 | ImGui::PopID(); 44 | ShowToolTip(""); 45 | } 46 | { 47 | float width = ImGui::GetContentRegionAvail().x / 6.0f; 48 | ImGui::PushID("filterYparams"); 49 | ImGui::PushItemWidth(width); 50 | ImGui::InputFloat("##X", &context->m_input.variable_filterYparams[0]); 51 | ImGui::SameLine(); 52 | ImGui::InputFloat("##Y", &context->m_input.variable_filterYparams[1]); 53 | ImGui::SameLine(); 54 | ImGui::InputFloat("##Z", &context->m_input.variable_filterYparams[2]); 55 | ImGui::SameLine(); 56 | ImGui::InputFloat("##W", &context->m_input.variable_filterYparams[3]); 57 | ImGui::SameLine(); 58 | ImGui::Text("filterYparams"); 59 | ImGui::PopItemWidth(); 60 | ImGui::PopID(); 61 | ShowToolTip(""); 62 | } 63 | { 64 | float width = ImGui::GetContentRegionAvail().x / 6.0f; 65 | ImGui::PushID("filterZparams"); 66 | ImGui::PushItemWidth(width); 67 | ImGui::InputFloat("##X", &context->m_input.variable_filterZparams[0]); 68 | ImGui::SameLine(); 69 | ImGui::InputFloat("##Y", &context->m_input.variable_filterZparams[1]); 70 | ImGui::SameLine(); 71 | ImGui::InputFloat("##Z", &context->m_input.variable_filterZparams[2]); 72 | ImGui::SameLine(); 73 | ImGui::InputFloat("##W", &context->m_input.variable_filterZparams[3]); 74 | ImGui::SameLine(); 75 | ImGui::Text("filterZparams"); 76 | ImGui::PopItemWidth(); 77 | ImGui::PopID(); 78 | ShowToolTip(""); 79 | } 80 | ImGui::Checkbox("separate", &context->m_input.variable_separate); 81 | ShowToolTip("Whether to use "separate" mode, which makes STBN-style samples"); 82 | ImGui::InputFloat("separateWeight", &context->m_input.variable_separateWeight); 83 | ShowToolTip("If "separate" is true, the weight for blending between temporal and spatial filter"); 84 | { 85 | static const char* labels[] = { 86 | "Real", 87 | "Circle", 88 | "Vector2", 89 | "Vector3", 90 | "Vector4", 91 | "Sphere", 92 | }; 93 | ImGui::Combo("sampleSpace", (int*)&context->m_input.variable_sampleSpace, labels, 6); 94 | ShowToolTip(""); 95 | } 96 | { 97 | static const char* labels[] = { 98 | "Uniform1D", 99 | "Gauss1D", 100 | "Tent1D", 101 | "Uniform2D", 102 | "Uniform3D", 103 | "Uniform4D", 104 | "UniformSphere", 105 | "UniformHemisphere", 106 | "CosineHemisphere", 107 | }; 108 | ImGui::Combo("sampleDistribution", (int*)&context->m_input.variable_sampleDistribution, labels, 9); 109 | ShowToolTip(""); 110 | } 111 | 112 | ImGui::Checkbox("Profile", &context->m_profile); 113 | if (context->m_profile) 114 | { 115 | int numEntries = 0; 116 | const ProfileEntry* entries = context->ReadbackProfileData(commandQueue, numEntries); 117 | if (ImGui::BeginTable("profiling", 3, ImGuiTableFlags_Borders | ImGuiTableFlags_RowBg)) 118 | { 119 | ImGui::TableSetupColumn("Label"); 120 | ImGui::TableSetupColumn("CPU ms"); 121 | ImGui::TableSetupColumn("GPU ms"); 122 | ImGui::TableHeadersRow(); 123 | float totalCpu = 0.0f; 124 | float totalGpu = 0.0f; 125 | for (int entryIndex = 0; entryIndex < numEntries; ++entryIndex) 126 | { 127 | ImGui::TableNextRow(); 128 | ImGui::TableNextColumn(); 129 | ImGui::TextUnformatted(entries[entryIndex].m_label); 130 | ImGui::TableNextColumn(); 131 | ImGui::Text("%0.3f", entries[entryIndex].m_cpu * 1000.0f); 132 | ImGui::TableNextColumn(); 133 | ImGui::Text("%0.3f", entries[entryIndex].m_gpu * 1000.0f); 134 | totalCpu += entries[entryIndex].m_cpu; 135 | totalGpu += entries[entryIndex].m_gpu; 136 | } 137 | ImGui::EndTable(); 138 | } 139 | } 140 | 141 | ImGui::PopID(); 142 | } 143 | }; 144 | -------------------------------------------------------------------------------- /fastnoise/readme.txt: -------------------------------------------------------------------------------- 1 | Here are the instructions for how to use this package in a dx12 application 2 | 3 | ===================================================================================================== 4 | 1) Add the code files to your project: private, public, DX12Utils 5 | ===================================================================================================== 6 | 7 | ===================================================================================================== 8 | 2) Include the public/technique.h file where you want to interact with the technique from 9 | as well as the public/imgui.h and public/pythoninterface.h file if you want that functionality. 10 | ===================================================================================================== 11 | 12 | ===================================================================================================== 13 | 3) Create 0 or more contexts at initialization or other times. Member variables are a good place to 14 | store them. 15 | ===================================================================================================== 16 | 17 | fastnoise::Context *m_fastnoiseContext = nullptr; 18 | 19 | m_fastnoiseContext = fastnoise::CreateContext(device); 20 | 21 | ===================================================================================================== 22 | 4) Call OnNewFrame at the beginning of your frame. 23 | ===================================================================================================== 24 | 25 | fastnoise::OnNewFrame(FramesInFlight) 26 | 27 | FramesInFlight is the number of buffered frames in your application, which the technique uses to 28 | know when temporary resources are no longer used and can safely be released. 29 | 30 | ===================================================================================================== 31 | 5) Destroy each context at some point before application exit. 32 | ===================================================================================================== 33 | 34 | fastnoise::DestroyContext(m_fastnoiseContext); 35 | 36 | ===================================================================================================== 37 | 6) Ensure that the technique has the right path to the root folder of the technique, to find 38 | assets and shaders. 39 | ===================================================================================================== 40 | 41 | // By default this is set to L"./", so only need to set it if that is not right 42 | fastnoise::Context::s_techniqueLocation = L"./" 43 | 44 | ===================================================================================================== 45 | 7) Call execute on each context 0 or more times per frame, giving inputs and using outputs. 46 | ===================================================================================================== 47 | 48 | // You should fill out everything in this struct before calling Execute 49 | m_fastnoise.m_input. 50 | 51 | fastnoise::Execute(m_fastnoise, m_device, m_commandList); 52 | 53 | ===================================================================================================== 54 | 8) Handle Assets 55 | ===================================================================================================== 56 | 57 | The assets folder contains any assets the technique needs, such as textures. 58 | 59 | Those need to be loaded and provided to the technique via the context input structure as appropriate. 60 | 61 | Resources loaded by the technique (such as those declared in shaders) will happen within the generated 62 | technique code and do not need to be loaded manually. 63 | 64 | ===================================================================================================== 65 | 9) Optional: Hook up a custom log function to get notifications of internal errors and warnings 66 | ===================================================================================================== 67 | 68 | void CustomLogFn(LogLevel level, const char* msg, ...) 69 | { 70 | } 71 | 72 | fastnoise::Context::LogFn = &CustomLogFn; 73 | 74 | you can do similar for perf markers (like for pix) by overriding these: 75 | 76 | fastnoise::Context::PerfEventBeginFn 77 | fastnoise::Context::PerfEventEndFn 78 | 79 | ===================================================================================================== 80 | 10) Optional: Hook up imgui for automatic UI of technique inputs 81 | ===================================================================================================== 82 | 83 | if (m_fastnoise && ImGui::CollapsingHeader("fastnoise")) 84 | outline::MakeUI(m_fastnoise); 85 | 86 | ===================================================================================================== 87 | 11) Optional: Hook up python 88 | ===================================================================================================== 89 | 90 | PyImport_AppendInittab("fastnoise", fastnoise::CreateModule); 91 | 92 | in the python module, you will need to "import fastnoise", and when will be able to set user exposed 93 | variables like: 94 | 95 | fastnoise.Set_(); 96 | -------------------------------------------------------------------------------- /fastnoise/shaders/fastnoise.hlsl: -------------------------------------------------------------------------------- 1 | /////////////////////////////////////////////////////////////////////////////// 2 | // FastNoise - F.A.S.T. Sampling Implementation // 3 | // Copyright (c) 2023 Electronic Arts Inc. All rights reserved. // 4 | /////////////////////////////////////////////////////////////////////////////// 5 | 6 | uint wang_hash_init(uint3 seed) 7 | { 8 | return uint(seed.x * uint(1973) + seed.y * uint(9277) + seed.z * uint(26699)) | uint(1); 9 | } 10 | 11 | uint wang_hash_uint(inout uint seed) 12 | { 13 | seed = uint(seed ^ uint(61)) ^ uint(seed >> uint(16)); 14 | seed *= uint(9); 15 | seed = seed ^ (seed >> 4); 16 | seed *= uint(0x27d4eb2d); 17 | seed = seed ^ (seed >> 15); 18 | return seed; 19 | } 20 | 21 | float wang_hash_float01(inout uint state) 22 | { 23 | return float(wang_hash_uint(state) & 0x00FFFFFF) / float(0x01000000); 24 | } 25 | 26 | uint roundFunction(uint subkey, uint r) 27 | { 28 | uint seed = subkey ^ r; 29 | return wang_hash_uint(seed); 30 | } 31 | 32 | // Permutes xy components of the index based on a random "key" 33 | // bits is the number of bits to scramble 34 | uint3 getOtherIndex(uint3 index, uint4 key, uint bits) 35 | { 36 | uint mask = (1 << bits) - 1; 37 | uint2 lr = index.xy & mask; 38 | uint2 highIndex = index.xy & ~mask; 39 | 40 | // Use other bits as part of randomization 41 | key ^= index.zzzz ^ highIndex.xyxy; 42 | 43 | // 3 round Feistel network 44 | lr = lr.yx ^ uint2(0, roundFunction(key.x, lr.y) & mask); 45 | lr = lr.yx ^ uint2(0, roundFunction(key.y, lr.y) & mask); 46 | lr = lr.yx ^ uint2(0, roundFunction(key.z, lr.y) & mask); 47 | 48 | // XOR with the final component of the key 49 | lr ^= uint2(key.w >> bits, key.w) & mask; 50 | 51 | // 3 round Feistel network - inverse 52 | lr = lr.yx ^ uint2(roundFunction(key.z, lr.x) & mask, 0); 53 | lr = lr.yx ^ uint2(roundFunction(key.y, lr.x) & mask, 0); 54 | lr = lr.yx ^ uint2(roundFunction(key.x, lr.x) & mask, 0); 55 | 56 | return uint3(highIndex | lr, index.z); 57 | } 58 | 59 | 60 | float2 squareToDiskPolar(float2 u) 61 | { 62 | float2 rTheta; 63 | if (u.x == 0 && u.y == 0) 64 | rTheta = float2(0, 0); 65 | 66 | float r, theta; 67 | if (abs(u.x) > abs(u.y)) 68 | { 69 | rTheta.x = u.x; 70 | rTheta.y = 0.78539816339f * (u.y / u.x); 71 | } 72 | else 73 | { 74 | rTheta.x = u.y; 75 | rTheta.y = 1.57079632679f - 0.78539816339f * (u.x / u.y); 76 | } 77 | return rTheta; 78 | } 79 | 80 | // Split a single uint into pieces with different numbers of bits in each component 81 | uint2 splitBits(uint x, uint2 bits) 82 | { 83 | return (x >> uint2(bits.y, 0)) & ((1 << bits) - 1); 84 | } 85 | 86 | uint3 splitBits(uint x, uint3 bits) 87 | { 88 | return (x >> uint3(bits.y + bits.z, bits.z, 0)) & ((1 << bits) - 1); 89 | } 90 | 91 | uint4 splitBits(uint x, uint4 bits) 92 | { 93 | return (x >> uint4(bits.y + bits.z + bits.w, bits.z + bits.w, bits.w, 0)) & ((1 << bits) - 1); 94 | } 95 | 96 | 97 | 98 | // Scramble low 4 bits of both components of x using multiplication by a 99 | // TODO: generalize to 3D and variable number of low bits 100 | uint2 scramble(uint2 x, uint a) 101 | { 102 | //Put low bits of x into a single number 103 | uint n = ((x.x & 0xF) << 4) | (x.y & 0xF); 104 | 105 | // Multiply by a mod 2^8 106 | uint m = (n * a) & 0xFF; 107 | 108 | // Keep high bits of x, but use lower bits of m 109 | uint2 y = x & uint2(0xFFFFFFF0, 0xFFFFFFF0); 110 | y.x |= (m >> 4) & 0xF; 111 | y.y |= (m & 0xF); 112 | return y; 113 | } 114 | -------------------------------------------------------------------------------- /fastnoise/shaders/loss.hlsl: -------------------------------------------------------------------------------- 1 | /////////////////////////////////////////////////////////////////////////////// 2 | // FastNoise - F.A.S.T. Sampling Implementation // 3 | // Copyright (c) 2023 Electronic Arts Inc. All rights reserved. // 4 | /////////////////////////////////////////////////////////////////////////////// 5 | 6 | struct FilterType 7 | { 8 | static const int Box = 0; 9 | static const int Gaussian = 1; 10 | static const int Binomial = 2; 11 | static const int Exponential = 3; 12 | static const int WeightedExponential = 4; 13 | }; 14 | 15 | struct SampleSpace 16 | { 17 | static const int Real = 0; 18 | static const int Circle = 1; 19 | static const int Vector2 = 2; 20 | static const int Vector3 = 3; 21 | static const int Vector4 = 4; 22 | static const int Sphere = 5; 23 | }; 24 | 25 | struct SampleDistribution 26 | { 27 | static const int Uniform1D = 0; 28 | static const int Gauss1D = 1; 29 | static const int Tent1D = 2; 30 | static const int Uniform2D = 3; 31 | static const int Uniform3D = 4; 32 | static const int Uniform4D = 5; 33 | static const int UniformSphere = 6; 34 | static const int UniformHemisphere = 7; 35 | static const int CosineHemisphere = 8; 36 | }; 37 | 38 | struct Struct__LossCB 39 | { 40 | uint3 TextureSize; 41 | float _padding0; 42 | int3 filterMax; 43 | float _padding1; 44 | int3 filterMin; 45 | float _padding2; 46 | int3 filterOffset; 47 | float _padding3; 48 | uint4 key; 49 | int sampleSpace; 50 | uint scrambleBits; 51 | uint separate; 52 | float separateWeight; 53 | }; 54 | 55 | RWTexture3D LossTexture : register(u0); 56 | Buffer Filter : register(t0); 57 | Texture3D SampleTexture : register(t1); 58 | ConstantBuffer _LossCB : register(b0); 59 | 60 | #line 1 61 | 62 | 63 | #include "fastnoise.hlsl" 64 | 65 | // Evaluate the two-point function 66 | float K2(float4 x, float4 y) 67 | { 68 | float K = 0.0f; 69 | if (_LossCB.sampleSpace == SampleSpace::Real) 70 | { 71 | K = -abs(x.x - y.x); 72 | } 73 | else if (_LossCB.sampleSpace == SampleSpace::Circle) 74 | { 75 | K = -min(abs(x.x - y.x), min(abs(x.x - y.x + 1.0f), abs(x.x - y.x - 1.0f))); 76 | } 77 | else if (_LossCB.sampleSpace == SampleSpace::Vector2) 78 | { 79 | K = -length(x.xy - y.xy); 80 | } 81 | else if (_LossCB.sampleSpace == SampleSpace::Vector3) 82 | { 83 | K = -length(x.xyz - y.xyz); 84 | } 85 | else if (_LossCB.sampleSpace == SampleSpace::Vector4) 86 | { 87 | K = -length(x - y); 88 | } 89 | else if (_LossCB.sampleSpace == SampleSpace::Sphere) 90 | { 91 | K = -acos(saturate(dot(2*x.xyz-1, 2*y.xyz-1))); 92 | } 93 | 94 | return K; 95 | } 96 | 97 | float combineFilter(int3 index, float filterX, float filterY, float filterZ) 98 | { 99 | float F = 0.0f; 100 | if (_LossCB.separate) 101 | { 102 | if (index.z == 0) 103 | { 104 | F += filterX * filterY* _LossCB.separateWeight; 105 | } 106 | if (index.x == 0 && index.y == 0) 107 | { 108 | F += filterZ* (1.0f - _LossCB.separateWeight); 109 | } 110 | } 111 | else 112 | { 113 | F = filterX * filterY * filterZ; 114 | } 115 | return F; 116 | } 117 | 118 | // Currently 3D box filter 119 | float doubledFilter(int3 i, int3 filterMin, int3 filterMax, int3 filterOffset) 120 | { 121 | float3 filter = 0.0f; 122 | if (i.x >= filterMin.x && i.x <= filterMax.x) 123 | { 124 | filter.x = Filter[i.x + filterOffset.x]; 125 | } 126 | if (i.y >= filterMin.y && i.y <= filterMax.y) 127 | { 128 | filter.y = Filter[i.y + filterOffset.y]; 129 | } 130 | if (i.z >= filterMin.z && i.z <= filterMax.z) 131 | { 132 | filter.z = Filter[i.z + filterOffset.z]; 133 | } 134 | return combineFilter(i, filter.x, filter.y, filter.z); 135 | } 136 | 137 | [numthreads(8, 8, 1)] 138 | #line 77 139 | void Loss(uint3 DTid : SV_DispatchThreadID) 140 | { 141 | int3 index = DTid; 142 | float4 currentValue = SampleTexture[index]; 143 | 144 | int3 otherIndex = getOtherIndex(index, _LossCB.key, _LossCB.scrambleBits); 145 | float4 otherValue = SampleTexture[otherIndex]; 146 | 147 | uint3 textureSize = _LossCB.TextureSize; 148 | 149 | int3 filterMin = _LossCB.filterMin; 150 | int3 filterMax = _LossCB.filterMax; 151 | int3 filterOffset = _LossCB.filterOffset; 152 | 153 | float deltaLoss = 0.0f; 154 | 155 | for (int i = filterMin.x; i <= filterMax.x; ++i) 156 | { 157 | float filterX = Filter[i + filterOffset.x]; 158 | 159 | for (int j = filterMin.y; j <= filterMax.y; ++j) 160 | { 161 | float filterY = Filter[j + filterOffset.y]; 162 | 163 | for (int k = filterMin.z; k <= filterMax.z; ++k) { 164 | 165 | float filterZ = Filter[k + filterOffset.z]; 166 | 167 | float F = combineFilter(int3(i, j, k), filterX, filterY, filterZ); 168 | 169 | float4 neighbourValue = SampleTexture[uint3(index + int3(i, j, k)) % textureSize]; 170 | deltaLoss += F * (K2(otherValue, neighbourValue) - K2(currentValue, neighbourValue)); 171 | 172 | } 173 | } 174 | } 175 | 176 | // Wrap indices 177 | int3 dij = min(abs(index - otherIndex), min(abs(index - otherIndex - int3(textureSize)), abs(index - otherIndex + int3(textureSize)))); 178 | float Fij = doubledFilter(dij, filterMin, filterMax, filterOffset); 179 | float Fii = doubledFilter(int3(0, 0, 0), filterMin, filterMax, filterOffset); 180 | 181 | deltaLoss += (Fij - Fii) * K2(currentValue, otherValue); 182 | 183 | LossTexture[index] = deltaLoss; 184 | 185 | } 186 | -------------------------------------------------------------------------------- /fastnoise/shaders/swap.hlsl: -------------------------------------------------------------------------------- 1 | /////////////////////////////////////////////////////////////////////////////// 2 | // FastNoise - F.A.S.T. Sampling Implementation // 3 | // Copyright (c) 2023 Electronic Arts Inc. All rights reserved. // 4 | /////////////////////////////////////////////////////////////////////////////// 5 | 6 | struct FilterType 7 | { 8 | static const int Box = 0; 9 | static const int Gaussian = 1; 10 | static const int Binomial = 2; 11 | static const int Exponential = 3; 12 | static const int WeightedExponential = 4; 13 | }; 14 | 15 | struct SampleSpace 16 | { 17 | static const int Real = 0; 18 | static const int Circle = 1; 19 | static const int Vector2 = 2; 20 | static const int Vector3 = 3; 21 | static const int Vector4 = 4; 22 | static const int Sphere = 5; 23 | }; 24 | 25 | struct SampleDistribution 26 | { 27 | static const int Uniform1D = 0; 28 | static const int Gauss1D = 1; 29 | static const int Tent1D = 2; 30 | static const int Uniform2D = 3; 31 | static const int Uniform3D = 4; 32 | static const int Uniform4D = 5; 33 | static const int UniformSphere = 6; 34 | static const int UniformHemisphere = 7; 35 | static const int CosineHemisphere = 8; 36 | }; 37 | 38 | struct Struct_DataStruct 39 | { 40 | uint initialized; 41 | uint iterationSum; 42 | uint swaps; 43 | }; 44 | 45 | struct Struct__SwapCB 46 | { 47 | uint Iteration; 48 | uint3 TextureSize; 49 | uint4 key; 50 | uint scrambleBits; 51 | uint swapSuppression; 52 | float2 _padding0; 53 | }; 54 | 55 | Texture3D LossTexture : register(t0); 56 | RWTexture3D SampleTexture : register(u0); 57 | RWTexture3D SwapDebug : register(u1); 58 | RWStructuredBuffer Data : register(u2); 59 | ConstantBuffer _SwapCB : register(b0); 60 | 61 | #line 1 62 | 63 | 64 | #include "fastnoise.hlsl" 65 | 66 | [numthreads(8, 8, 1)] 67 | #line 5 68 | void Swap(uint3 DTid : SV_DispatchThreadID) 69 | { 70 | // 1. Total loss for the swap is sum of loss texture at source and destination 71 | uint3 index = DTid; 72 | uint3 otherIndex = getOtherIndex(index, _SwapCB.key, _SwapCB.scrambleBits); 73 | 74 | float loss = LossTexture[index] + LossTexture[otherIndex]; 75 | 76 | // 2. Only one out of each pair does the swap, so check if we have the lower index 77 | int3 textureSize = _SwapCB.TextureSize; 78 | uint3 flatten = uint3(textureSize.y * textureSize.z, textureSize.z, 1); 79 | bool lesser = dot(flatten, index) < dot(flatten, otherIndex); 80 | 81 | // 3. Only do swap a fraction of the time, this helps convergence in the early iterations 82 | // TODO: We should adjust this based on the number of swaps - if it's above a threshold, then don't execute the swap 83 | 84 | 85 | uint iteration = _SwapCB.Iteration; 86 | uint randomSeed = wang_hash_init(DTid + iteration); 87 | uint randomValue = wang_hash_uint(randomSeed); 88 | uint swapSuppression = _SwapCB.swapSuppression; 89 | bool swapCheck = (randomValue % swapSuppression) == 0; 90 | 91 | if (lesser && loss < 0 && swapCheck) 92 | { 93 | float4 value = SampleTexture[index]; 94 | float4 otherValue = SampleTexture[otherIndex]; 95 | SampleTexture[index] = otherValue; 96 | SampleTexture[otherIndex] = value; 97 | 98 | uint oldSwaps; 99 | InterlockedAdd(Data[0].swaps, 1, oldSwaps); 100 | 101 | } 102 | 103 | // Output debugging info to a texture 104 | // Should have equal numbers of red and green pixels 105 | //float4 debugValue = 0.0f; 106 | //if (loss < 0) { 107 | // debugValue = float4(lesser, 1 - lesser, -loss, 1.0f); 108 | //} 109 | //float4 debugValue = float4(loss, loss, loss, 1.0f); 110 | //SwapDebug[index] = debugValue; 111 | 112 | // DEBUG: check that this defines an involution 113 | //uint2 otherOtherIndex = scramble(scramble(otherIndex, a) ^ uint2(0, 1), b); 114 | //SwapDebug[index] = float4(otherOtherIndex, 0.0f, 1.0f); 115 | 116 | } 117 | -------------------------------------------------------------------------------- /logo/SEED.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/logo/SEED.jpg -------------------------------------------------------------------------------- /makegaussnoise.bat: -------------------------------------------------------------------------------- 1 | @echo off 2 | 3 | rem texture sizes 4 | set /A width=32 5 | set /A height=32 6 | 7 | if not exist "out/gauss" mkdir "out/gauss" 8 | 9 | FOR /L %%x IN (1, 1, 1000) DO FastNoise.exe real Gauss Gauss 1.0 Box 1 product %width% %height% 1 out/gauss/real_gauss_gauss1_0_%%x -numsteps 5000 10 | 11 | rem FastNoise.exe real Gauss Gauss 1.0 Box 1 product %width% %height% 1 out/gauss/real_gauss_gauss1_0_1000 -numsteps 1000 12 | rem FastNoise.exe real Gauss Gauss 1.0 Box 1 product %width% %height% 1 out/gauss/real_gauss_gauss1_0_5000 -numsteps 5000 13 | rem FastNoise.exe real Gauss Gauss 1.0 Box 1 product %width% %height% 1 out/gauss/real_gauss_gauss1_0_10000 -numsteps 10000 14 | 15 | rem FastNoise.exe real Gauss Box 3 Box 1 product %width% %height% 1 out/gauss/real_gauss_box3x3 16 | rem FastNoise.exe real Gauss Box 5 Box 1 product %width% %height% 1 out/gauss/real_gauss_box5x5 17 | rem FastNoise.exe real Gauss Gauss 1.0 Box 1 product %width% %height% 1 out/gauss/real_gauss_gauss1_0 18 | rem FastNoise.exe real Gauss Binomial 2 Box 1 product %width% %height% 1 out/gauss/real_gauss_binomial3x3 19 | rem FastNoise.exe real Gauss Binomial 4 Box 1 product %width% %height% 1 out/gauss/real_gauss_binomial5x5 -------------------------------------------------------------------------------- /noise.zip: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:35fe2ce496a837186931acc5afedcdf53ef22d1aaf6d01ad1dcd416c5ff68cea 3 | size 198692784 4 | -------------------------------------------------------------------------------- /readme/DitherBinomialGauss.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/readme/DitherBinomialGauss.png -------------------------------------------------------------------------------- /readme/EffectiveSampleCounts.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/readme/EffectiveSampleCounts.png -------------------------------------------------------------------------------- /readme/autocorr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/readme/autocorr.png -------------------------------------------------------------------------------- /readme/s_interval_binomial.png-spectrum.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/readme/s_interval_binomial.png-spectrum.png -------------------------------------------------------------------------------- /readme/s_interval_gauss.png-spectrum.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/electronicarts/fastnoise/2cf53e4bb510d07511fe63a312556d2a2e108c70/readme/s_interval_gauss.png-spectrum.png -------------------------------------------------------------------------------- /scripts/histogram.py: -------------------------------------------------------------------------------- 1 | #/////////////////////////////////////////////////////////////////////////////// 2 | #// FastNoise - F.A.S.T. Sampling Implementation // 3 | #// Copyright (c) 2023 Electronic Arts Inc. All rights reserved. // 4 | #/////////////////////////////////////////////////////////////////////////////// 5 | 6 | import sys 7 | 8 | import matplotlib.pyplot as plt 9 | import numpy as np 10 | from matplotlib import image 11 | import imageio 12 | 13 | # imageio is for hdr support. 14 | # https://matiascodesal.com/blog/how-read-hdr-image-using-python/ 15 | 16 | if len(sys.argv) != 3: 17 | print(f"Usage: {sys.argv[0]} filename sampleSpace") 18 | print("Where sampleSpace is (real|circle|sphere|vector2|vector3|vector4)") 19 | exit(1) 20 | 21 | img = None 22 | 23 | isHDR = sys.argv[1].endswith(".hdr") 24 | 25 | if isHDR: 26 | imageio.plugins.freeimage.download() 27 | img = imageio.v2.imread(sys.argv[1], format='HDR-FI') 28 | sys.argv[1] = sys.argv[1].replace(".hdr", ".png") 29 | else: 30 | img = image.imread(sys.argv[1]) 31 | 32 | 33 | if sys.argv[2] == "circle" or sys.argv[2] == "real": 34 | 35 | img = img[:,:,0] 36 | plt.clf() 37 | plt.hist(img.flatten(), bins=256, range=(0,1)) 38 | plt.savefig(sys.argv[1].replace(".png", "_histogram.png")) 39 | elif sys.argv[2] == "vector2": 40 | 41 | fig, axs = plt.subplots(1,3, figsize=(15, 5)) 42 | 43 | axs[0].hist(img[:,:,0].flatten(), bins=256, range=(0,1)) 44 | axs[1].hist(img[:,:,1].flatten(), bins=256, range=(0,1)) 45 | axs[2].hist2d(img[:,:,0].flatten(), img[:,:,1].flatten(), bins=256, range=[[0,1],[0,1]]) 46 | 47 | plt.savefig(sys.argv[1].replace(".png", "_histogram.png")) 48 | 49 | 50 | elif sys.argv[2] == "vector3" or sys.argv[2] == "sphere": 51 | 52 | fig, axs = plt.subplots(2,3, figsize=(15, 10)) 53 | 54 | axs[0][0].hist(img[:,:,0].flatten(), bins=256, range=(0,1)) 55 | axs[0][1].hist(img[:,:,1].flatten(), bins=256, range=(0,1)) 56 | axs[0][2].hist(img[:,:,2].flatten(), bins=256, range=(0,1)) 57 | axs[1][0].hist2d(img[:,:,0].flatten(), img[:,:,1].flatten(), bins=256, range=[[0,1],[0,1]]) 58 | axs[1][1].hist2d(img[:,:,0].flatten(), img[:,:,2].flatten(), bins=256, range=[[0,1],[0,1]]) 59 | axs[1][2].hist2d(img[:,:,1].flatten(), img[:,:,2].flatten(), bins=256, range=[[0,1],[0,1]]) 60 | 61 | plt.savefig(sys.argv[1].replace(".png", "_histogram.png")) 62 | 63 | 64 | elif sys.argv[2] == "vector4": 65 | 66 | fig, axs = plt.subplots(2,5, figsize=(25, 10)) 67 | 68 | axs[0][0].hist(img[:,:,0].flatten(), bins=256, range=(0,1)) 69 | axs[0][1].hist(img[:,:,1].flatten(), bins=256, range=(0,1)) 70 | axs[1][0].hist(img[:,:,2].flatten(), bins=256, range=(0,1)) 71 | axs[1][1].hist(img[:,:,3].flatten(), bins=256, range=(0,1)) 72 | 73 | axs[0][2].hist2d(img[:,:,0].flatten(), img[:,:,1].flatten(), bins=256, range=[[0,1],[0,1]]) 74 | axs[1][2].hist2d(img[:,:,0].flatten(), img[:,:,2].flatten(), bins=256, range=[[0,1],[0,1]]) 75 | axs[0][3].hist2d(img[:,:,0].flatten(), img[:,:,3].flatten(), bins=256, range=[[0,1],[0,1]]) 76 | axs[1][3].hist2d(img[:,:,1].flatten(), img[:,:,2].flatten(), bins=256, range=[[0,1],[0,1]]) 77 | axs[0][4].hist2d(img[:,:,1].flatten(), img[:,:,3].flatten(), bins=256, range=[[0,1],[0,1]]) 78 | axs[1][4].hist2d(img[:,:,2].flatten(), img[:,:,3].flatten(), bins=256, range=[[0,1],[0,1]]) 79 | 80 | plt.savefig(sys.argv[1].replace(".png", "_histogram.png")) 81 | 82 | else: 83 | print(f"Unimplemented sampleSpace {sys.argv[2]}") 84 | exit(1) -------------------------------------------------------------------------------- /scripts/makenoise-spatial.py: -------------------------------------------------------------------------------- 1 | #/////////////////////////////////////////////////////////////////////////////// 2 | #// FastNoise - F.A.S.T. Sampling Implementation // 3 | #// Copyright (c) 2023 Electronic Arts Inc. All rights reserved. // 4 | #/////////////////////////////////////////////////////////////////////////////// 5 | 6 | import os.path 7 | 8 | computeHistogram = True 9 | computeSpectrum = True 10 | 11 | width=128 12 | height=128 13 | 14 | # Generate sample textures, together with histograms and noise spectrum 15 | for (space, distribution) in [("real", "uniform"), ("real", "tent"), ("circle", "uniform"), ("vector2", "uniform"), ("sphere", "uniform"), ("sphere", "cosine"), ("vector3", "uniform"), ("vector4", "uniform")]: 16 | for (filter, param) in [("box", 3), ("box", 5), ("binomial", 2), ("binomial", 3), ("gauss", 0.7), ("gauss", 1.0)]: 17 | 18 | os.makedirs(f"analysis/{space}", exist_ok = True) 19 | filename = f"analysis/{space}/{space}_{distribution}_{filter}_{param}" 20 | 21 | if not os.path.isfile(filename + ".png"): 22 | cmd = f"FastNoise.exe {space} {distribution} {filter} {param} box 1 product {width} {height} 1 {filename}" 23 | print(cmd) 24 | os.system(cmd) 25 | 26 | if computeHistogram and not os.path.isfile(filename + "_histogram.png"): 27 | cmd = f"python scripts/histogram.py {filename}.png {space}" 28 | print(cmd) 29 | os.system(cmd) 30 | 31 | if computeSpectrum and not os.path.isfile(filename + "_spectrum.png"): 32 | cmd = f"python scripts/spectrum.py {filename}.png {space}" 33 | print(cmd) 34 | os.system(cmd) -------------------------------------------------------------------------------- /scripts/makenoise-temporal.py: -------------------------------------------------------------------------------- 1 | #/////////////////////////////////////////////////////////////////////////////// 2 | #// FastNoise - F.A.S.T. Sampling Implementation // 3 | #// Copyright (c) 2023 Electronic Arts Inc. All rights reserved. // 4 | #/////////////////////////////////////////////////////////////////////////////// 5 | 6 | import os.path 7 | 8 | computeHistogram = True 9 | computeSpectrum = True 10 | 11 | width=128 12 | height=128 13 | depth=64 14 | 15 | # Temporal comparison with STBN 16 | for (space,distribution) in [("real", "uniform")]: 17 | for (filter,param) in [("gauss", 1.3435)]: 18 | 19 | # Filter alpha is what we will use to test the noise. Does not have to be the same as the generated noise. 20 | for filterAlpha in [0.1]: 21 | 22 | directory = f"analysis/temporal/{space}-{width}x{height}x{depth}" 23 | os.makedirs(directory, exist_ok = True) 24 | 25 | # Compare with STBN and white noise 26 | csvfiles = [f"{directory}/{space}_stbn_temporal.csv", 27 | f"{directory}/{space}_whitenoise_temporal.csv", 28 | f"{directory}/{space}_{distribution}_{filter}_{param}_white_over_time_temporal.csv"] 29 | 30 | for alpha in [0.1]: 31 | 32 | for beta in [0.1, 0.2, 0.3, 0.4, 0.5]: 33 | 34 | #for filterCombine in ["product", "separate 0.5"]: 35 | for filterCombine in ["product"]: 36 | 37 | filename = f"{directory}/{space}_{distribution}_{filter}_{param}_exponential_{alpha}_{beta}_{filterCombine.replace(' ', '_')}" 38 | 39 | if not os.path.isfile(filename + ".png"): 40 | 41 | cmd = f"FastNoise.exe {space} {distribution} {filter} {param} exponential {alpha} {beta} {filterCombine} {width} {height} {depth} {filename}" 42 | 43 | print(cmd) 44 | os.system(cmd) 45 | 46 | if computeHistogram and not os.path.isfile(filename + "_histogram.png"): 47 | cmd = f"python scripts/histogram.py {filename}.png {space}" 48 | print(cmd) 49 | os.system(cmd) 50 | 51 | if computeSpectrum and not os.path.isfile(filename + "_spectrum.png"): 52 | cmd = f"python scripts/spectrum.py {filename}.png {space}" 53 | print(cmd) 54 | os.system(cmd) 55 | 56 | if not os.path.isfile(filename + "_temporal.csv"): 57 | cmd = f"python scripts/temporal.py {filename}.png {space} {filter} {param} {filterAlpha}" 58 | print(cmd) 59 | os.system(cmd) 60 | 61 | csvfiles.append(filename + "_temporal.csv") 62 | 63 | # plot generated CSV files for the same space together 64 | cmd = f"python scripts/temporal-plot.py {directory}/{space}_{distribution}_{filter}_{param}_exponential_{alpha}_temporal.png " + " ".join(csvfiles) 65 | print(cmd) 66 | os.system(cmd) -------------------------------------------------------------------------------- /scripts/spectrum.py: -------------------------------------------------------------------------------- 1 | #/////////////////////////////////////////////////////////////////////////////// 2 | #// FastNoise - F.A.S.T. Sampling Implementation // 3 | #// Copyright (c) 2023 Electronic Arts Inc. All rights reserved. // 4 | #/////////////////////////////////////////////////////////////////////////////// 5 | 6 | import sys 7 | import numpy as np 8 | from matplotlib import image 9 | from numpy import pi, sin, cos, modf, sqrt 10 | import imageio 11 | 12 | # imageio is for hdr support. 13 | # https://matiascodesal.com/blog/how-read-hdr-image-using-python/ 14 | 15 | if len(sys.argv) != 3: 16 | print(f"Usage: {sys.argv[0]} filename sampleSpace") 17 | print("Where sampleSpace is (real|circle|sphere|vector2|vector3|vector4)") 18 | exit(1) 19 | 20 | # 21 | filename = sys.argv[1] 22 | sampleSpace = sys.argv[2] 23 | numSamples = 256 24 | 25 | img = None 26 | 27 | isHDR = filename.endswith(".hdr") 28 | 29 | if isHDR: 30 | imageio.plugins.freeimage.download() 31 | img = imageio.v2.imread(filename, format='HDR-FI') 32 | else: 33 | img = image.imread(filename) 34 | 35 | # Interpret 2D image as a stack of square images 36 | inputShape = img.shape 37 | fftShape = [img.shape[0]//img.shape[1], img.shape[1], img.shape[1]] 38 | flatShape = [img.shape[0] * img.shape[1], img.shape[2]] 39 | print(f"Dimensions {img.shape}, interpreting as {fftShape}") 40 | img = np.reshape(img, flatShape) 41 | 42 | # Tool outputs 4-component images; reduce to just the ones we need 43 | if sampleSpace == "circle" or sampleSpace == "real": 44 | img = img[:,0] 45 | elif sampleSpace == "vector2": 46 | img = img[:,0:2] 47 | elif sampleSpace == "sphere" or sampleSpace == "vector3": 48 | img = img[:,0:3] 49 | 50 | # Map from [0,1] into [-1,1] 51 | if not isHDR: 52 | img = (img - 0.5) * 2.0 * 255.0 / 256.0 53 | 54 | 55 | # We will use this to accumulate squared spectrum of the noise 56 | meanSquareSpectrum = np.zeros(fftShape) 57 | 58 | # 59 | for s in range(numSamples): 60 | 61 | mask = np.zeros(img.shape[0]) 62 | 63 | if sampleSpace == "real": 64 | 65 | t = 2*(s + np.random.rand()) / numSamples - 1 66 | for i in range(img.shape[0]): 67 | mask[i] = 1.0 if img[i] < t else 0.0 68 | 69 | elif sampleSpace == "circle": 70 | 71 | t = 2*(s + np.random.rand()) / numSamples 72 | for i in range(img.shape[0]): 73 | mask[i] = 1.0 if (t + img[i]) % 2.0 < 1.0 else 0.0 74 | 75 | elif sampleSpace == "sphere": 76 | 77 | # Uniform sampling of sphere 78 | phi = 2 * pi * np.random.rand() 79 | u = 2*np.random.rand()-1 80 | v = np.array([sqrt(1-u**2) * cos(phi), sqrt(1-u**2) * sin(phi), u]) 81 | 82 | for i in range(img.shape[0]): 83 | mask[i] = 1.0 if np.dot(v, img[i,:]) < 0.0 else 0.0 84 | 85 | elif sampleSpace == "vector2": 86 | 87 | # Generate random Heaviside function 88 | phi = 2 * pi * np.random.rand() 89 | offset = sqrt(2) * (2*np.random.rand()-1) 90 | v = np.array([cos(phi), sin(phi)]) 91 | 92 | for i in range(img.shape[0]): 93 | mask[i] = 1.0 if np.dot(v, img[i,:]) < offset else 0.0 94 | 95 | elif sampleSpace == "vector3": 96 | 97 | # Generate random Heaviside function 98 | phi = 2 * pi * np.random.rand() 99 | u = 2*np.random.rand()-1 100 | v = np.array([sqrt(1-u**2) * cos(phi), sqrt(1-u**2) * sin(phi), u]) 101 | offset = sqrt(3) * (2*np.random.rand()-1) 102 | 103 | for i in range(img.shape[0]): 104 | mask[i] = 1.0 if np.dot(v, img[i,:]) < offset else 0.0 105 | 106 | elif sampleSpace == "vector4": 107 | 108 | # Generate random Heaviside function 109 | u = np.random.normal(0,1,4) 110 | v = u / sqrt(np.sum(u**2)) 111 | offset = 2 * (2*np.random.rand()-1) 112 | 113 | for i in range(img.shape[0]): 114 | mask[i] = 1.0 if np.dot(v, img[i,:]) < offset else 0.0 115 | 116 | else: 117 | print(f"unknown sample space {samplespace}") 118 | exit() 119 | 120 | # Average the square of the Fourier transform 121 | spectrum = np.fft.fftn(np.reshape(mask, fftShape)) 122 | meanSquareSpectrum += abs(spectrum)**2 123 | 124 | print(f"{s}/{numSamples}", end="\r") 125 | 126 | 127 | # Output the RMS spectrum, with the zero mode removed 128 | meanSquareSpectrum[0,0,0] = 0 129 | RMSSpectrum = np.sqrt(np.fft.fftshift(meanSquareSpectrum)) 130 | 131 | # Reshape RMS spectrum to match the input 132 | if isHDR: 133 | filename = filename.replace(".hdr", "_spectrum.png") 134 | else: 135 | filename = filename.replace(".png", "_spectrum.png") 136 | image.imsave(filename, np.reshape(RMSSpectrum, [inputShape[0], inputShape[1]])) 137 | -------------------------------------------------------------------------------- /scripts/temporal-plot.py: -------------------------------------------------------------------------------- 1 | #/////////////////////////////////////////////////////////////////////////////// 2 | #// FastNoise - F.A.S.T. Sampling Implementation // 3 | #// Copyright (c) 2023 Electronic Arts Inc. All rights reserved. // 4 | #/////////////////////////////////////////////////////////////////////////////// 5 | 6 | import sys 7 | import numpy as np 8 | import matplotlib.pyplot as plt 9 | 10 | #Plot all in gray, then plot single lines over top in red 11 | fig, ax = plt.subplots() 12 | plt.xlabel("Frame number") 13 | plt.ylabel("Average error") 14 | for i in range(2,len(sys.argv)): 15 | 16 | ax.clear() 17 | 18 | for fn in sys.argv[2:]: 19 | 20 | totalError = np.loadtxt(fn) 21 | ax.plot(totalError, label = fn, color="gainsboro") 22 | 23 | redfn = sys.argv[i] 24 | totalError = np.loadtxt(redfn) 25 | 26 | plt.yscale("log") 27 | ax.plot(totalError, label = redfn, color="red") 28 | 29 | #plt.legend(loc='center left', bbox_to_anchor=(1, 0.5)) 30 | plt.savefig(redfn.replace("csv", "png")) 31 | 32 | # Scatter plot first frame vs. average frame error 33 | fig, ax = plt.subplots() 34 | plt.xlabel("First frame error") 35 | plt.ylabel("Average frame error") 36 | for fn in sys.argv[2:]: 37 | totalError = np.loadtxt(fn) 38 | first = totalError[0] 39 | average = np.sqrt(np.sum(totalError**2)) 40 | last = totalError[-1] 41 | 42 | if "whitenoise" in fn: 43 | continue 44 | 45 | plt.scatter(first, average, marker = 's' if "product" in fn else "P", label = fn) 46 | 47 | 48 | lgd = plt.legend(loc='center left', bbox_to_anchor=(1, 0.5)) 49 | plt.savefig(sys.argv[1], bbox_extra_artists=(lgd,), bbox_inches='tight') 50 | -------------------------------------------------------------------------------- /scripts/temporal.py: -------------------------------------------------------------------------------- 1 | #/////////////////////////////////////////////////////////////////////////////// 2 | #// FastNoise - F.A.S.T. Sampling Implementation // 3 | #// Copyright (c) 2023 Electronic Arts Inc. All rights reserved. // 4 | #/////////////////////////////////////////////////////////////////////////////// 5 | 6 | import sys 7 | import numpy as np 8 | from matplotlib import image 9 | from numpy import pi, sin, cos, modf, sqrt 10 | 11 | # TODO: Allow for any spatial filter (box, gauss, binomial) 12 | # Binomial can be hand-coded or iterated uniform filter 13 | from scipy.ndimage.filters import gaussian_filter, uniform_filter 14 | # from scipy.ndimage.filters import gaussian_filter 15 | 16 | if len(sys.argv) != 6: 17 | print(f"Usage: {sys.argv[0]} filename sampleSpace spatialFilter filterParam alpha") 18 | print("Where sampleSpace is (real|circle|sphere|vector2|vector3|vector4)") 19 | print("spatialFilter is (uniform|binomial|gauss) with associated parameter (width, n, sigma) filterParam") 20 | print("alpha is the parameter of the exponential averaging filter") 21 | exit(1) 22 | 23 | # 24 | filename = sys.argv[1] 25 | sampleSpace = sys.argv[2] 26 | spatialFilter = sys.argv[3] 27 | filterParam = sys.argv[4] 28 | alpha = float(sys.argv[5]) 29 | 30 | numSamples = 256 31 | 32 | img = image.imread(filename) 33 | 34 | # Map from [0,1] into [-1,1] 35 | img = (img - 0.5) * 2.0 * 255.0 / 256.0 36 | 37 | # Interpret 2D image as a stack of square images 38 | inputShape = img.shape 39 | shape3D = [img.shape[0]//img.shape[1], img.shape[1], img.shape[1], img.shape[2]] 40 | img = np.reshape(img, shape3D) 41 | 42 | # 1. Pick a random Heaviside function, and calculate the mask 43 | numFrames = shape3D[0] 44 | variance = np.zeros(numFrames) 45 | 46 | for s in range(numSamples): 47 | 48 | filteredResult = np.zeros(img.shape[1] * img.shape[2]) 49 | 50 | for k in range(numFrames): 51 | 52 | # Frame is now x,y,d 53 | frame = np.reshape(img[k], [img.shape[1] * img.shape[2], img.shape[3]]) 54 | mask = np.zeros(frame.shape[0]) 55 | 56 | if sampleSpace == "real": 57 | 58 | t = 2*(s + np.random.rand()) / numSamples - 1 59 | for i in range(frame.shape[0]): 60 | mask[i] = 1.0 if frame[i,0] < t else 0.0 61 | 62 | elif sampleSpace == "circle": 63 | 64 | t = 2*(s + np.random.rand()) / numSamples 65 | for i in range(frame.shape[0]): 66 | mask[i] = 1.0 if (t + frame[i,0]) % 2.0 < 1.0 else 0.0 67 | 68 | elif sampleSpace == "sphere": 69 | 70 | # Uniform sampling of sphere 71 | phi = 2 * pi * np.random.rand() 72 | u = 2*np.random.rand()-1 73 | v = np.array([sqrt(1-u**2) * cos(phi), sqrt(1-u**2) * sin(phi), u]) 74 | 75 | for i in range(frame.shape[0]): 76 | mask[i] = 1.0 if np.dot(v, frame[i,0:3]) < 0.0 else 0.0 77 | 78 | elif sampleSpace == "vector2": 79 | 80 | # Generate random Heaviside function 81 | phi = 2 * pi * np.random.rand() 82 | offset = sqrt(2) * (2*np.random.rand()-1) 83 | v = np.array([cos(phi), sin(phi)]) 84 | 85 | for i in range(frame.shape[0]): 86 | mask[i] = 1.0 if np.dot(v, frame[i,0:2]) < offset else 0.0 87 | 88 | elif sampleSpace == "vector3": 89 | 90 | # Generate random Heaviside function 91 | phi = 2 * pi * np.random.rand() 92 | u = 2*np.random.rand()-1 93 | v = np.array([sqrt(1-u**2) * cos(phi), sqrt(1-u**2) * sin(phi), u]) 94 | offset = sqrt(3) * (2*np.random.rand()-1) 95 | 96 | for i in range(frame.shape[0]): 97 | mask[i] = 1.0 if np.dot(v, frame[i,0:3]) < offset else 0.0 98 | 99 | elif sampleSpace == "vector4": 100 | 101 | # Generate random Heaviside function 102 | u = np.random.normal(0,1,4) 103 | v = u / sqrt(np.sum(u**2)) 104 | offset = 2 * (2*np.random.rand()-1) 105 | 106 | for i in range(frame.shape[0]): 107 | mask[i] = 1.0 if np.dot(v, frame[i,0:4]) < offset else 0.0 108 | 109 | # Apply spatial filtering to the mask 110 | # TODO: read params 111 | mask = np.reshape(mask, [img.shape[1], img.shape[2]]) 112 | 113 | if spatialFilter == "box": 114 | filteredMask = uniform_filter(mask, size=int(filterParam), mode='wrap') 115 | elif spatialFilter == "gauss": 116 | filteredMask = gaussian_filter(mask, sigma = float(filterParam), mode='wrap') 117 | elif spatialFilter == "binomial": 118 | # Implement binomial filter by repeated size-2 box filters 119 | filteredMask = uniform_filter(mask, size=2, mode='wrap') 120 | for i in range(int(filterParam)-1): 121 | filteredMask = uniform_filter(filteredMask, size=2, mode='wrap') 122 | else: 123 | print(f"Unsupported filter type ({spatialFilter})") 124 | exit(0) 125 | 126 | filteredMask = np.reshape(filteredMask, img.shape[1] * img.shape[2]) 127 | 128 | 129 | # Apply temporal filtering 130 | if k == 0: 131 | filteredResult = filteredMask 132 | else: 133 | #print(filteredResult) 134 | #print(filteredMask) 135 | filteredResult = alpha * filteredMask + (1.0 - alpha) * filteredResult 136 | 137 | variance[k] += np.var(filteredResult) 138 | 139 | print(f"{s}/{numSamples}", end="\r") 140 | 141 | outputFilename = filename.replace(".png", "_temporal.csv") 142 | np.savetxt(outputFilename, sqrt(variance/numSamples)) --------------------------------------------------------------------------------