/// <summary> /// Generates the normal map. /// </summary> /// <param name="heightMap">The height map.</param> /// <param name="amplitude">The amplitude.</param> /// <returns>An instance of <see cref="TexImage"/> containig the normal map.</returns> public TexImage GenerateNormalMap(TexImage heightMap, float amplitude) { if (amplitude <= 0) { Log.Error("The amplitude must be a positive float."); throw new TextureToolsException("The amplitude must be a positive float."); } if (heightMap.Format.IsCompressed()) { Log.Warning("You can't generate a normal map from a compressed height hmap. It will be decompressed first.."); Decompress(heightMap, heightMap.Format.IsSRgb()); } var request = new NormalMapGenerationRequest(amplitude); ExecuteRequest(heightMap, request); return request.NormalMap; }
public static void GenerateNormalMapTest(TexImage image, ITexLibrary library) { library.Execute(image, new DecompressingRequest(false)); var request = new NormalMapGenerationRequest(1); library.Execute(image, request); Assert.IsTrue(TestTools.ComputeSHA1(request.NormalMap.Data, request.NormalMap.DataSize).Equals(TestTools.GetInstance().Checksum["GenerateNormalMapTest_" + image.Name])); //Console.WriteLine("GenerateNormalMapTest_" + image.Name + "." + TestTools.ComputeSHA1(request.NormalMap.Data, request.NormalMap.DataSize)); request.NormalMap.Dispose(); }
/// <summary> /// Generates the normal map. /// </summary> /// <param name="image">The image.</param> /// <param name="libraryData">The library data.</param> /// <param name="request">The request.</param> /// <exception cref="TexLibraryException">Failed to generate the normal map</exception> public void GenerateNormalMap(TexImage image, DxtTextureLibraryData libraryData, NormalMapGenerationRequest request) { Log.Info("Generating Normal Map ... "); ScratchImage scratchImage = new ScratchImage(); HRESULT hr = Utilities.ComputeNormalMap(libraryData.DxtImages, libraryData.DxtImages.Length, ref libraryData.Metadata, CNMAP_FLAGS.CNMAP_CHANNEL_RED, request.Amplitude, DXGI_FORMAT.DXGI_FORMAT_R8G8B8A8_UNORM, scratchImage); if (hr != HRESULT.S_OK) { Log.Error("Failed to generate the normal map : " + hr); throw new TextureToolsException("Failed to generate the normal map : " + hr); } // Creating new TexImage with the normal map data. request.NormalMap = new TexImage(); DxtTextureLibraryData normalMapLibraryData = new DxtTextureLibraryData(); request.NormalMap.LibraryData[this] = normalMapLibraryData; normalMapLibraryData.DxtImages = scratchImage.GetImages(); normalMapLibraryData.Metadata = scratchImage.metadata; normalMapLibraryData.Image = scratchImage; UpdateImage(request.NormalMap, normalMapLibraryData); request.NormalMap.DisposingLibrary = this; }
/// <summary> /// Generates the normal map. /// </summary> /// <param name="image">The image.</param> /// <param name="libraryData">The library data.</param> /// <param name="request">The request.</param> /// <exception cref="TexLibraryException">Failed to generate normal map.</exception> public void GenerateNormalMap(TexImage image, PvrTextureLibraryData libraryData, NormalMapGenerationRequest request) { Log.Info("Generating Normal Map ... "); // Creating new TexImage with the normal map data. request.NormalMap = new TexImage(); PvrTextureLibraryData normalMapLibraryData = new PvrTextureLibraryData(); request.NormalMap.LibraryData[this] = normalMapLibraryData; normalMapLibraryData.Texture = new PVRTexture(libraryData.Header, libraryData.Texture.GetDataPtr()); request.NormalMap.Format = SiliconStudio.Paradox.Graphics.PixelFormat.R8G8B8A8_UNorm; request.NormalMap.CurrentLibrary = this; request.NormalMap.DisposingLibrary = this; if (!Utilities.GenerateNormalMap(normalMapLibraryData.Texture, request.Amplitude, "xyzh")) { Log.Error("Failed to generate normal map."); throw new TextureToolsException("Failed to generate normal map."); } UpdateImage(request.NormalMap, normalMapLibraryData); EndLibrary(request.NormalMap); request.NormalMap.DisposingLibrary = this; }