mirror of
https://github.com/justasabc/UnityOpenSimClient.git
synced 2026-08-14 09:02:36 +00:00
add rendering for avatar
This commit is contained in:
@@ -0,0 +1,4 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 645a156f3902da1448c64094df7f8224
|
||||
DefaultImporter:
|
||||
userData:
|
||||
@@ -0,0 +1,4 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 119df583b9908444baf9d1bb86f6008c
|
||||
DefaultImporter:
|
||||
userData:
|
||||
Binary file not shown.
@@ -0,0 +1,4 @@
|
||||
fileFormatVersion: 2
|
||||
guid: cebdc449e3df4427c89249abb75ab7a2
|
||||
NativeFormatImporter:
|
||||
userData:
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
fileFormatVersion: 2
|
||||
guid: e9397f1cc72425345ae40b516554892b
|
||||
guid: 43121e4fc44b64b47b464561b5a5e4c8
|
||||
DefaultImporter:
|
||||
userData:
|
||||
|
||||
Binary file not shown.
@@ -0,0 +1,7 @@
|
||||
fileFormatVersion: 2
|
||||
guid: bb0563889a0b8b849b0e0e6ee82d5bb9
|
||||
MonoAssemblyImporter:
|
||||
serializedVersion: 1
|
||||
iconMap: {}
|
||||
executionOrder: {}
|
||||
userData:
|
||||
Binary file not shown.
@@ -0,0 +1,7 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 502fc75f4ed83ab438df2742e48f9a05
|
||||
MonoAssemblyImporter:
|
||||
serializedVersion: 1
|
||||
iconMap: {}
|
||||
executionOrder: {}
|
||||
userData:
|
||||
Binary file not shown.
@@ -0,0 +1,7 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 47b3efd7d12758c43afec3d6a96d4d2d
|
||||
MonoAssemblyImporter:
|
||||
serializedVersion: 1
|
||||
iconMap: {}
|
||||
executionOrder: {}
|
||||
userData:
|
||||
Binary file not shown.
@@ -0,0 +1,7 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 0c838acf0293e61479a6bdbb29adc0e2
|
||||
MonoAssemblyImporter:
|
||||
serializedVersion: 1
|
||||
iconMap: {}
|
||||
executionOrder: {}
|
||||
userData:
|
||||
Binary file not shown.
@@ -0,0 +1,7 @@
|
||||
fileFormatVersion: 2
|
||||
guid: ea3da258fbe548d409cd28f34bcf8681
|
||||
MonoAssemblyImporter:
|
||||
serializedVersion: 1
|
||||
iconMap: {}
|
||||
executionOrder: {}
|
||||
userData:
|
||||
Binary file not shown.
@@ -0,0 +1,7 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 069ce17854431444f9b33b5ad95e2f04
|
||||
MonoAssemblyImporter:
|
||||
serializedVersion: 1
|
||||
iconMap: {}
|
||||
executionOrder: {}
|
||||
userData:
|
||||
Binary file not shown.
@@ -0,0 +1,7 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 897bdd45df3315f4389e81f5d805e5fb
|
||||
MonoAssemblyImporter:
|
||||
serializedVersion: 1
|
||||
iconMap: {}
|
||||
executionOrder: {}
|
||||
userData:
|
||||
Binary file not shown.
@@ -0,0 +1,7 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 68379aac2a76c11459fec2559cf65d85
|
||||
MonoAssemblyImporter:
|
||||
serializedVersion: 1
|
||||
iconMap: {}
|
||||
executionOrder: {}
|
||||
userData:
|
||||
Binary file not shown.
@@ -0,0 +1,7 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 834bec4d5f5fe12428755c20f9ffbb26
|
||||
MonoAssemblyImporter:
|
||||
serializedVersion: 1
|
||||
iconMap: {}
|
||||
executionOrder: {}
|
||||
userData:
|
||||
@@ -1,4 +1,4 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 89c98088dfae49d4a851fa03b9336396
|
||||
guid: 1669161240056074ca0257dc0cb4fa67
|
||||
DefaultImporter:
|
||||
userData:
|
||||
|
||||
Binary file not shown.
@@ -0,0 +1,13 @@
|
||||
using UnityEngine;
|
||||
using System.Collections;
|
||||
using OpenMetaverse;
|
||||
using Radegast.Rendering;
|
||||
|
||||
public class SceneWindow
|
||||
{
|
||||
public void StartShiny(){}
|
||||
public bool TryGetTextureInfo(UUID textureID, out TextureInfo info){
|
||||
info = new TextureInfo();
|
||||
return false;}
|
||||
public void DownloadTexture(TextureLoadItem item, bool force){}
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: bc2e13b17621a584b86a1c9278b59f28
|
||||
MonoImporter:
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
@@ -0,0 +1,232 @@
|
||||
#region --- MIT License ---
|
||||
/* Licensed under the MIT/X11 license.
|
||||
* Copyright (c) 2011 mjt
|
||||
* This notice may not be removed from any source distribution.
|
||||
* See license.txt for licensing details.
|
||||
*/
|
||||
#endregion
|
||||
/*
|
||||
* tutoriaali:
|
||||
* http://www.crownandcutlass.com/features/technicaldetails/frustum.html
|
||||
*
|
||||
*/
|
||||
|
||||
using System;
|
||||
using OpenMetaverse;
|
||||
//using OpenTK.Graphics.OpenGL;
|
||||
//using OpenTK;
|
||||
|
||||
namespace Radegast.Rendering
|
||||
{
|
||||
public class Frustum
|
||||
{
|
||||
//static Matrix4 ProjMatrix, ModelMatrix;
|
||||
static float[] ClipMatrix = new float[16];
|
||||
static float[,] frustum = new float[6, 4];
|
||||
const int RIGHT = 0, LEFT = 1, BOTTOM = 2, TOP = 3, BACK = 4, FRONT = 5;
|
||||
|
||||
static void NormalizePlane(float[,] frustum, int side)
|
||||
{
|
||||
float magnitude = (float)Math.Sqrt((frustum[side, 0] * frustum[side, 0]) + (frustum[side, 1] * frustum[side, 1])
|
||||
+ (frustum[side, 2] * frustum[side, 2]));
|
||||
|
||||
frustum[side, 0] /= magnitude;
|
||||
frustum[side, 1] /= magnitude;
|
||||
frustum[side, 2] /= magnitude;
|
||||
frustum[side, 3] /= magnitude;
|
||||
}
|
||||
|
||||
public static void CalculateFrustum(OpenTK.Matrix4 ProjMatrix, OpenTK.Matrix4 ModelMatrix)
|
||||
{
|
||||
ClipMatrix[0] = (ModelMatrix.M11 * ProjMatrix.M11) + (ModelMatrix.M12 * ProjMatrix.M21) + (ModelMatrix.M13 * ProjMatrix.M31) + (ModelMatrix.M14 * ProjMatrix.M41);
|
||||
ClipMatrix[1] = (ModelMatrix.M11 * ProjMatrix.M12) + (ModelMatrix.M12 * ProjMatrix.M22) + (ModelMatrix.M13 * ProjMatrix.M32) + (ModelMatrix.M14 * ProjMatrix.M42);
|
||||
ClipMatrix[2] = (ModelMatrix.M11 * ProjMatrix.M13) + (ModelMatrix.M12 * ProjMatrix.M23) + (ModelMatrix.M13 * ProjMatrix.M33) + (ModelMatrix.M14 * ProjMatrix.M43);
|
||||
ClipMatrix[3] = (ModelMatrix.M11 * ProjMatrix.M14) + (ModelMatrix.M12 * ProjMatrix.M24) + (ModelMatrix.M13 * ProjMatrix.M34) + (ModelMatrix.M14 * ProjMatrix.M44);
|
||||
|
||||
ClipMatrix[4] = (ModelMatrix.M21 * ProjMatrix.M11) + (ModelMatrix.M22 * ProjMatrix.M21) + (ModelMatrix.M23 * ProjMatrix.M31) + (ModelMatrix.M24 * ProjMatrix.M41);
|
||||
ClipMatrix[5] = (ModelMatrix.M21 * ProjMatrix.M12) + (ModelMatrix.M22 * ProjMatrix.M22) + (ModelMatrix.M23 * ProjMatrix.M32) + (ModelMatrix.M24 * ProjMatrix.M42);
|
||||
ClipMatrix[6] = (ModelMatrix.M21 * ProjMatrix.M13) + (ModelMatrix.M22 * ProjMatrix.M23) + (ModelMatrix.M23 * ProjMatrix.M33) + (ModelMatrix.M24 * ProjMatrix.M43);
|
||||
ClipMatrix[7] = (ModelMatrix.M21 * ProjMatrix.M14) + (ModelMatrix.M22 * ProjMatrix.M24) + (ModelMatrix.M23 * ProjMatrix.M34) + (ModelMatrix.M24 * ProjMatrix.M44);
|
||||
|
||||
ClipMatrix[8] = (ModelMatrix.M31 * ProjMatrix.M11) + (ModelMatrix.M32 * ProjMatrix.M21) + (ModelMatrix.M33 * ProjMatrix.M31) + (ModelMatrix.M34 * ProjMatrix.M41);
|
||||
ClipMatrix[9] = (ModelMatrix.M31 * ProjMatrix.M12) + (ModelMatrix.M32 * ProjMatrix.M22) + (ModelMatrix.M33 * ProjMatrix.M32) + (ModelMatrix.M34 * ProjMatrix.M42);
|
||||
ClipMatrix[10] = (ModelMatrix.M31 * ProjMatrix.M13) + (ModelMatrix.M32 * ProjMatrix.M23) + (ModelMatrix.M33 * ProjMatrix.M33) + (ModelMatrix.M34 * ProjMatrix.M43);
|
||||
ClipMatrix[11] = (ModelMatrix.M31 * ProjMatrix.M14) + (ModelMatrix.M32 * ProjMatrix.M24) + (ModelMatrix.M33 * ProjMatrix.M34) + (ModelMatrix.M34 * ProjMatrix.M44);
|
||||
|
||||
ClipMatrix[12] = (ModelMatrix.M41 * ProjMatrix.M11) + (ModelMatrix.M42 * ProjMatrix.M21) + (ModelMatrix.M43 * ProjMatrix.M31) + (ModelMatrix.M44 * ProjMatrix.M41);
|
||||
ClipMatrix[13] = (ModelMatrix.M41 * ProjMatrix.M12) + (ModelMatrix.M42 * ProjMatrix.M22) + (ModelMatrix.M43 * ProjMatrix.M32) + (ModelMatrix.M44 * ProjMatrix.M42);
|
||||
ClipMatrix[14] = (ModelMatrix.M41 * ProjMatrix.M13) + (ModelMatrix.M42 * ProjMatrix.M23) + (ModelMatrix.M43 * ProjMatrix.M33) + (ModelMatrix.M44 * ProjMatrix.M43);
|
||||
ClipMatrix[15] = (ModelMatrix.M41 * ProjMatrix.M14) + (ModelMatrix.M42 * ProjMatrix.M24) + (ModelMatrix.M43 * ProjMatrix.M34) + (ModelMatrix.M44 * ProjMatrix.M44);
|
||||
|
||||
// laske frustumin tasot ja normalisoi ne
|
||||
frustum[RIGHT, 0] = ClipMatrix[3] - ClipMatrix[0];
|
||||
frustum[RIGHT, 1] = ClipMatrix[7] - ClipMatrix[4];
|
||||
frustum[RIGHT, 2] = ClipMatrix[11] - ClipMatrix[8];
|
||||
frustum[RIGHT, 3] = ClipMatrix[15] - ClipMatrix[12];
|
||||
NormalizePlane(frustum, RIGHT);
|
||||
|
||||
frustum[LEFT, 0] = ClipMatrix[3] + ClipMatrix[0];
|
||||
frustum[LEFT, 1] = ClipMatrix[7] + ClipMatrix[4];
|
||||
frustum[LEFT, 2] = ClipMatrix[11] + ClipMatrix[8];
|
||||
frustum[LEFT, 3] = ClipMatrix[15] + ClipMatrix[12];
|
||||
NormalizePlane(frustum, LEFT);
|
||||
|
||||
frustum[BOTTOM, 0] = ClipMatrix[3] + ClipMatrix[1];
|
||||
frustum[BOTTOM, 1] = ClipMatrix[7] + ClipMatrix[5];
|
||||
frustum[BOTTOM, 2] = ClipMatrix[11] + ClipMatrix[9];
|
||||
frustum[BOTTOM, 3] = ClipMatrix[15] + ClipMatrix[13];
|
||||
NormalizePlane(frustum, BOTTOM);
|
||||
|
||||
frustum[TOP, 0] = ClipMatrix[3] - ClipMatrix[1];
|
||||
frustum[TOP, 1] = ClipMatrix[7] - ClipMatrix[5];
|
||||
frustum[TOP, 2] = ClipMatrix[11] - ClipMatrix[9];
|
||||
frustum[TOP, 3] = ClipMatrix[15] - ClipMatrix[13];
|
||||
NormalizePlane(frustum, TOP);
|
||||
|
||||
frustum[BACK, 0] = ClipMatrix[3] - ClipMatrix[2];
|
||||
frustum[BACK, 1] = ClipMatrix[7] - ClipMatrix[6];
|
||||
frustum[BACK, 2] = ClipMatrix[11] - ClipMatrix[10];
|
||||
frustum[BACK, 3] = ClipMatrix[15] - ClipMatrix[14];
|
||||
NormalizePlane(frustum, BACK);
|
||||
|
||||
frustum[FRONT, 0] = ClipMatrix[3] + ClipMatrix[2];
|
||||
frustum[FRONT, 1] = ClipMatrix[7] + ClipMatrix[6];
|
||||
frustum[FRONT, 2] = ClipMatrix[11] + ClipMatrix[10];
|
||||
frustum[FRONT, 3] = ClipMatrix[15] + ClipMatrix[14];
|
||||
NormalizePlane(frustum, FRONT);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// tasojen normaalit osoittaa sisäänpäin joten jos testattava vertex on
|
||||
/// kaikkien tasojen "edessä", se on ruudulla ja rendataan
|
||||
/// </summary>
|
||||
/// <param name="x"></param>
|
||||
/// <param name="y"></param>
|
||||
/// <param name="z"></param>
|
||||
/// <returns></returns>
|
||||
public static bool PointInFrustum(float x, float y, float z)
|
||||
{
|
||||
// tasoyhtälö: A*x + B*y + C*z + D = 0
|
||||
// ABC on normaalin X, Y ja Z
|
||||
// D on tason etäisyys origosta
|
||||
// =0 vertex on tasolla
|
||||
// <0 tason takana
|
||||
// >0 tason edessä
|
||||
for (int a = 0; a < 6; a++)
|
||||
{
|
||||
// jos vertex jonkun tason takana, niin palauta false (ei rendata)
|
||||
if (((frustum[a, 0] * x) + (frustum[a, 1] * y) + (frustum[a, 2] * z) + frustum[a, 3]) <= 0)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// ruudulla
|
||||
return true;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// palauttaa etäisyyden kameraan jos pallo frustumissa, muuten 0.
|
||||
/// </summary>
|
||||
/// <param name="x"></param>
|
||||
/// <param name="y"></param>
|
||||
/// <param name="z"></param>
|
||||
/// <param name="radius"></param>
|
||||
/// <returns></returns>
|
||||
public static float SphereInFrustum(float x, float y, float z, float radius)
|
||||
{
|
||||
float d = 0;
|
||||
for (int p = 0; p < 6; p++)
|
||||
{
|
||||
d = frustum[p, 0] * x + frustum[p, 1] * y + frustum[p, 2] * z + frustum[p, 3];
|
||||
if (d <= -radius) // jos pallo ei ole ruudulla
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
// kaikkien tasojen edessä eli näkyvissä.
|
||||
return d + radius; // palauta matka kameraan
|
||||
}
|
||||
|
||||
public static bool ObjectInFrustum(Vector3 position, BoundingVolume bound)
|
||||
{
|
||||
return ObjectInFrustum(position.X, position.Y, position.Z, bound);
|
||||
}
|
||||
|
||||
public static bool ObjectInFrustum(float x, float y, float z, BoundingVolume bound)
|
||||
{
|
||||
if (bound == null) return true;
|
||||
if (SphereInFrustum(x, y, z, bound.ScaledR) == 0) return false;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
public class BoundingVolume
|
||||
{
|
||||
Vector3 Min = new Vector3(99999, 99999, 99999);
|
||||
Vector3 Max = new Vector3(-99999, -99999, -99999);
|
||||
float R = 0f;
|
||||
|
||||
public Vector3 ScaledMin = new Vector3(99999, 99999, 99999);
|
||||
public Vector3 ScaledMax = new Vector3(-99999, -99999, -99999);
|
||||
public float ScaledR = 0f;
|
||||
|
||||
public void CalcScaled(Vector3 scale)
|
||||
{
|
||||
ScaledMin = Min * scale;
|
||||
ScaledMax = Max * scale;
|
||||
Vector3 dist = ScaledMax - ScaledMin;
|
||||
ScaledR = dist.Length();
|
||||
}
|
||||
|
||||
public void CreateBoundingVolume(OpenMetaverse.Rendering.Face mesh, Vector3 scale)
|
||||
{
|
||||
for (int q = 0; q < mesh.Vertices.Count; q++)
|
||||
{
|
||||
if (mesh.Vertices[q].Position.X < Min.X) Min.X = mesh.Vertices[q].Position.X;
|
||||
if (mesh.Vertices[q].Position.Y < Min.Y) Min.Y = mesh.Vertices[q].Position.Y;
|
||||
if (mesh.Vertices[q].Position.Z < Min.Z) Min.Z = mesh.Vertices[q].Position.Z;
|
||||
|
||||
if (mesh.Vertices[q].Position.X > Max.X) Max.X = mesh.Vertices[q].Position.X;
|
||||
if (mesh.Vertices[q].Position.Y > Max.Y) Max.Y = mesh.Vertices[q].Position.Y;
|
||||
if (mesh.Vertices[q].Position.Z > Max.Z) Max.Z = mesh.Vertices[q].Position.Z;
|
||||
}
|
||||
|
||||
Vector3 dist = Max - Min;
|
||||
R = dist.Length();
|
||||
mesh.Center = Min + (dist / 2);
|
||||
CalcScaled(scale);
|
||||
}
|
||||
|
||||
public void FromScale(Vector3 scale)
|
||||
{
|
||||
ScaledMax = scale / 2f;
|
||||
ScaledMin = -ScaledMax;
|
||||
Vector3 dist = ScaledMax - ScaledMin;
|
||||
ScaledR = dist.Length();
|
||||
}
|
||||
|
||||
public void AddVolume(BoundingVolume vol, Vector3 scale)
|
||||
{
|
||||
if (vol.Min.X < this.Min.X) this.Min.X = vol.Min.X;
|
||||
if (vol.Min.Y < this.Min.Y) this.Min.Y = vol.Min.Y;
|
||||
if (vol.Min.Z < this.Min.Z) this.Min.Z = vol.Min.Z;
|
||||
|
||||
if (vol.Max.X > this.Max.X) this.Max.X = vol.Max.X;
|
||||
if (vol.Max.Y > this.Max.Y) this.Max.Y = vol.Max.Y;
|
||||
if (vol.Max.Z > this.Max.Z) this.Max.Z = vol.Max.Z;
|
||||
Vector3 dist = Max - Min;
|
||||
R = dist.Length();
|
||||
CalcScaled(scale);
|
||||
}
|
||||
|
||||
//public void CreateBoundingVolume(Model mesh, Vector3 min, Vector3 max)
|
||||
//{
|
||||
// Min = min;
|
||||
// Max = max;
|
||||
// Vector3 dist = Max - Min;
|
||||
// R = dist.Length;
|
||||
// mesh.ObjCenter = Min + (dist / 2); // objektin keskikohta
|
||||
//}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: e19611bacca8d7146a836d68c7e01fe9
|
||||
MonoImporter:
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
Binary file not shown.
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: d243fd7b3fb9db640a3640c91d510f2f
|
||||
MonoImporter:
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
@@ -0,0 +1,665 @@
|
||||
//
|
||||
// Radegast Metaverse Client
|
||||
// Copyright (c) 2009-2013, Radegast Development Team
|
||||
// All rights reserved.
|
||||
//
|
||||
// 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 application "Radegast", nor the names of its
|
||||
// contributors may be used to endorse or promote products derived from
|
||||
// this software without specific prior CreateReflectionTexture permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT HOLDER OR 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.
|
||||
//
|
||||
// $Id$
|
||||
//
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using OpenTK.Graphics.OpenGL;
|
||||
using OpenMetaverse;
|
||||
using OpenMetaverse.Rendering;
|
||||
|
||||
namespace Radegast.Rendering
|
||||
{
|
||||
/// <summary>
|
||||
/// Contains per primitive face data
|
||||
/// </summary>
|
||||
public class FaceData : IDisposable
|
||||
{
|
||||
public float[] Vertices;
|
||||
public ushort[] Indices;
|
||||
public float[] TexCoords;
|
||||
public float[] Normals;
|
||||
public int PickingID = -1;
|
||||
public int VertexVBO = -1;
|
||||
public int IndexVBO = -1;
|
||||
public TextureInfo TextureInfo = new TextureInfo();
|
||||
public BoundingVolume BoundingVolume = new BoundingVolume();
|
||||
public static int VertexSize = 32; // sizeof (vertex), 2 x vector3 + 1 x vector2 = 8 floats x 4 bytes = 32 bytes
|
||||
public TextureAnimationInfo AnimInfo;
|
||||
public int QueryID = 0;
|
||||
public bool VBOFailed = false;
|
||||
|
||||
/// <summary>
|
||||
/// Dispose VBOs if we have them in graphics card memory
|
||||
/// </summary>
|
||||
public void Dispose()
|
||||
{//hack
|
||||
// if (VertexVBO != -1) Compat.DeleteBuffer(VertexVBO);
|
||||
// if (IndexVBO != -1) Compat.DeleteBuffer(IndexVBO);
|
||||
// VertexVBO = -1;
|
||||
// IndexVBO = -1;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Checks if VBOs are created, if they are, bind them, if not create new
|
||||
/// </summary>
|
||||
/// <param name="face">Which face's mesh is uploaded in this VBO</param>
|
||||
/// <returns>True, if face data was succesfully uploaded to the graphics card memory</returns>
|
||||
public bool CheckVBO(Face face)
|
||||
{//hack
|
||||
// if (VertexVBO == -1)
|
||||
// {
|
||||
// Vertex[] vArray = face.Vertices.ToArray();
|
||||
// Compat.GenBuffers(out VertexVBO);
|
||||
// Compat.BindBuffer(BufferTarget.ArrayBuffer, VertexVBO);
|
||||
// Compat.BufferData(BufferTarget.ArrayBuffer, (IntPtr)(vArray.Length * VertexSize), vArray, BufferUsageHint.StaticDraw);
|
||||
// if (Compat.BufferSize(BufferTarget.ArrayBuffer) != vArray.Length * VertexSize)
|
||||
// {
|
||||
// VBOFailed = true;
|
||||
// Compat.BindBuffer(BufferTarget.ArrayBuffer, 0);
|
||||
// Compat.DeleteBuffer(VertexVBO);
|
||||
// VertexVBO = -1;
|
||||
// return false;
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// if (IndexVBO == -1)
|
||||
// {
|
||||
// ushort[] iArray = face.Indices.ToArray();
|
||||
// Compat.GenBuffers(out IndexVBO);
|
||||
// Compat.BindBuffer(BufferTarget.ElementArrayBuffer, IndexVBO);
|
||||
// Compat.BufferData(BufferTarget.ElementArrayBuffer, (IntPtr)(iArray.Length * sizeof(ushort)), iArray, BufferUsageHint.StaticDraw);
|
||||
// if (Compat.BufferSize(BufferTarget.ElementArrayBuffer) != iArray.Length * sizeof(ushort))
|
||||
// {
|
||||
// VBOFailed = true;
|
||||
// Compat.BindBuffer(BufferTarget.ElementArrayBuffer, 0);
|
||||
// Compat.DeleteBuffer(IndexVBO);
|
||||
// IndexVBO = -1;
|
||||
// return false;
|
||||
// }
|
||||
// }
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Class handling texture animations
|
||||
/// </summary>
|
||||
public class TextureAnimationInfo
|
||||
{
|
||||
public Primitive.TextureAnimation PrimAnimInfo;
|
||||
public float CurrentFrame;
|
||||
public float CurrentTime;
|
||||
public bool PingPong;
|
||||
float LastTime = 0f;
|
||||
float TotalTime = 0f;
|
||||
|
||||
/// <summary>
|
||||
/// Perform texture manupulation to implement texture animations
|
||||
/// </summary>
|
||||
/// <param name="lastFrameTime">Time passed since the last run (in seconds)</param>
|
||||
public void Step(float lastFrameTime)
|
||||
{
|
||||
float numFrames = 1f;
|
||||
float fullLength = 1f;
|
||||
|
||||
if (PrimAnimInfo.Length > 0)
|
||||
{
|
||||
numFrames = PrimAnimInfo.Length;
|
||||
}
|
||||
else
|
||||
{
|
||||
numFrames = Math.Max(1f, (float)(PrimAnimInfo.SizeX * PrimAnimInfo.SizeY));
|
||||
}
|
||||
|
||||
if ((PrimAnimInfo.Flags & Primitive.TextureAnimMode.PING_PONG) != 0)
|
||||
{
|
||||
if ((PrimAnimInfo.Flags & Primitive.TextureAnimMode.SMOOTH) != 0)
|
||||
{
|
||||
fullLength = 2f * numFrames;
|
||||
}
|
||||
else if ((PrimAnimInfo.Flags & Primitive.TextureAnimMode.LOOP) != 0)
|
||||
{
|
||||
fullLength = 2f * numFrames - 2f;
|
||||
fullLength = Math.Max(1f, fullLength);
|
||||
}
|
||||
else
|
||||
{
|
||||
fullLength = 2f * numFrames - 1f;
|
||||
fullLength = Math.Max(1f, fullLength);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
fullLength = numFrames;
|
||||
}
|
||||
|
||||
float frameCounter;
|
||||
if ((PrimAnimInfo.Flags & Primitive.TextureAnimMode.SMOOTH) != 0)
|
||||
{
|
||||
frameCounter = lastFrameTime * PrimAnimInfo.Rate + LastTime;
|
||||
}
|
||||
else
|
||||
{
|
||||
TotalTime += lastFrameTime;
|
||||
frameCounter = TotalTime * PrimAnimInfo.Rate;
|
||||
}
|
||||
LastTime = frameCounter;
|
||||
|
||||
if ((PrimAnimInfo.Flags & Primitive.TextureAnimMode.LOOP) != 0)
|
||||
{
|
||||
frameCounter %= fullLength;
|
||||
}
|
||||
else
|
||||
{
|
||||
frameCounter = Math.Min(fullLength - 1f, frameCounter);
|
||||
}
|
||||
|
||||
if ((PrimAnimInfo.Flags & Primitive.TextureAnimMode.SMOOTH) == 0)
|
||||
{
|
||||
frameCounter = (float)Math.Floor(frameCounter + 0.01f);
|
||||
}
|
||||
|
||||
if ((PrimAnimInfo.Flags & Primitive.TextureAnimMode.PING_PONG) != 0)
|
||||
{
|
||||
if (frameCounter > numFrames)
|
||||
{
|
||||
if ((PrimAnimInfo.Flags & Primitive.TextureAnimMode.SMOOTH) != 0)
|
||||
{
|
||||
frameCounter = numFrames - (frameCounter - numFrames);
|
||||
}
|
||||
else
|
||||
{
|
||||
frameCounter = (numFrames - 1.99f) - (frameCounter - numFrames);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ((PrimAnimInfo.Flags & Primitive.TextureAnimMode.REVERSE) != 0)
|
||||
{
|
||||
if ((PrimAnimInfo.Flags & Primitive.TextureAnimMode.SMOOTH) != 0)
|
||||
{
|
||||
frameCounter = numFrames - frameCounter;
|
||||
}
|
||||
else
|
||||
{
|
||||
frameCounter = (numFrames - 0.99f) - frameCounter;
|
||||
}
|
||||
}
|
||||
|
||||
frameCounter += PrimAnimInfo.Start;
|
||||
|
||||
if ((PrimAnimInfo.Flags & Primitive.TextureAnimMode.SMOOTH) == 0)
|
||||
{
|
||||
frameCounter = (float)Math.Round(frameCounter);
|
||||
}
|
||||
|
||||
|
||||
GL.MatrixMode(MatrixMode.Texture);
|
||||
GL.LoadIdentity();
|
||||
|
||||
if ((PrimAnimInfo.Flags & Primitive.TextureAnimMode.ROTATE) != 0)
|
||||
{
|
||||
GL.Translate(0.5f, 0.5f, 0f);
|
||||
GL.Rotate(Utils.RAD_TO_DEG * frameCounter, OpenTK.Vector3d.UnitZ);
|
||||
GL.Translate(-0.5f, -0.5f, 0f);
|
||||
}
|
||||
else if ((PrimAnimInfo.Flags & Primitive.TextureAnimMode.SCALE) != 0)
|
||||
{
|
||||
GL.Scale(frameCounter, frameCounter, 0);
|
||||
}
|
||||
else // Translate
|
||||
{
|
||||
float sizeX = Math.Max(1f, (float)PrimAnimInfo.SizeX);
|
||||
float sizeY = Math.Max(1f, (float)PrimAnimInfo.SizeY);
|
||||
|
||||
GL.Scale(1f / sizeX, 1f / sizeY, 0);
|
||||
GL.Translate(frameCounter % sizeX, Math.Floor(frameCounter / sizeY), 0);
|
||||
}
|
||||
|
||||
GL.MatrixMode(MatrixMode.Modelview);
|
||||
}
|
||||
|
||||
[Obsolete("Use Step() instead")]
|
||||
public void ExperimentalStep(float time)
|
||||
{
|
||||
int reverseFactor = 1;
|
||||
float rate = PrimAnimInfo.Rate;
|
||||
|
||||
if (rate < 0)
|
||||
{
|
||||
rate = -rate;
|
||||
reverseFactor = -reverseFactor;
|
||||
}
|
||||
|
||||
if ((PrimAnimInfo.Flags & Primitive.TextureAnimMode.REVERSE) != 0)
|
||||
{
|
||||
reverseFactor = -reverseFactor;
|
||||
}
|
||||
|
||||
CurrentTime += time;
|
||||
float totalTime = 1 / rate;
|
||||
|
||||
uint x = Math.Max(1, PrimAnimInfo.SizeX);
|
||||
uint y = Math.Max(1, PrimAnimInfo.SizeY);
|
||||
uint nrFrames = x * y;
|
||||
|
||||
if (PrimAnimInfo.Length > 0 && PrimAnimInfo.Length < nrFrames)
|
||||
{
|
||||
nrFrames = (uint)PrimAnimInfo.Length;
|
||||
}
|
||||
|
||||
GL.MatrixMode(MatrixMode.Texture);
|
||||
GL.LoadIdentity();
|
||||
|
||||
if (CurrentTime >= totalTime)
|
||||
{
|
||||
CurrentTime = 0;
|
||||
CurrentFrame++;
|
||||
if (CurrentFrame > nrFrames) CurrentFrame = (uint)PrimAnimInfo.Start;
|
||||
if ((PrimAnimInfo.Flags & Primitive.TextureAnimMode.PING_PONG) != 0)
|
||||
{
|
||||
PingPong = !PingPong;
|
||||
}
|
||||
}
|
||||
|
||||
float smoothOffset = 0f;
|
||||
|
||||
if ((PrimAnimInfo.Flags & Primitive.TextureAnimMode.SMOOTH) != 0)
|
||||
{
|
||||
smoothOffset = (CurrentTime / totalTime) * reverseFactor;
|
||||
}
|
||||
|
||||
float f = CurrentFrame;
|
||||
if (reverseFactor < 0)
|
||||
{
|
||||
f = nrFrames - CurrentFrame;
|
||||
}
|
||||
|
||||
if ((PrimAnimInfo.Flags & Primitive.TextureAnimMode.ROTATE) == 0) // not rotating
|
||||
{
|
||||
GL.Scale(1f / x, 1f / y, 0f);
|
||||
GL.Translate((f % x) + smoothOffset, f / y, 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
smoothOffset = (CurrentTime * PrimAnimInfo.Rate);
|
||||
float startAngle = PrimAnimInfo.Start;
|
||||
float endAngle = PrimAnimInfo.Length;
|
||||
float angle = startAngle + (endAngle - startAngle) * smoothOffset;
|
||||
GL.Translate(0.5f, 0.5f, 0f);
|
||||
GL.Rotate(Utils.RAD_TO_DEG * angle, OpenTK.Vector3d.UnitZ);
|
||||
GL.Translate(-0.5f, -0.5f, 0f);
|
||||
}
|
||||
|
||||
GL.MatrixMode(MatrixMode.Modelview);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Class that handle rendering of objects: simple primitives, scupties, and meshes
|
||||
/// </summary>
|
||||
public class RenderPrimitive : SceneObject
|
||||
{
|
||||
#region Public fields
|
||||
/// <summary>Base simulator object</summary>
|
||||
public Primitive Prim;
|
||||
public List<Face> Faces;
|
||||
/// <summary>Is this object attached to an avatar</summary>
|
||||
public bool Attached;
|
||||
/// <summary>Do we know if object is attached</summary>
|
||||
public bool AttachedStateKnown;
|
||||
/// <summary>Are meshes constructed and ready for this prim</summary>
|
||||
public bool Meshed;
|
||||
/// <summary>Process of creating a mesh is underway</summary>
|
||||
public bool Meshing;
|
||||
#endregion Public fields
|
||||
|
||||
#region Private fields
|
||||
int prevTEHash;
|
||||
int prevSculptHash;
|
||||
int prevShapeHash;
|
||||
#endregion Private fields
|
||||
|
||||
/// <summary>
|
||||
/// Default constructor
|
||||
/// </summary>
|
||||
public RenderPrimitive()
|
||||
{
|
||||
Type = SceneObjectType.Primitive;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Remove any GL resource we may still have in use
|
||||
/// </summary>
|
||||
public override void Dispose()
|
||||
{
|
||||
if (Faces != null)
|
||||
{
|
||||
foreach (Face f in Faces)
|
||||
{
|
||||
if (f.UserData != null && f.UserData is FaceData)
|
||||
{
|
||||
FaceData data = (FaceData)f.UserData;
|
||||
data.Dispose();
|
||||
data = null;
|
||||
}
|
||||
}
|
||||
Faces = null;
|
||||
}
|
||||
base.Dispose();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Simulator object that is basis for this SceneObject
|
||||
/// </summary>
|
||||
public override Primitive BasePrim
|
||||
{
|
||||
get { return Prim; }
|
||||
set
|
||||
{
|
||||
Prim = value;
|
||||
|
||||
int TEHash = Prim.Textures == null ? 0 : Prim.Textures.GetHashCode();
|
||||
int sculptHash, shapeHash;
|
||||
|
||||
if (Meshed)
|
||||
{
|
||||
if (Prim.Type == PrimType.Sculpt || Prim.Type == PrimType.Mesh)
|
||||
{
|
||||
sculptHash = Prim.Sculpt.GetHashCode();
|
||||
if (Prim.Sculpt.GetHashCode() != prevSculptHash || TEHash != prevTEHash)
|
||||
{
|
||||
Meshed = false;
|
||||
}
|
||||
prevSculptHash = sculptHash;
|
||||
}
|
||||
else
|
||||
{
|
||||
shapeHash = Prim.PrimData.GetHashCode();
|
||||
if (shapeHash != prevShapeHash)
|
||||
{
|
||||
Meshed = false;
|
||||
}
|
||||
else if (TEHash != prevTEHash)
|
||||
{
|
||||
Meshed = false;
|
||||
}
|
||||
prevShapeHash = shapeHash;
|
||||
}
|
||||
}
|
||||
prevTEHash = TEHash;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Set initial state of the object
|
||||
/// </summary>
|
||||
public override void Initialize()
|
||||
{
|
||||
AttachedStateKnown = false;
|
||||
base.Initialize();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Render Primitive
|
||||
/// </summary>
|
||||
/// <param name="pass">Which pass are we currently in</param>
|
||||
/// <param name="pickingID">ID used to identify which object was picked</param>
|
||||
/// <param name="scene">Main scene renderer</param>
|
||||
/// <param name="time">Time it took to render the last frame</param>
|
||||
public override void Render(RenderPass pass, int pickingID, SceneWindow scene, float time)
|
||||
{
|
||||
//if (!RenderSettings.AvatarRenderingEnabled && Attached) return;//hack
|
||||
|
||||
// Individual prim matrix
|
||||
GL.PushMatrix();
|
||||
|
||||
// Prim roation and position and scale
|
||||
GL.MultMatrix(Math3D.CreateSRTMatrix(Prim.Scale, RenderRotation, RenderPosition));
|
||||
|
||||
// Do we have animated texture on this face
|
||||
bool animatedTexture = false;
|
||||
|
||||
// Initialise flags tracking what type of faces this prim has
|
||||
if (pass == RenderPass.Simple)
|
||||
{
|
||||
HasSimpleFaces = false;
|
||||
}
|
||||
else if (pass == RenderPass.Alpha)
|
||||
{
|
||||
HasAlphaFaces = false;
|
||||
}
|
||||
else if (pass == RenderPass.Invisible)
|
||||
{
|
||||
HasInvisibleFaces = false;
|
||||
}
|
||||
|
||||
// Draw the prim faces
|
||||
for (int j = 0; j < Faces.Count; j++)
|
||||
{
|
||||
Primitive.TextureEntryFace teFace = Prim.Textures.GetFace((uint)j);
|
||||
Face face = Faces[j];
|
||||
FaceData data = (FaceData)face.UserData;
|
||||
|
||||
if (data == null)
|
||||
continue;
|
||||
|
||||
if (teFace == null)
|
||||
continue;
|
||||
|
||||
// Don't render transparent faces
|
||||
Color4 RGBA = teFace.RGBA;
|
||||
|
||||
if (data.TextureInfo.FullAlpha || RGBA.A <= 0.01f) continue;
|
||||
|
||||
bool switchedLightsOff = false;
|
||||
|
||||
if (pass == RenderPass.Picking)
|
||||
{
|
||||
data.PickingID = pickingID;
|
||||
var primNrBytes = Utils.UInt16ToBytes((ushort)pickingID);
|
||||
var faceColor = new byte[] { primNrBytes[0], primNrBytes[1], (byte)j, 255 };
|
||||
GL.Color4(faceColor);
|
||||
}
|
||||
else if (pass == RenderPass.Invisible)
|
||||
{
|
||||
if (!data.TextureInfo.IsInvisible) continue;
|
||||
HasInvisibleFaces = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (data.TextureInfo.IsInvisible) continue;
|
||||
bool belongToAlphaPass = (RGBA.A < 0.99f) || (data.TextureInfo.HasAlpha && !data.TextureInfo.IsMask);
|
||||
|
||||
if (belongToAlphaPass && pass != RenderPass.Alpha) continue;
|
||||
if (!belongToAlphaPass && pass == RenderPass.Alpha) continue;
|
||||
|
||||
if (pass == RenderPass.Simple)
|
||||
{
|
||||
HasSimpleFaces = true;
|
||||
}
|
||||
else if (pass == RenderPass.Alpha)
|
||||
{
|
||||
HasAlphaFaces = true;
|
||||
}
|
||||
|
||||
if (teFace.Fullbright)
|
||||
{
|
||||
GL.Disable(EnableCap.Lighting);
|
||||
switchedLightsOff = true;
|
||||
}
|
||||
|
||||
float shiny = 0f;
|
||||
switch (teFace.Shiny)
|
||||
{
|
||||
case Shininess.High:
|
||||
shiny = 0.96f;
|
||||
break;
|
||||
|
||||
case Shininess.Medium:
|
||||
shiny = 0.64f;
|
||||
break;
|
||||
|
||||
case Shininess.Low:
|
||||
shiny = 0.24f;
|
||||
break;
|
||||
}
|
||||
|
||||
if (shiny > 0f)
|
||||
{
|
||||
scene.StartShiny();
|
||||
}
|
||||
GL.Material(MaterialFace.Front, MaterialParameter.Shininess, shiny);
|
||||
var faceColor = new float[] { RGBA.R, RGBA.G, RGBA.B, RGBA.A };
|
||||
GL.Color4(faceColor);
|
||||
|
||||
GL.Material(MaterialFace.Front, MaterialParameter.Specular, new float[] { 0.5f, 0.5f, 0.5f, 1f });
|
||||
|
||||
if (data.TextureInfo.TexturePointer == 0)
|
||||
{
|
||||
TextureInfo teInfo;
|
||||
if (scene.TryGetTextureInfo(teFace.TextureID, out teInfo))
|
||||
{
|
||||
data.TextureInfo = teInfo;
|
||||
}
|
||||
}
|
||||
|
||||
if (data.TextureInfo.TexturePointer == 0)
|
||||
{
|
||||
GL.Disable(EnableCap.Texture2D);
|
||||
if (!data.TextureInfo.FetchFailed)
|
||||
{
|
||||
scene.DownloadTexture(new TextureLoadItem()
|
||||
{
|
||||
Prim = this.Prim,
|
||||
TeFace = teFace,
|
||||
Data = data
|
||||
}, false);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// Is this face using texture animation
|
||||
if ((Prim.TextureAnim.Flags & Primitive.TextureAnimMode.ANIM_ON) != 0
|
||||
&& (Prim.TextureAnim.Face == j || Prim.TextureAnim.Face == 255))
|
||||
{
|
||||
if (data.AnimInfo == null)
|
||||
{
|
||||
data.AnimInfo = new TextureAnimationInfo();
|
||||
}
|
||||
data.AnimInfo.PrimAnimInfo = Prim.TextureAnim;
|
||||
data.AnimInfo.Step(time);
|
||||
animatedTexture = true;
|
||||
}
|
||||
else if (data.AnimInfo != null) // Face texture not animated. Do we have previous anim setting?
|
||||
{
|
||||
data.AnimInfo = null;
|
||||
}
|
||||
|
||||
GL.Enable(EnableCap.Texture2D);
|
||||
GL.BindTexture(TextureTarget.Texture2D, data.TextureInfo.TexturePointer);
|
||||
}
|
||||
}
|
||||
//hack
|
||||
/*
|
||||
if (!RenderSettings.UseVBO || data.VBOFailed)
|
||||
{
|
||||
Vertex[] verts = face.Vertices.ToArray();
|
||||
ushort[] indices = face.Indices.ToArray();
|
||||
|
||||
unsafe
|
||||
{
|
||||
fixed (float* normalPtr = &verts[0].Normal.X)
|
||||
fixed (float* texPtr = &verts[0].TexCoord.X)
|
||||
{
|
||||
GL.NormalPointer(NormalPointerType.Float, FaceData.VertexSize, (IntPtr)normalPtr);
|
||||
GL.TexCoordPointer(2, TexCoordPointerType.Float, FaceData.VertexSize, (IntPtr)texPtr);
|
||||
GL.VertexPointer(3, VertexPointerType.Float, FaceData.VertexSize, verts);
|
||||
GL.DrawElements(BeginMode.Triangles, indices.Length, DrawElementsType.UnsignedShort, indices);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (data.CheckVBO(face))
|
||||
{
|
||||
Compat.BindBuffer(BufferTarget.ArrayBuffer, data.VertexVBO);
|
||||
Compat.BindBuffer(BufferTarget.ElementArrayBuffer, data.IndexVBO);
|
||||
GL.NormalPointer(NormalPointerType.Float, FaceData.VertexSize, (IntPtr)12);
|
||||
GL.TexCoordPointer(2, TexCoordPointerType.Float, FaceData.VertexSize, (IntPtr)(24));
|
||||
GL.VertexPointer(3, VertexPointerType.Float, FaceData.VertexSize, (IntPtr)(0));
|
||||
|
||||
GL.DrawElements(BeginMode.Triangles, face.Indices.Count, DrawElementsType.UnsignedShort, IntPtr.Zero);
|
||||
}
|
||||
Compat.BindBuffer(BufferTarget.ArrayBuffer, 0);
|
||||
Compat.BindBuffer(BufferTarget.ElementArrayBuffer, 0);
|
||||
|
||||
}
|
||||
*/
|
||||
if (switchedLightsOff)
|
||||
{
|
||||
GL.Enable(EnableCap.Lighting);
|
||||
switchedLightsOff = false;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
GL.BindTexture(TextureTarget.Texture2D, 0);
|
||||
RHelp.ResetMaterial();
|
||||
|
||||
// Reset texture coordinates if we modified them in texture animation
|
||||
if (animatedTexture)
|
||||
{
|
||||
GL.MatrixMode(MatrixMode.Texture);
|
||||
GL.LoadIdentity();
|
||||
GL.MatrixMode(MatrixMode.Modelview);
|
||||
}
|
||||
|
||||
// Pop the prim matrix
|
||||
GL.PopMatrix();
|
||||
|
||||
base.Render(pass, pickingID, scene, time);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// String representation of the object
|
||||
/// </summary>
|
||||
/// <returns>String containing local ID of the object and it's distance from the camera</returns>
|
||||
public override string ToString()
|
||||
{
|
||||
uint id = Prim == null ? 0 : Prim.LocalID;
|
||||
float distance = (float)Math.Sqrt(DistanceSquared);
|
||||
return string.Format("LocalID: {0}, distance {0.00}", id, distance);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: a39f315ba92417d43a168eddc202ecaa
|
||||
MonoImporter:
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: ce6bf542a1ac7004b867d58c64071494
|
||||
MonoImporter:
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 07e0dbb908f9e9941a7484343bd3b3b1
|
||||
MonoImporter:
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
@@ -0,0 +1,4 @@
|
||||
fileFormatVersion: 2
|
||||
guid: af545c64be0618b4086c843e2287aef3
|
||||
DefaultImporter:
|
||||
userData:
|
||||
@@ -0,0 +1,4 @@
|
||||
fileFormatVersion: 2
|
||||
guid: eccc668e6519a6e428cfcac8c6644358
|
||||
DefaultImporter:
|
||||
userData:
|
||||
Binary file not shown.
@@ -0,0 +1,35 @@
|
||||
fileFormatVersion: 2
|
||||
guid: bc86e1f68d31db0448a4bff74807e574
|
||||
TextureImporter:
|
||||
serializedVersion: 2
|
||||
mipmaps:
|
||||
mipMapMode: 0
|
||||
enableMipMap: 1
|
||||
linearTexture: 0
|
||||
correctGamma: 0
|
||||
fadeOut: 0
|
||||
borderMipMap: 0
|
||||
mipMapFadeDistanceStart: 1
|
||||
mipMapFadeDistanceEnd: 3
|
||||
bumpmap:
|
||||
convertToNormalMap: 0
|
||||
externalNormalMap: 0
|
||||
heightScale: .25
|
||||
normalMapFilter: 0
|
||||
isReadable: 0
|
||||
grayScaleToAlpha: 0
|
||||
generateCubemap: 0
|
||||
seamlessCubemap: 0
|
||||
textureFormat: -1
|
||||
maxTextureSize: 512
|
||||
textureSettings:
|
||||
filterMode: 1
|
||||
aniso: 1
|
||||
mipBias: -1
|
||||
wrapMode: 1
|
||||
nPOTScale: 1
|
||||
lightmap: 0
|
||||
compressionQuality: 50
|
||||
textureType: 0
|
||||
buildTargetSettings: []
|
||||
userData:
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 7.7 KiB |
@@ -0,0 +1,35 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 935cf88c386d9cc4ca156b2a5fd9c992
|
||||
TextureImporter:
|
||||
serializedVersion: 2
|
||||
mipmaps:
|
||||
mipMapMode: 0
|
||||
enableMipMap: 1
|
||||
linearTexture: 0
|
||||
correctGamma: 0
|
||||
fadeOut: 0
|
||||
borderMipMap: 0
|
||||
mipMapFadeDistanceStart: 1
|
||||
mipMapFadeDistanceEnd: 3
|
||||
bumpmap:
|
||||
convertToNormalMap: 0
|
||||
externalNormalMap: 0
|
||||
heightScale: .25
|
||||
normalMapFilter: 0
|
||||
isReadable: 0
|
||||
grayScaleToAlpha: 0
|
||||
generateCubemap: 0
|
||||
seamlessCubemap: 0
|
||||
textureFormat: -1
|
||||
maxTextureSize: 1024
|
||||
textureSettings:
|
||||
filterMode: 1
|
||||
aniso: 1
|
||||
mipBias: -1
|
||||
wrapMode: 1
|
||||
nPOTScale: 1
|
||||
lightmap: 0
|
||||
compressionQuality: 50
|
||||
textureType: -1
|
||||
buildTargetSettings: []
|
||||
userData:
|
||||
Binary file not shown.
@@ -0,0 +1,35 @@
|
||||
fileFormatVersion: 2
|
||||
guid: c768927e55bffbe4cb64587121132353
|
||||
TextureImporter:
|
||||
serializedVersion: 2
|
||||
mipmaps:
|
||||
mipMapMode: 0
|
||||
enableMipMap: 1
|
||||
linearTexture: 0
|
||||
correctGamma: 0
|
||||
fadeOut: 0
|
||||
borderMipMap: 0
|
||||
mipMapFadeDistanceStart: 1
|
||||
mipMapFadeDistanceEnd: 3
|
||||
bumpmap:
|
||||
convertToNormalMap: 0
|
||||
externalNormalMap: 0
|
||||
heightScale: .25
|
||||
normalMapFilter: 0
|
||||
isReadable: 0
|
||||
grayScaleToAlpha: 0
|
||||
generateCubemap: 0
|
||||
seamlessCubemap: 0
|
||||
textureFormat: -1
|
||||
maxTextureSize: 512
|
||||
textureSettings:
|
||||
filterMode: 1
|
||||
aniso: 1
|
||||
mipBias: -1
|
||||
wrapMode: 1
|
||||
nPOTScale: 1
|
||||
lightmap: 0
|
||||
compressionQuality: 50
|
||||
textureType: 0
|
||||
buildTargetSettings: []
|
||||
userData:
|
||||
Binary file not shown.
@@ -0,0 +1,35 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 709280674f0ca3c4491270f799ff59f5
|
||||
TextureImporter:
|
||||
serializedVersion: 2
|
||||
mipmaps:
|
||||
mipMapMode: 0
|
||||
enableMipMap: 1
|
||||
linearTexture: 0
|
||||
correctGamma: 0
|
||||
fadeOut: 0
|
||||
borderMipMap: 0
|
||||
mipMapFadeDistanceStart: 1
|
||||
mipMapFadeDistanceEnd: 3
|
||||
bumpmap:
|
||||
convertToNormalMap: 0
|
||||
externalNormalMap: 0
|
||||
heightScale: .25
|
||||
normalMapFilter: 0
|
||||
isReadable: 0
|
||||
grayScaleToAlpha: 0
|
||||
generateCubemap: 0
|
||||
seamlessCubemap: 0
|
||||
textureFormat: -1
|
||||
maxTextureSize: 1024
|
||||
textureSettings:
|
||||
filterMode: 1
|
||||
aniso: 1
|
||||
mipBias: -1
|
||||
wrapMode: 1
|
||||
nPOTScale: 1
|
||||
lightmap: 0
|
||||
compressionQuality: 50
|
||||
textureType: -1
|
||||
buildTargetSettings: []
|
||||
userData:
|
||||
Binary file not shown.
@@ -0,0 +1,35 @@
|
||||
fileFormatVersion: 2
|
||||
guid: dc88bc4dfec18ec429107ce352ce5144
|
||||
TextureImporter:
|
||||
serializedVersion: 2
|
||||
mipmaps:
|
||||
mipMapMode: 0
|
||||
enableMipMap: 1
|
||||
linearTexture: 0
|
||||
correctGamma: 0
|
||||
fadeOut: 0
|
||||
borderMipMap: 0
|
||||
mipMapFadeDistanceStart: 1
|
||||
mipMapFadeDistanceEnd: 3
|
||||
bumpmap:
|
||||
convertToNormalMap: 0
|
||||
externalNormalMap: 0
|
||||
heightScale: .25
|
||||
normalMapFilter: 0
|
||||
isReadable: 0
|
||||
grayScaleToAlpha: 0
|
||||
generateCubemap: 0
|
||||
seamlessCubemap: 0
|
||||
textureFormat: -1
|
||||
maxTextureSize: 1024
|
||||
textureSettings:
|
||||
filterMode: 1
|
||||
aniso: 1
|
||||
mipBias: -1
|
||||
wrapMode: 1
|
||||
nPOTScale: 1
|
||||
lightmap: 0
|
||||
compressionQuality: 50
|
||||
textureType: -1
|
||||
buildTargetSettings: []
|
||||
userData:
|
||||
Binary file not shown.
@@ -0,0 +1,35 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 18b19e7d34063ae4dbef0c911511e1fc
|
||||
TextureImporter:
|
||||
serializedVersion: 2
|
||||
mipmaps:
|
||||
mipMapMode: 0
|
||||
enableMipMap: 1
|
||||
linearTexture: 0
|
||||
correctGamma: 0
|
||||
fadeOut: 0
|
||||
borderMipMap: 0
|
||||
mipMapFadeDistanceStart: 1
|
||||
mipMapFadeDistanceEnd: 3
|
||||
bumpmap:
|
||||
convertToNormalMap: 0
|
||||
externalNormalMap: 0
|
||||
heightScale: .25
|
||||
normalMapFilter: 0
|
||||
isReadable: 0
|
||||
grayScaleToAlpha: 0
|
||||
generateCubemap: 0
|
||||
seamlessCubemap: 0
|
||||
textureFormat: -1
|
||||
maxTextureSize: 1024
|
||||
textureSettings:
|
||||
filterMode: 1
|
||||
aniso: 1
|
||||
mipBias: -1
|
||||
wrapMode: 1
|
||||
nPOTScale: 1
|
||||
lightmap: 0
|
||||
compressionQuality: 50
|
||||
textureType: -1
|
||||
buildTargetSettings: []
|
||||
userData:
|
||||
Binary file not shown.
@@ -0,0 +1,7 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 48ebc8f37c0643742a40533aa83e3ba9
|
||||
MonoAssemblyImporter:
|
||||
serializedVersion: 1
|
||||
iconMap: {}
|
||||
executionOrder: {}
|
||||
userData:
|
||||
Binary file not shown.
@@ -0,0 +1,7 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 03f10af4406b42a47a96951cb7129f03
|
||||
MonoAssemblyImporter:
|
||||
serializedVersion: 1
|
||||
iconMap: {}
|
||||
executionOrder: {}
|
||||
userData:
|
||||
Binary file not shown.
@@ -0,0 +1,51 @@
|
||||
<?xml version="1.0" encoding="US-ASCII" standalone="yes"?>
|
||||
<!--
|
||||
Default values for "Look At" controls.
|
||||
Various events compete for avatar attention. I.E. control where the
|
||||
user's avatar looks.
|
||||
The avatar's head will turn to look towards the source of those events
|
||||
as much as is possible.
|
||||
If the head cannot turn due to an animation override, the eyes will still
|
||||
track those events.
|
||||
Avatar attention will be taken by events of equal of greater priorities
|
||||
and will last for timeout number of seconds before reverting to idle.
|
||||
Negative timeout values indicate attentions that never time out.
|
||||
Avatar sex determines which set of attention settings are used.
|
||||
Within each set, the following named attentions relate to the indicated events:
|
||||
|
||||
IDLE: Tracks the mouse pointer movement.
|
||||
AUTO LISTEN: Tracks nearby chat.
|
||||
FREELOOK: Tracks "target objects" and a case of mouse moved in 3rd person mode.
|
||||
RESPOND: Tracks the beginning of typing.
|
||||
HOVER: Tracks objects the mouse lingers over when "show hover tooltips" is on.
|
||||
CONVERSATION: Tracks avatars and other objects clicked on.
|
||||
SEOECT: Tracks objects grabbed and being moved.
|
||||
FOCUS: Freezes during avatar customization and when focused on object or point.
|
||||
MOUSELOOK: Tracks center of view when in mouselook view mode.
|
||||
-->
|
||||
|
||||
<linden_attentions version="1.0">
|
||||
<gender name="Masculine">
|
||||
<param attention="idle" priority="1.0" timeout="3.0" />
|
||||
<param attention="auto_listen" priority="3.0" timeout="4.0" />
|
||||
<param attention="freelook" priority="2.0" timeout="2.0" />
|
||||
<param attention="respond" priority="3.0" timeout="4.0" />
|
||||
<param attention="hover" priority="4.0" timeout="1.0" />
|
||||
<param attention="conversation" priority="0.0" timeout="-1" />
|
||||
<param attention="select" priority="6.0" timeout="-1" />
|
||||
<param attention="focus" priority="6.0" timeout="-1" />
|
||||
<param attention="mouselook" priority="7.0" timeout="-1" />
|
||||
</gender>
|
||||
<gender name="Feminine">
|
||||
<param attention="idle" priority="1.0" timeout="3.0" />
|
||||
<param attention="auto_listen" priority="3.0" timeout="4.0" />
|
||||
<param attention="freelook" priority="2.0" timeout="2.0" />
|
||||
<param attention="respond" priority="3.0" timeout="4.0" />
|
||||
<param attention="hover" priority="4.0" timeout="1.0" />
|
||||
<param attention="conversation" priority="0.0" timeout="-1" />
|
||||
<param attention="select" priority="6.0" timeout="-1" />
|
||||
<param attention="focus" priority="6.0" timeout="-1" />
|
||||
<param attention="mouselook" priority="7.0" timeout="-1" />
|
||||
</gender>
|
||||
</linden_attentions>
|
||||
|
||||
@@ -0,0 +1,51 @@
|
||||
<?xml version="1.0" encoding="US-ASCII" standalone="yes"?>
|
||||
<!--
|
||||
Default values for "Look At" controls.
|
||||
Various events compete for avatar attention. I.E. control where the
|
||||
user's avatar looks.
|
||||
The avatar's head will turn to look towards the source of those events
|
||||
as much as is possible.
|
||||
If the head cannot turn due to an animation override, the eyes will still
|
||||
track those events.
|
||||
Avatar attention will be taken by events of equal of greater priorities
|
||||
and will last for timeout number of seconds before reverting to idle.
|
||||
Negative timeout values indicate attentions that never time out.
|
||||
Avatar sex determines which set of attention settings are used.
|
||||
Within each set, the following named attentions relate to the indicated events:
|
||||
|
||||
IDLE: Tracks the mouse pointer movement.
|
||||
AUTO LISTEN: Tracks nearby chat.
|
||||
FREELOOK: Tracks "target objects" and a case of mouse moved in 3rd person mode.
|
||||
RESPOND: Tracks the beginning of typing.
|
||||
HOVER: Tracks objects the mouse lingers over when "show hover tooltips" is on.
|
||||
CONVERSATION: Tracks avatars and other objects clicked on.
|
||||
SEOECT: Tracks objects grabbed and being moved.
|
||||
FOCUS: Freezes during avatar customization and when focused on object or point.
|
||||
MOUSELOOK: Tracks center of view when in mouselook view mode.
|
||||
-->
|
||||
|
||||
<linden_attentions version="1.0">
|
||||
<gender name="Masculine">
|
||||
<param attention="idle" priority="1.0" timeout="3.0" />
|
||||
<param attention="auto_listen" priority="3.0" timeout="4.0" />
|
||||
<param attention="freelook" priority="2.0" timeout="2.0" />
|
||||
<param attention="respond" priority="3.0" timeout="3.0" />
|
||||
<param attention="hover" priority="4.0" timeout="1.0" />
|
||||
<param attention="conversation" priority="5.0" timeout="3.0" />
|
||||
<param attention="select" priority="3.5" timeout="-1" />
|
||||
<param attention="focus" priority="3.5" timeout="20.0" />
|
||||
<param attention="mouselook" priority="7.0" timeout="-1" />
|
||||
</gender>
|
||||
<gender name="Feminine">
|
||||
<param attention="idle" priority="1.0" timeout="3.0" />
|
||||
<param attention="auto_listen" priority="3.0" timeout="4.0" />
|
||||
<param attention="freelook" priority="2.0" timeout="2.0" />
|
||||
<param attention="respond" priority="3.0" timeout="6.0" />
|
||||
<param attention="hover" priority="4.0" timeout="1.0" />
|
||||
<param attention="conversation" priority="5.0" timeout="6.0" />
|
||||
<param attention="select" priority="2.5" timeout="-1" />
|
||||
<param attention="focus" priority="2.5" timeout="10.0" />
|
||||
<param attention="mouselook" priority="7.0" timeout="-1" />
|
||||
</gender>
|
||||
</linden_attentions>
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,74 @@
|
||||
<?xml version="1.0" encoding="US-ASCII" standalone="yes"?>
|
||||
<linden_skeleton version="1.0" num_bones="46" num_collision_volumes="19">
|
||||
<bone name="mPelvis" pos="0.000 0.000 1.067" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" pivot="0.000000 0.000000 1.067015">
|
||||
<collision_volume name="PELVIS" pos = "-0.01 0 -0.02" rot="0.000000 8.00000 0.000000" scale="0.12 0.16 0.17"/>
|
||||
<bone name="mTorso" pos="0.000 0.000 0.084" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" pivot="0.000000 0.000000 0.084073">
|
||||
<collision_volume name="BELLY" pos = "0.028 0 0.04" rot="0.000000 8.00000 0.000000" scale="0.09 0.13 0.15"/>
|
||||
<bone name="mChest" pos="-0.015 0.000 0.205" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" pivot="-0.015368 0.000000 0.204877">
|
||||
<collision_volume name="CHEST" pos = "0.028 0 0.07" rot="0.000000 -10.00000 0.000000" scale="0.11 0.15 0.2"/>
|
||||
<bone name="mNeck" pos="-0.010 0.000 0.251" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" pivot="-0.009507 0.000000 0.251108">
|
||||
<collision_volume name="NECK" pos = "0.0 0 0.02" rot="0.000000 0.000000 0.000000" scale="0.05 0.06 0.08"/>
|
||||
<bone name="mHead" pos="0.000 -0.000 0.076" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" pivot="0.000000 -0.000000 0.075630">
|
||||
<collision_volume name="HEAD" pos = "0.02 0 0.07" rot="0.000000 0.000000 0.000000" scale="0.11 0.09 0.12"/>
|
||||
<bone name="mSkull" pos="0.000 0.000 0.079" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" pivot="0.000000 0.000000 0.079000">
|
||||
</bone>
|
||||
<bone name="mEyeRight" pos="0.098 -0.036 0.079" rot="0.000000 0.000000 -0.000000" scale="1.000 1.000 1.000" pivot="0.098466 -0.036000 0.079000">
|
||||
</bone>
|
||||
<bone name="mEyeLeft" pos="0.098 0.036 0.079" rot="0.000000 -0.000000 0.000000" scale="1.000 1.000 1.000" pivot="0.098461 0.036000 0.079000">
|
||||
</bone>
|
||||
</bone>
|
||||
</bone>
|
||||
<bone name="mCollarLeft" pos="-0.021 0.085 0.165" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" pivot="-0.020927 0.084665 0.165396">
|
||||
<collision_volume name="L_CLAVICLE" pos = "0.02 0 0.02" rot="0.000000 0.00000 0.000000" scale="0.07 0.14 0.05"/>
|
||||
<bone name="mShoulderLeft" pos="0.000 0.079 -0.000" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" pivot="0.000000 0.079000 -0.000000">
|
||||
<collision_volume name="L_UPPER_ARM" pos = "0.0 0.12 0.01" rot="-5.000000 0.00000 0.000000" scale="0.05 0.17 0.05"/>
|
||||
<bone name="mElbowLeft" pos="0.000 0.248 0.000" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" pivot="0.000000 0.248000 0.000000">
|
||||
<collision_volume name="L_LOWER_ARM" pos = "0.0 0.1 0.0" rot="-3.000000 0.00000 0.000000" scale="0.04 0.14 0.04"/>
|
||||
<bone name="mWristLeft" pos="-0.000 0.205 0.000" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" pivot="-0.000000 0.204846 0.000000">
|
||||
<collision_volume name="L_HAND" pos = "0.01 0.05 0.0" rot="-3.000000 0.00000 -10.000000" scale="0.05 0.08 0.03"/>
|
||||
</bone>
|
||||
</bone>
|
||||
</bone>
|
||||
</bone>
|
||||
<bone name="mCollarRight" pos="-0.021 -0.085 0.165" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" pivot="-0.020927 -0.085000 0.165396">
|
||||
<collision_volume name="R_CLAVICLE" pos = "0.02 0 0.02" rot="0.000000 0.00000 0.000000" scale="0.07 0.14 0.05"/>
|
||||
<bone name="mShoulderRight" pos="0.000 -0.079 -0.000" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" pivot="0.000000 -0.079418 -0.000000">
|
||||
<collision_volume name="R_UPPER_ARM" pos = "0.0 -0.12 0.01" rot="5.000000 0.00000 0.000000" scale="0.05 0.17 0.05"/>
|
||||
<bone name="mElbowRight" pos="0.000 -0.248 -0.000" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" pivot="0.000000 -0.248000 -0.000000">
|
||||
<collision_volume name="R_LOWER_ARM" pos = "0.0 -0.1 0.0" rot="3.000000 0.00000 0.000000" scale="0.04 0.14 0.04"/>
|
||||
<bone name="mWristRight" pos="0.000 -0.205 -0.000" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" pivot="-0.000000 -0.205000 -0.000000">
|
||||
<collision_volume name="R_HAND" pos = "0.01 -0.05 0.0" rot="3.000000 0.00000 10.000000" scale="0.05 0.08 0.03"/>
|
||||
</bone>
|
||||
</bone>
|
||||
</bone>
|
||||
</bone>
|
||||
</bone>
|
||||
</bone>
|
||||
<bone name="mHipRight" pos="0.034 -0.129 -0.041" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" pivot="0.033620 -0.128806 -0.041086">
|
||||
<collision_volume name="R_UPPER_LEG" pos = "-0.02 0.05 -0.22" rot="0.000000 0.00000 0.000000" scale="0.09 0.09 0.32"/>
|
||||
<bone name="mKneeRight" pos="-0.001 0.049 -0.491" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" pivot="-0.000780 0.048635 -0.490922">
|
||||
<collision_volume name="R_LOWER_LEG" pos = "-0.02 0.0 -0.2" rot="0.000000 0.00000 0.000000" scale="0.06 0.06 0.25"/>
|
||||
<bone name="mAnkleRight" pos="-0.029 0.000 -0.468" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" pivot="-0.028869 0.000000 -0.468494">
|
||||
<collision_volume name="R_FOOT" pos = "0.077 0.0 -0.041" rot="0.000000 10.00000 0.000000" scale="0.13 0.05 0.05"/>
|
||||
<bone name="mFootRight" pos="0.112 -0.000 -0.061" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" pivot="0.111956 -0.000000 -0.060637">
|
||||
<bone name="mToeRight" pos="0.109 0.000 0.000" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" pivot="0.105399 -0.010408 -0.000104">
|
||||
</bone>
|
||||
</bone>
|
||||
</bone>
|
||||
</bone>
|
||||
</bone>
|
||||
<bone name="mHipLeft" pos="0.034 0.127 -0.041" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" pivot="0.033757 0.126765 -0.040998">
|
||||
<collision_volume name="L_UPPER_LEG" pos = "-0.02 -0.05 -0.22" rot="0.000000 0.00000 0.000000" scale="0.09 0.09 0.32"/>
|
||||
<bone name="mKneeLeft" pos="-0.001 -0.046 -0.491" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" pivot="-0.000887 -0.045568 -0.491053">
|
||||
<collision_volume name="L_LOWER_LEG" pos = "-0.02 0.0 -0.2" rot="0.000000 0.00000 0.000000" scale="0.06 0.06 0.25"/>
|
||||
<bone name="mAnkleLeft" pos="-0.029 0.001 -0.468" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" pivot="-0.028887 0.001378 -0.468449">
|
||||
<collision_volume name="L_FOOT" pos = "0.077 0.0 -0.041" rot="0.000000 10.00000 0.000000" scale="0.13 0.05 0.05"/>
|
||||
<bone name="mFootLeft" pos="0.112 -0.000 -0.061" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" pivot="0.111956 -0.000000 -0.060620">
|
||||
<bone name="mToeLeft" pos="0.109 0.000 0.000" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" pivot="0.105387 0.008270 0.000871">
|
||||
</bone>
|
||||
</bone>
|
||||
</bone>
|
||||
</bone>
|
||||
</bone>
|
||||
</bone>
|
||||
</linden_skeleton>
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user