From 41a0c850f887d72ff64e9e616ea4bda25fd85de7 Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Sat, 17 Mar 2012 09:27:56 +0000 Subject: added a new UbitMeshing module so i can mess it... --- OpenSim/Region/Physics/UbitMeshing/SculptMap.cs | 197 ++++++++++++++++++++++++ 1 file changed, 197 insertions(+) create mode 100644 OpenSim/Region/Physics/UbitMeshing/SculptMap.cs (limited to 'OpenSim/Region/Physics/UbitMeshing/SculptMap.cs') diff --git a/OpenSim/Region/Physics/UbitMeshing/SculptMap.cs b/OpenSim/Region/Physics/UbitMeshing/SculptMap.cs new file mode 100644 index 0000000..b3d9cb6 --- /dev/null +++ b/OpenSim/Region/Physics/UbitMeshing/SculptMap.cs @@ -0,0 +1,197 @@ +/* + * Copyright (c) Contributors + * See CONTRIBUTORS.TXT for a full list of copyright holders. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * 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. + * * Neither the name of the OpenSimulator Project nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``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 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. + */ + +// to build without references to System.Drawing, comment this out +#define SYSTEM_DRAWING + +using System; +using System.Collections.Generic; +using System.Text; + +#if SYSTEM_DRAWING +using System.Drawing; +using System.Drawing.Imaging; + +namespace PrimMesher +{ + public class SculptMap + { + public int width; + public int height; + public byte[] redBytes; + public byte[] greenBytes; + public byte[] blueBytes; + + public SculptMap() + { + } + + public SculptMap(Bitmap bm, int lod) + { + int bmW = bm.Width; + int bmH = bm.Height; + + if (bmW == 0 || bmH == 0) + throw new Exception("SculptMap: bitmap has no data"); + + int numLodPixels = lod * lod; // (32 * 2)^2 = 64^2 pixels for default sculpt map image + + bool smallMap = bmW * bmH <= numLodPixels; + bool needsScaling = false; + + width = bmW; + height = bmH; + while (width * height > numLodPixels * 4) + { + width >>= 1; + height >>= 1; + needsScaling = true; + } + + try + { + if (needsScaling) + bm = ScaleImage(bm, width, height); + } + + catch (Exception e) + { + throw new Exception("Exception in ScaleImage(): e: " + e.ToString()); + } + + if (width * height > numLodPixels) + { + width >>= 1; + height >>= 1; + } + + int numBytes = (width + 1) * (height + 1); + redBytes = new byte[numBytes]; + greenBytes = new byte[numBytes]; + blueBytes = new byte[numBytes]; + + int byteNdx = 0; + + try + { + for (int y = 0; y <= height; y++) + { + for (int x = 0; x <= width; x++) + { + Color c; + + if (smallMap) + c = bm.GetPixel(x < width ? x : x - 1, + y < height ? y : y - 1); + else + c = bm.GetPixel(x < width ? x * 2 : x * 2 - 1, + y < height ? y * 2 : y * 2 - 1); + + redBytes[byteNdx] = c.R; + greenBytes[byteNdx] = c.G; + blueBytes[byteNdx] = c.B; + + ++byteNdx; + } + } + } + catch (Exception e) + { + throw new Exception("Caught exception processing byte arrays in SculptMap(): e: " + e.ToString()); + } + + width++; + height++; + } + + public List> ToRows(bool mirror) + { + int numRows = height; + int numCols = width; + + List> rows = new List>(numRows); + + float pixScale = 1.0f / 255; + + int rowNdx, colNdx; + int smNdx = 0; + + + for (rowNdx = 0; rowNdx < numRows; rowNdx++) + { + List row = new List(numCols); + for (colNdx = 0; colNdx < numCols; colNdx++) + { + + if (mirror) + row.Add(new Coord(-((float)redBytes[smNdx] * pixScale - 0.5f), ((float)greenBytes[smNdx] * pixScale - 0.5f), (float)blueBytes[smNdx] * pixScale - 0.5f)); + else + row.Add(new Coord((float)redBytes[smNdx] * pixScale - 0.5f, (float)greenBytes[smNdx] * pixScale - 0.5f, (float)blueBytes[smNdx] * pixScale - 0.5f)); + + ++smNdx; + } + rows.Add(row); + } + return rows; + } + + private Bitmap ScaleImage(Bitmap srcImage, int destWidth, int destHeight) + { + + Bitmap scaledImage = new Bitmap(destWidth, destHeight, PixelFormat.Format24bppRgb); + + Color c; + float xscale = srcImage.Width / destWidth; + float yscale = srcImage.Height / destHeight; + + float sy = 0.5f; + for (int y = 0; y < destHeight; y++) + { + float sx = 0.5f; + for (int x = 0; x < destWidth; x++) + { + try + { + c = srcImage.GetPixel((int)(sx), (int)(sy)); + scaledImage.SetPixel(x, y, Color.FromArgb(c.R, c.G, c.B)); + } + catch (IndexOutOfRangeException) + { + } + + sx += xscale; + } + sy += yscale; + } + srcImage.Dispose(); + return scaledImage; + } + + } + + } +#endif -- cgit v1.1 From 493309d91a2aaa56d95d3f08806524159bc6e645 Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Sun, 5 Aug 2012 10:37:25 +0100 Subject: ubitmeshing: mask out mirror and invert bits on sculpttype convertion. Remove some unused --- OpenSim/Region/Physics/UbitMeshing/SculptMap.cs | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) (limited to 'OpenSim/Region/Physics/UbitMeshing/SculptMap.cs') diff --git a/OpenSim/Region/Physics/UbitMeshing/SculptMap.cs b/OpenSim/Region/Physics/UbitMeshing/SculptMap.cs index b3d9cb6..054caf3 100644 --- a/OpenSim/Region/Physics/UbitMeshing/SculptMap.cs +++ b/OpenSim/Region/Physics/UbitMeshing/SculptMap.cs @@ -25,14 +25,10 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -// to build without references to System.Drawing, comment this out -#define SYSTEM_DRAWING - using System; using System.Collections.Generic; using System.Text; -#if SYSTEM_DRAWING using System.Drawing; using System.Drawing.Imaging; @@ -140,7 +136,6 @@ namespace PrimMesher int rowNdx, colNdx; int smNdx = 0; - for (rowNdx = 0; rowNdx < numRows; rowNdx++) { List row = new List(numCols); @@ -163,11 +158,11 @@ namespace PrimMesher { Bitmap scaledImage = new Bitmap(destWidth, destHeight, PixelFormat.Format24bppRgb); - + Color c; float xscale = srcImage.Width / destWidth; float yscale = srcImage.Height / destHeight; - + float sy = 0.5f; for (int y = 0; y < destHeight; y++) { @@ -190,8 +185,5 @@ namespace PrimMesher srcImage.Dispose(); return scaledImage; } - - } - } -#endif +} \ No newline at end of file -- cgit v1.1 From 307c45af2abc3246ae93e4f068d1da7679957be3 Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Sun, 5 Aug 2012 12:54:34 +0100 Subject: bug fix: keep sculpt bitmaps border pixels during resolution scaling. let this eventually have diferent interpolator last steps on each direction as sl seems to do. --- OpenSim/Region/Physics/UbitMeshing/SculptMap.cs | 83 ++++++++++++++++++++----- 1 file changed, 69 insertions(+), 14 deletions(-) (limited to 'OpenSim/Region/Physics/UbitMeshing/SculptMap.cs') diff --git a/OpenSim/Region/Physics/UbitMeshing/SculptMap.cs b/OpenSim/Region/Physics/UbitMeshing/SculptMap.cs index 054caf3..1c75db6 100644 --- a/OpenSim/Region/Physics/UbitMeshing/SculptMap.cs +++ b/OpenSim/Region/Physics/UbitMeshing/SculptMap.cs @@ -56,11 +56,12 @@ namespace PrimMesher int numLodPixels = lod * lod; // (32 * 2)^2 = 64^2 pixels for default sculpt map image - bool smallMap = bmW * bmH <= numLodPixels; bool needsScaling = false; + bool smallMap = false; width = bmW; height = bmH; + while (width * height > numLodPixels * 4) { width >>= 1; @@ -81,9 +82,12 @@ namespace PrimMesher if (width * height > numLodPixels) { + smallMap = false; width >>= 1; height >>= 1; } + else + smallMap = true; int numBytes = (width + 1) * (height + 1); redBytes = new byte[numBytes]; @@ -91,21 +95,18 @@ namespace PrimMesher blueBytes = new byte[numBytes]; int byteNdx = 0; + Color c; try { for (int y = 0; y <= height; y++) { - for (int x = 0; x <= width; x++) + for (int x = 0; x < width; x++) { - Color c; - if (smallMap) - c = bm.GetPixel(x < width ? x : x - 1, - y < height ? y : y - 1); + c = bm.GetPixel(x, y < height ? y : y - 1); else - c = bm.GetPixel(x < width ? x * 2 : x * 2 - 1, - y < height ? y * 2 : y * 2 - 1); + c = bm.GetPixel(x * 2, y < height ? y * 2 : y * 2 - 1); redBytes[byteNdx] = c.R; greenBytes[byteNdx] = c.G; @@ -113,6 +114,17 @@ namespace PrimMesher ++byteNdx; } + + if (smallMap) + c = bm.GetPixel(width - 1, y < height ? y : y - 1); + else + c = bm.GetPixel(width * 2 - 1, y < height ? y * 2 : y * 2 - 1); + + redBytes[byteNdx] = c.R; + greenBytes[byteNdx] = c.G; + blueBytes[byteNdx] = c.B; + + ++byteNdx; } } catch (Exception e) @@ -160,14 +172,25 @@ namespace PrimMesher Bitmap scaledImage = new Bitmap(destWidth, destHeight, PixelFormat.Format24bppRgb); Color c; - float xscale = srcImage.Width / destWidth; - float yscale = srcImage.Height / destHeight; + + + // will let last step to be eventually diferent, as seems to be in sl + + float xscale = (float)srcImage.Width / (float)destWidth; + float yscale = (float)srcImage.Height / (float)destHeight; + + int lastsx = srcImage.Width - 1; + int lastsy = srcImage.Height - 1; + int lastdx = destWidth - 1; + int lastdy = destHeight - 1; float sy = 0.5f; - for (int y = 0; y < destHeight; y++) + float sx; + + for (int y = 0; y < lastdy; y++) { - float sx = 0.5f; - for (int x = 0; x < destWidth; x++) + sx = 0.5f; + for (int x = 0; x < lastdx; x++) { try { @@ -177,11 +200,43 @@ namespace PrimMesher catch (IndexOutOfRangeException) { } - sx += xscale; } + try + { + c = srcImage.GetPixel(lastsx, (int)(sy)); + scaledImage.SetPixel(lastdx, y, Color.FromArgb(c.R, c.G, c.B)); + } + catch (IndexOutOfRangeException) + { + } + sy += yscale; } + + sx = 0.5f; + for (int x = 0; x < lastdx; x++) + { + try + { + c = srcImage.GetPixel((int)(sx), lastsy); + scaledImage.SetPixel(x, lastdy, Color.FromArgb(c.R, c.G, c.B)); + } + catch (IndexOutOfRangeException) + { + } + + sx += xscale; + } + try + { + c = srcImage.GetPixel(lastsx, lastsy); + scaledImage.SetPixel(lastdx, lastdy, Color.FromArgb(c.R, c.G, c.B)); + } + catch (IndexOutOfRangeException) + { + } + srcImage.Dispose(); return scaledImage; } -- cgit v1.1