some initial work on new prim meshing routines (incomplete)
parent
ccd74f888b
commit
df14889635
|
@ -0,0 +1,176 @@
|
|||
/*
|
||||
* 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 OpenSim.Framework;
|
||||
using OpenSim.Region.Physics.Manager;
|
||||
|
||||
namespace OpenSim.Region.Physics.Meshing
|
||||
{
|
||||
public struct vertex
|
||||
{
|
||||
public float X;
|
||||
public float Y;
|
||||
public float Z;
|
||||
|
||||
public vertex(float x, float y, float z)
|
||||
{
|
||||
this.X = x;
|
||||
this.Y = y;
|
||||
this.Z = z;
|
||||
}
|
||||
}
|
||||
|
||||
public struct face
|
||||
{
|
||||
public int v1;
|
||||
public int v2;
|
||||
public int v3;
|
||||
|
||||
public face(int v1, int v2, int v3)
|
||||
{
|
||||
this.v1 = v1;
|
||||
this.v2 = v2;
|
||||
this.v3 = v3;
|
||||
}
|
||||
}
|
||||
|
||||
internal struct Angle
|
||||
{
|
||||
internal float angle;
|
||||
internal float X;
|
||||
internal float Y;
|
||||
|
||||
internal Angle(float angle, float x, float y)
|
||||
{
|
||||
this.angle = angle;
|
||||
this.X = x;
|
||||
this.Y = y;
|
||||
}
|
||||
}
|
||||
|
||||
internal class AngleList
|
||||
{
|
||||
private float iX, iY; // intersection point
|
||||
private void intersection( float x1, float y1, float x2, float y2, float x3, float y3, float x4, float y4)
|
||||
{ // ref: http://local.wasp.uwa.edu.au/~pbourke/geometry/lineline2d/
|
||||
float denom = (y4 - y3) * (x2 - x1) - (x4 - x3) * (y2 - y1);
|
||||
float uaNumerator = (x4 - x3) * (y1 - y3) - (y4 - y3) * (x1 - x3);
|
||||
|
||||
if (denom != 0.0)
|
||||
{
|
||||
float ua = uaNumerator / denom;
|
||||
iX = x1 + ua * (x2 - x1);
|
||||
iY = y1 + ua * (y2 - y1);
|
||||
}
|
||||
}
|
||||
|
||||
internal List<Angle> angles;
|
||||
|
||||
// this class should have a table of most commonly computed values
|
||||
// instead of all the trig function calls
|
||||
// most common would be for sides = 3, 4, or 24
|
||||
AngleList( int sides, float startAngle, float stopAngle )
|
||||
{
|
||||
angles = new List<Angle>();
|
||||
double twoPi = System.Math.PI * 2.0;
|
||||
double stepSize = twoPi / sides;
|
||||
|
||||
int startStep = (int) (startAngle / stepSize);
|
||||
double angle = stepSize * startStep;
|
||||
int step = startStep;
|
||||
double stopAngleTest = stopAngle;
|
||||
if (stopAngle < twoPi)
|
||||
{
|
||||
stopAngleTest = stepSize * (int)(stopAngle / stepSize) + 1;
|
||||
if (stopAngleTest < stopAngle)
|
||||
stopAngleTest += stepSize;
|
||||
if (stopAngleTest > twoPi)
|
||||
stopAngleTest = twoPi;
|
||||
}
|
||||
|
||||
while (angle <= stopAngleTest)
|
||||
{
|
||||
Angle newAngle;
|
||||
newAngle.angle = (float) angle;
|
||||
newAngle.X = (float) System.Math.Cos(angle);
|
||||
newAngle.Y = (float) System.Math.Sin(angle);
|
||||
angles.Add(newAngle);
|
||||
step += 1;
|
||||
angle = stepSize * step;
|
||||
}
|
||||
|
||||
if (startAngle > angles[0].angle)
|
||||
{
|
||||
Angle newAngle;
|
||||
intersection(angles[0].X, angles[0].Y, angles[1].X, angles[1].Y, 0.0f, 0.0f, (float)Math.Cos(startAngle), (float)Math.Sin(startAngle));
|
||||
newAngle.angle = startAngle;
|
||||
newAngle.X = iX;
|
||||
newAngle.Y = iY;
|
||||
angles[0] = newAngle;
|
||||
}
|
||||
|
||||
int index = angles.Count - 1;
|
||||
if (stopAngle < angles[index].angle)
|
||||
{
|
||||
Angle newAngle;
|
||||
intersection(angles[index - 1].X, angles[index - 1].Y, angles[index].X, angles[index].Y, 0.0f, 0.0f, (float)Math.Cos(stopAngle), (float)Math.Sin(stopAngle));
|
||||
newAngle.angle = stopAngle;
|
||||
newAngle.X = iX;
|
||||
newAngle.Y = iY;
|
||||
angles[index] = newAngle;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
internal class PrimProfile
|
||||
{
|
||||
internal List<vertex> vertices;
|
||||
internal List<face> faces;
|
||||
|
||||
PrimProfile()
|
||||
{
|
||||
vertices = new List<vertex>();
|
||||
faces = new List<face>();
|
||||
}
|
||||
}
|
||||
|
||||
public class PrimMesher
|
||||
{
|
||||
public List<vertex> vertices;
|
||||
public List<face> faces;
|
||||
|
||||
PrimMesher()
|
||||
{
|
||||
vertices = new List<vertex>();
|
||||
faces = new List<face>();
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue