some initial work on new prim meshing routines (incomplete)

0.6.0-stable
Dahlia Trimble 2008-08-23 08:33:00 +00:00
parent ccd74f888b
commit df14889635
1 changed files with 176 additions and 0 deletions

View File

@ -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>();
}
}
}