* Valid Sculpted prim now collide properly.
* The first time you set the sculpted texture of a prim you might have to futz with it to get it to generate a sculpted physics proxy * Note that there are already issues in Trunk, (such as the prim scaling issue and prim jumping issue. Essentially editing is difficult right now) * This just adds to the experimental nature of trunk. :D0.6.0-stable
parent
74df815630
commit
b7baa3cd2a
|
@ -1134,7 +1134,7 @@ namespace OpenSim.Region.Environment.Scenes
|
|||
SceneObjectPart rootPart = group.GetChildPart(group.UUID);
|
||||
rootPart.ObjectFlags &= ~(uint)LLObject.ObjectFlags.Scripted;
|
||||
rootPart.TrimPermissions();
|
||||
|
||||
group.CheckSculptAndLoad();
|
||||
group.ApplyPhysics(m_physicalPrim);
|
||||
//rootPart.DoPhysicsPropertyUpdate(UsePhysics, true);
|
||||
}
|
||||
|
|
|
@ -2546,5 +2546,18 @@ namespace OpenSim.Region.Environment.Scenes
|
|||
}
|
||||
return retmass;
|
||||
}
|
||||
public void CheckSculptAndLoad()
|
||||
{
|
||||
lock (m_parts)
|
||||
{
|
||||
foreach (SceneObjectPart part in m_parts.Values)
|
||||
{
|
||||
if (part.Shape.SculptEntry && part.Shape.SculptTexture != LLUUID.Zero)
|
||||
{
|
||||
m_scene.AssetCache.GetAsset(part.Shape.SculptTexture, part.SculptTextureCallback, true);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1568,6 +1568,10 @@ namespace OpenSim.Region.Environment.Scenes
|
|||
byte[] extraP = new byte[Shape.ExtraParams.Length];
|
||||
Array.Copy(Shape.ExtraParams, extraP, extraP.Length);
|
||||
dupe.Shape.ExtraParams = extraP;
|
||||
if (dupe.m_shape.SculptEntry && dupe.m_shape.SculptTexture != LLUUID.Zero)
|
||||
{
|
||||
m_parentGroup.Scene.AssetCache.GetAsset(dupe.m_shape.SculptTexture, dupe.SculptTextureCallback, true);
|
||||
}
|
||||
bool UsePhysics = ((dupe.ObjectFlags & (uint) LLObject.ObjectFlags.Physics) != 0);
|
||||
dupe.DoPhysicsPropertyUpdate(UsePhysics, true);
|
||||
|
||||
|
@ -1939,6 +1943,10 @@ namespace OpenSim.Region.Environment.Scenes
|
|||
if (texture != null)
|
||||
{
|
||||
m_shape.SculptData = texture.Data;
|
||||
if (PhysActor != null)
|
||||
{
|
||||
PhysActor.Shape = m_shape;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -1209,7 +1209,29 @@ namespace OpenSim.Region.Physics.Meshing
|
|||
|
||||
return m;
|
||||
}
|
||||
private SculptMesh CreateSculptMesh(string primName, PrimitiveBaseShape primShape, PhysicsVector size)
|
||||
{
|
||||
SculptMesh sm = new SculptMesh(primShape.SculptData);
|
||||
// Scale the mesh based on our prim scale
|
||||
foreach (Vertex v in sm.vertices)
|
||||
{
|
||||
v.X *= 0.5f;
|
||||
v.Y *= 0.5f;
|
||||
v.Z *= 0.5f;
|
||||
v.X *= size.X;
|
||||
v.Y *= size.Y;
|
||||
v.Z *= size.Z;
|
||||
}
|
||||
// This was built with the normals pointing inside..
|
||||
// therefore we have to invert the normals
|
||||
foreach (Triangle t in sm.triangles)
|
||||
{
|
||||
t.invertNormal();
|
||||
}
|
||||
sm.DumpRaw(baseDir, primName, "Sculpt");
|
||||
return sm;
|
||||
|
||||
}
|
||||
public static void CalcNormals(Mesh mesh)
|
||||
{
|
||||
int iTriangles = mesh.triangles.Count;
|
||||
|
@ -1317,43 +1339,53 @@ namespace OpenSim.Region.Physics.Meshing
|
|||
public IMesh CreateMesh(String primName, PrimitiveBaseShape primShape, PhysicsVector size)
|
||||
{
|
||||
Mesh mesh = null;
|
||||
|
||||
switch (primShape.ProfileShape)
|
||||
if (primShape.SculptEntry && primShape.SculptType != (byte)0 && primShape.SculptData.Length > 0)
|
||||
{
|
||||
case ProfileShape.Square:
|
||||
mesh = CreateBoxMesh(primName, primShape, size);
|
||||
CalcNormals(mesh);
|
||||
break;
|
||||
case ProfileShape.Circle:
|
||||
if (primShape.PathCurve == (byte)Extrusion.Straight)
|
||||
{
|
||||
mesh = CreateCyllinderMesh(primName, primShape, size);
|
||||
SculptMesh smesh = CreateSculptMesh(primName, primShape, size);
|
||||
mesh = (Mesh)smesh;
|
||||
CalcNormals(mesh);
|
||||
}
|
||||
else
|
||||
{
|
||||
switch (primShape.ProfileShape)
|
||||
{
|
||||
case ProfileShape.Square:
|
||||
mesh = CreateBoxMesh(primName, primShape, size);
|
||||
CalcNormals(mesh);
|
||||
}
|
||||
break;
|
||||
case ProfileShape.HalfCircle:
|
||||
if (primShape.PathCurve == (byte)Extrusion.Curve1)
|
||||
{
|
||||
mesh = CreateSphereMesh(primName, primShape, size);
|
||||
break;
|
||||
case ProfileShape.Circle:
|
||||
if (primShape.PathCurve == (byte)Extrusion.Straight)
|
||||
{
|
||||
mesh = CreateCyllinderMesh(primName, primShape, size);
|
||||
CalcNormals(mesh);
|
||||
}
|
||||
break;
|
||||
case ProfileShape.HalfCircle:
|
||||
if (primShape.PathCurve == (byte)Extrusion.Curve1)
|
||||
{
|
||||
mesh = CreateSphereMesh(primName, primShape, size);
|
||||
CalcNormals(mesh);
|
||||
}
|
||||
break;
|
||||
|
||||
case ProfileShape.EquilateralTriangle:
|
||||
mesh = CreatePrismMesh(primName, primShape, size);
|
||||
CalcNormals(mesh);
|
||||
}
|
||||
break;
|
||||
break;
|
||||
|
||||
case ProfileShape.EquilateralTriangle:
|
||||
mesh = CreatePrismMesh(primName, primShape, size);
|
||||
CalcNormals(mesh);
|
||||
break;
|
||||
|
||||
default:
|
||||
mesh = CreateBoxMesh(primName, primShape, size);
|
||||
CalcNormals(mesh);
|
||||
//Set default mesh to cube otherwise it'll return
|
||||
// null and crash on the 'setMesh' method in the physics plugins.
|
||||
//mesh = null;
|
||||
break;
|
||||
default:
|
||||
mesh = CreateBoxMesh(primName, primShape, size);
|
||||
CalcNormals(mesh);
|
||||
//Set default mesh to cube otherwise it'll return
|
||||
// null and crash on the 'setMesh' method in the physics plugins.
|
||||
//mesh = null;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return mesh;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,3 +1,30 @@
|
|||
/*
|
||||
* Copyright (c) Contributors, http://opensimulator.org/
|
||||
* 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 OpenSim 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.
|
||||
*/
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Drawing;
|
||||
|
@ -8,23 +35,34 @@ using Image = System.Drawing.Image;
|
|||
|
||||
namespace OpenSim.Region.Physics.Meshing
|
||||
{
|
||||
// This functionality based on the XNA SculptPreview by John Hurliman.
|
||||
public class SculptMesh : Mesh
|
||||
{
|
||||
Image idata = null;
|
||||
Bitmap bLOD = null;
|
||||
Bitmap bBitmap = null;
|
||||
|
||||
Vertex northpole = (Vertex)Vertex.Zero;
|
||||
Vertex southpole = (Vertex)Vertex.Zero;
|
||||
Vertex northpole = new Vertex(0, 0, 0);
|
||||
Vertex southpole = new Vertex(0, 0, 0);
|
||||
|
||||
private int lod = 64;
|
||||
private int lod = 32;
|
||||
private const float RANGE = 128.0f;
|
||||
|
||||
public SculptMesh(byte[] jpegData)
|
||||
{
|
||||
idata = OpenJPEG.DecodeToImage(jpegData);
|
||||
if (idata != null)
|
||||
{
|
||||
bBitmap = new Bitmap(idata);
|
||||
if (bBitmap.Width == bBitmap.Height)
|
||||
{
|
||||
DoLOD();
|
||||
|
||||
LoadPoles();
|
||||
|
||||
processSculptTexture();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
@ -37,17 +75,18 @@ namespace OpenSim.Region.Physics.Meshing
|
|||
}
|
||||
private void LoadPoles()
|
||||
{
|
||||
northpole = (Vertex)Vertex.Zero;
|
||||
for (int x = 0; x < bBitmap.Width; x++)
|
||||
northpole = new Vertex(0, 0, 0);
|
||||
for (int x = 0; x < bLOD.Width; x++)
|
||||
{
|
||||
northpole += ColorToVertex(GetPixel(0, 0));
|
||||
}
|
||||
northpole /= bBitmap.Width;
|
||||
northpole /= bLOD.Width;
|
||||
|
||||
southpole = (Vertex)Vertex.Zero;
|
||||
for (int x = 0; x < bBitmap.Width; x++)
|
||||
southpole = new Vertex(0, 0, 0);
|
||||
for (int x = 0; x < bLOD.Width; x++)
|
||||
{
|
||||
southpole += ColorToVertex(GetPixel(bBitmap.Height - 1, (bBitmap.Height - 1)));
|
||||
//System.Console.WriteLine("Height: " + bLOD.Height.ToString());
|
||||
southpole += ColorToVertex(GetPixel(bLOD.Height - 1, (bLOD.Height - 1)));
|
||||
}
|
||||
southpole /= bBitmap.Width;
|
||||
}
|
||||
|
@ -182,12 +221,16 @@ namespace OpenSim.Region.Physics.Meshing
|
|||
{
|
||||
v1 = ColorToVertex(GetPixel(x, y));
|
||||
}
|
||||
|
||||
// Add the vertex for use later
|
||||
Add(v1);
|
||||
if (!vertices.Contains(v1))
|
||||
Add(v1);
|
||||
|
||||
sVertices[y * COLUMNS + x] = v1;
|
||||
//System.Console.WriteLine("adding: " + v1.ToString());
|
||||
}
|
||||
Vertex tempVertex = vertices[y * COLUMNS];
|
||||
sVertices[y * COLUMNS + x_max] = tempVertex;
|
||||
//Vertex tempVertex = vertices[y * COLUMNS];
|
||||
// sVertices[y * COLUMNS + x_max] = tempVertex;
|
||||
}
|
||||
|
||||
// Create the Triangles
|
||||
|
@ -199,32 +242,77 @@ namespace OpenSim.Region.Physics.Meshing
|
|||
|
||||
for (x = 0; x < x_max; x++)
|
||||
{
|
||||
Triangle tri1 = new Triangle(sVertices[(y * COLUMNS + x)], sVertices[(y * COLUMNS + (x + 1))],
|
||||
sVertices[((y + 1) * COLUMNS + (x + 1))]);
|
||||
//indices[i++] = (ushort)(y * COLUMNS + x);
|
||||
//indices[i++] = (ushort)(y * COLUMNS + (x + 1));
|
||||
//indices[i++] = (ushort)((y + 1) * COLUMNS + (x + 1));
|
||||
Add(tri1);
|
||||
Triangle tri2 = new Triangle(sVertices[(y * COLUMNS + x)],sVertices[((y + 1) * COLUMNS + (x + 1))],
|
||||
sVertices[((y + 1) * COLUMNS + x)]);
|
||||
Vertex vt11 = sVertices[(y * COLUMNS + x)];
|
||||
Vertex vt12 = sVertices[(y * COLUMNS + (x + 1))];
|
||||
Vertex vt13 = sVertices[((y + 1) * COLUMNS + (x + 1))];
|
||||
if (vt11 != null && vt12 != null && vt13 != null)
|
||||
{
|
||||
if (vt11 != vt12 && vt11 != vt13 && vt12 != vt13)
|
||||
{
|
||||
Triangle tri1 = new Triangle(vt11, vt12, vt13);
|
||||
//indices[i++] = (ushort)(y * COLUMNS + x);
|
||||
//indices[i++] = (ushort)(y * COLUMNS + (x + 1));
|
||||
//indices[i++] = (ushort)((y + 1) * COLUMNS + (x + 1));
|
||||
Add(tri1);
|
||||
}
|
||||
}
|
||||
|
||||
Add(tri2);
|
||||
//indices[i++] = (ushort)(y * COLUMNS + x);
|
||||
//indices[i++] = (ushort)((y + 1) * COLUMNS + (x + 1));
|
||||
//indices[i++] = (ushort)((y + 1) * COLUMNS + x);
|
||||
Vertex vt21 = sVertices[(y * COLUMNS + x)];
|
||||
Vertex vt22 = sVertices[((y + 1) * COLUMNS + (x + 1))];
|
||||
Vertex vt23 = sVertices[((y + 1) * COLUMNS + x)];
|
||||
if (vt21 != null && vt22 != null && vt23 != null)
|
||||
{
|
||||
if (vt21.Equals(vt22, 0.022f) || vt21.Equals(vt23, 0.022f) || vt22.Equals(vt23, 0.022f))
|
||||
{
|
||||
}
|
||||
else
|
||||
{
|
||||
Triangle tri2 = new Triangle(vt21, vt22, vt23);
|
||||
//indices[i++] = (ushort)(y * COLUMNS + x);
|
||||
//indices[i++] = (ushort)((y + 1) * COLUMNS + (x + 1));
|
||||
//indices[i++] = (ushort)((y + 1) * COLUMNS + x);
|
||||
Add(tri2);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
Triangle tri3 = new Triangle(sVertices[(y * x_max + x)], sVertices[(y * x_max + 0)], sVertices[((y + 1) * x_max + 0)]);
|
||||
Add(tri3);
|
||||
// Wrap the last cell in the row around
|
||||
//indices[i++] = (ushort)(y * x_max + x); //a
|
||||
//indices[i++] = (ushort)(y * x_max + 0); //b
|
||||
//indices[i++] = (ushort)((y + 1) * x_max + 0); //c
|
||||
|
||||
Triangle tri4 = new Triangle(sVertices[(y * x_max + x)], sVertices[((y + 1) * x_max + 0)], sVertices[((y + 1) * x_max + x)]);
|
||||
Add(tri4);
|
||||
//indices[i++] = (ushort)(y * x_max + x); //a
|
||||
//indices[i++] = (ushort)((y + 1) * x_max + 0); //b
|
||||
//indices[i++] = (ushort)((y + 1) * x_max + x); //c
|
||||
Vertex vt31 = sVertices[(y * x_max + x)];
|
||||
Vertex vt32 = sVertices[(y * x_max + 0)];
|
||||
Vertex vt33 = sVertices[((y + 1) * x_max + 0)];
|
||||
if (vt31 != null && vt32 != null && vt33 != null)
|
||||
{
|
||||
if (vt31.Equals(vt32, 0.022f) || vt31.Equals(vt33, 0.022f) || vt32.Equals(vt33, 0.022f))
|
||||
{
|
||||
}
|
||||
else
|
||||
{
|
||||
//Triangle tri3 = new Triangle(vt31, vt32, vt33);
|
||||
// Wrap the last cell in the row around
|
||||
//indices[i++] = (ushort)(y * x_max + x); //a
|
||||
//indices[i++] = (ushort)(y * x_max + 0); //b
|
||||
//indices[i++] = (ushort)((y + 1) * x_max + 0); //c
|
||||
//Add(tri3);
|
||||
}
|
||||
}
|
||||
|
||||
Vertex vt41 = sVertices[(y * x_max + x)];
|
||||
Vertex vt42 = sVertices[((y + 1) * x_max + 0)];
|
||||
Vertex vt43 = sVertices[((y + 1) * x_max + x)];
|
||||
if (vt41 != null && vt42 != null && vt43 != null)
|
||||
{
|
||||
if (vt41.Equals(vt42, 0.022f) || vt31.Equals(vt43, 0.022f) || vt32.Equals(vt43, 0.022f))
|
||||
{
|
||||
}
|
||||
else
|
||||
{
|
||||
//Triangle tri4 = new Triangle(vt41, vt42, vt43);
|
||||
//indices[i++] = (ushort)(y * x_max + x); //a
|
||||
//indices[i++] = (ushort)((y + 1) * x_max + 0); //b
|
||||
//indices[i++] = (ushort)((y + 1) * x_max + x); //c
|
||||
//Add(tri4);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue