public void TestGetChildPartPosition() { TestHelpers.InMethod(); Vector3 rootPartPosition = new Vector3(10, 20, 30); Vector3 childOffsetPosition = new Vector3(2, 3, 4); SceneObjectGroup so = SceneHelpers.CreateSceneObject(2, m_ownerId, "obj1", 0x10); so.AbsolutePosition = rootPartPosition; so.Parts[1].OffsetPosition = childOffsetPosition; m_scene.AddNewSceneObject(so, false); // Calculate child absolute position. Vector3 childPosition = new Vector3(rootPartPosition + childOffsetPosition); SceneObjectPart childPart = so.Parts[1]; Assert.That(childPart.AbsolutePosition, Is.EqualTo(childPosition)); Assert.That(childPart.GroupPosition, Is.EqualTo(rootPartPosition)); Assert.That(childPart.GetWorldPosition(), Is.EqualTo(childPosition)); Assert.That(childPart.RelativePosition, Is.EqualTo(childOffsetPosition)); Assert.That(childPart.OffsetPosition, Is.EqualTo(childOffsetPosition)); }
public void SetBeamToUUID(SceneObjectPart To, Vector3 color) { SceneObjectPart From = m_Entity.RootPart; //Scale size of particles to distance objects are apart (for better visibility) Vector3 FromPos = From.GetWorldPosition(); Vector3 ToPos = From.GetWorldPosition(); // UUID toUUID = To.UUID; float distance = (float)(Math.Sqrt(Math.Pow(FromPos.X - ToPos.X, 2) + Math.Pow(FromPos.X - ToPos.Y, 2) + Math.Pow(FromPos.X - ToPos.Z, 2) ) ); //float rate = (float) (distance/4f); float rate = 0.5f; float scale = (float)(distance / 128f); float speed = (float)(2.0f - distance / 128f); SetBeamToUUID(From, To, color, rate, scale, speed); }
// Old uuid and new sceneobjectgroup public AuraMetaEntity CreateAuraForNewlyCreatedEntity(SceneObjectPart part) { AuraMetaEntity ent = new AuraMetaEntity(part.ParentGroup.Scene, part.GetWorldPosition(), MetaEntity.TRANSLUCENT, new Vector3(0, 254, 0), part.Scale ); m_NewlyCreatedEntityAura.Add(part.UUID, ent); return(ent); }
private warp_Texture GetTexture(UUID id, SceneObjectPart sop) { warp_Texture ret = null; if (id == UUID.Zero) { return(ret); } if (m_warpTextures.TryGetValue(id.ToString(), out ret)) { return(ret); } byte[] asset = m_scene.AssetService.GetData(id.ToString()); if (asset != null) { try { using (Bitmap img = (Bitmap)m_imgDecoder.DecodeToImage(asset)) ret = new warp_Texture(img, 8); // reduce textures size to 256x256 } catch (Exception e) { m_log.WarnFormat("[Warp3D]: Failed to decode texture {0} for prim {1} at {2}, exception {3}", id.ToString(), sop.Name, sop.GetWorldPosition().ToString(), e.Message); } } else { m_log.WarnFormat("[Warp3D]: missing texture {0} data for prim {1} at {2}", id.ToString(), sop.Name, sop.GetWorldPosition().ToString()); } m_warpTextures[id.ToString()] = ret; return(ret); }
public void TestGetChildPartPositionAfterObjectRotation() { TestHelpers.InMethod(); Vector3 rootPartPosition = new Vector3(10, 20, 30); Vector3 childOffsetPosition = new Vector3(2, 3, 4); SceneObjectGroup so = SceneHelpers.CreateSceneObject(2, m_ownerId, "obj1", 0x10); so.AbsolutePosition = rootPartPosition; so.Parts[1].OffsetPosition = childOffsetPosition; m_scene.AddNewSceneObject(so, false); so.UpdateGroupRotationR(Quaternion.CreateFromEulers(0, 0, -90 * Utils.DEG_TO_RAD)); // Calculate child absolute position. Vector3 rotatedChildOffsetPosition = new Vector3(childOffsetPosition.Y, -childOffsetPosition.X, childOffsetPosition.Z); Vector3 childPosition = new Vector3(rootPartPosition + rotatedChildOffsetPosition); SceneObjectPart childPart = so.Parts[1]; // FIXME: Should be childPosition after rotation? Assert.That(childPart.AbsolutePosition, Is.EqualTo(rootPartPosition + childOffsetPosition)); Assert.That(childPart.GroupPosition, Is.EqualTo(rootPartPosition)); Assert.That(childPart.GetWorldPosition(), Is.EqualTo(childPosition)); // Relative to root part as (0, 0, 0) Assert.That(childPart.RelativePosition, Is.EqualTo(childOffsetPosition)); // Relative to root part as (0, 0, 0) Assert.That(childPart.OffsetPosition, Is.EqualTo(childOffsetPosition)); }
private void CreatePrim(WarpRenderer renderer, SceneObjectPart prim, bool useTextures) { const float MIN_SIZE = 2f; if ((PCode)prim.Shape.PCode != PCode.Prim) { return; } if (prim.Scale.LengthSquared() < MIN_SIZE * MIN_SIZE) { return; } Primitive omvPrim = prim.Shape.ToOmvPrimitive(prim.OffsetPosition, prim.RotationOffset); FacetedMesh renderMesh = m_primMesher.GenerateFacetedMesh(omvPrim, DetailLevel.Medium); if (renderMesh == null) { return; } warp_Vector primPos = ConvertVector(prim.GetWorldPosition()); warp_Quaternion primRot = ConvertQuaternion(prim.RotationOffset); warp_Matrix m = warp_Matrix.quaternionMatrix(primRot); if (prim.ParentID != 0) { SceneObjectGroup group = m_scene.SceneGraph.GetGroupByPrim(prim.LocalId); if (group != null) { m.transform(warp_Matrix.quaternionMatrix(ConvertQuaternion(group.RootPart.RotationOffset))); } } warp_Vector primScale = ConvertVector(prim.Scale); string primID = prim.UUID.ToString(); // Create the prim faces // TODO: Implement the useTextures flag behavior for (int i = 0; i < renderMesh.Faces.Count; i++) { Face face = renderMesh.Faces[i]; string meshName = primID + "-Face-" + i.ToString(); // Avoid adding duplicate meshes to the scene if (renderer.Scene.objectData.ContainsKey(meshName)) { continue; } warp_Object faceObj = new warp_Object(face.Vertices.Count, face.Indices.Count / 3); for (int j = 0; j < face.Vertices.Count; j++) { Vertex v = face.Vertices[j]; warp_Vector pos = ConvertVector(v.Position); warp_Vector norm = ConvertVector(v.Normal); if (prim.Shape.SculptTexture == UUID.Zero) { norm = norm.reverse(); } warp_Vertex vert = new warp_Vertex(pos, norm, v.TexCoord.X, v.TexCoord.Y); faceObj.addVertex(vert); } for (int j = 0; j < face.Indices.Count; j += 3) { faceObj.addTriangle( face.Indices[j + 0], face.Indices[j + 1], face.Indices[j + 2]); } Primitive.TextureEntryFace teFace = prim.Shape.Textures.GetFace((uint)i); Color4 faceColor = GetFaceColor(teFace); string materialName = GetOrCreateMaterial(renderer, faceColor); faceObj.transform(m); faceObj.setPos(primPos); faceObj.scaleSelf(primScale.x, primScale.y, primScale.z); renderer.Scene.addObject(meshName, faceObj); renderer.SetObjectMaterial(meshName, materialName); } }
private void CreatePrim(WarpRenderer renderer, SceneObjectPart prim) { if ((PCode)prim.Shape.PCode != PCode.Prim) { return; } Vector3 ppos = prim.GetWorldPosition(); if (ppos.Z < m_renderMinHeight || ppos.Z > m_renderMaxHeight) { return; } warp_Vector primPos = ConvertVector(ppos); warp_Quaternion primRot = ConvertQuaternion(prim.GetWorldRotation()); warp_Matrix m = warp_Matrix.quaternionMatrix(primRot); float screenFactor = renderer.Scene.EstimateBoxProjectedArea(primPos, ConvertVector(prim.Scale), m); if (screenFactor < 0) { return; } const float log2inv = -1.442695f; int p2 = (int)((float)Math.Log(screenFactor) * log2inv * 0.25 - 1); if (p2 < 0) { p2 = 0; } else if (p2 > 3) { p2 = 3; } DetailLevel lod = (DetailLevel)(3 - p2); FacetedMesh renderMesh = null; Primitive omvPrim = prim.Shape.ToOmvPrimitive(prim.OffsetPosition, prim.RotationOffset); if (m_renderMeshes) { if (omvPrim.Sculpt != null && omvPrim.Sculpt.SculptTexture != UUID.Zero) { // Try fetchinng the asset AssetBase sculptAsset = m_scene.AssetService.Get(omvPrim.Sculpt.SculptTexture.ToString()); if (sculptAsset != null) { // Is it a mesh? if (omvPrim.Sculpt.Type == SculptType.Mesh) { AssetMesh meshAsset = new AssetMesh(omvPrim.Sculpt.SculptTexture, sculptAsset.Data); FacetedMesh.TryDecodeFromAsset(omvPrim, meshAsset, lod, out renderMesh); meshAsset = null; } else // It's sculptie { if (m_imgDecoder != null) { Image sculpt = m_imgDecoder.DecodeToImage(sculptAsset.Data); if (sculpt != null) { renderMesh = m_primMesher.GenerateFacetedSculptMesh(omvPrim, (Bitmap)sculpt, lod); sculpt.Dispose(); } } } } else { m_log.WarnFormat("[Warp3D] failed to get mesh or sculpt asset {0} of prim {1} at {2}", omvPrim.Sculpt.SculptTexture.ToString(), prim.Name, prim.GetWorldPosition().ToString()); } } } // If not a mesh or sculptie, try the regular mesher if (renderMesh == null) { renderMesh = m_primMesher.GenerateFacetedMesh(omvPrim, lod); } if (renderMesh == null) { return; } string primID = prim.UUID.ToString(); // Create the prim faces // TODO: Implement the useTextures flag behavior for (int i = 0; i < renderMesh.Faces.Count; i++) { Face face = renderMesh.Faces[i]; string meshName = primID + i.ToString(); // Avoid adding duplicate meshes to the scene if (renderer.Scene.objectData.ContainsKey(meshName)) { continue; } warp_Object faceObj = new warp_Object(); Primitive.TextureEntryFace teFace = prim.Shape.Textures.GetFace((uint)i); Color4 faceColor = teFace.RGBA; if (faceColor.A == 0) { continue; } string materialName = string.Empty; if (m_texturePrims) { // if(lod > DetailLevel.Low) { // materialName = GetOrCreateMaterial(renderer, faceColor, teFace.TextureID, lod == DetailLevel.Low); materialName = GetOrCreateMaterial(renderer, faceColor, teFace.TextureID, false, prim); if (String.IsNullOrEmpty(materialName)) { continue; } int c = renderer.Scene.material(materialName).getColor(); if ((c & warp_Color.MASKALPHA) == 0) { continue; } } } else { materialName = GetOrCreateMaterial(renderer, faceColor); } if (renderer.Scene.material(materialName).getTexture() == null) { // uv map details dont not matter for color; for (int j = 0; j < face.Vertices.Count; j++) { Vertex v = face.Vertices[j]; warp_Vector pos = ConvertVector(v.Position); warp_Vertex vert = new warp_Vertex(pos, v.TexCoord.X, v.TexCoord.Y); faceObj.addVertex(vert); } } else { float tu; float tv; float offsetu = teFace.OffsetU + 0.5f; float offsetv = teFace.OffsetV + 0.5f; float scaleu = teFace.RepeatU; float scalev = teFace.RepeatV; float rotation = teFace.Rotation; float rc = 0; float rs = 0; if (rotation != 0) { rc = (float)Math.Cos(rotation); rs = (float)Math.Sin(rotation); } for (int j = 0; j < face.Vertices.Count; j++) { warp_Vertex vert; Vertex v = face.Vertices[j]; warp_Vector pos = ConvertVector(v.Position); if (teFace.TexMapType == MappingType.Planar) { UVPlanarMap(v, prim.Scale, out tu, out tv); } else { tu = v.TexCoord.X - 0.5f; tv = 0.5f - v.TexCoord.Y; } if (rotation != 0) { float tur = tu * rc - tv * rs; float tvr = tu * rs + tv * rc; tur *= scaleu; tur += offsetu; tvr *= scalev; tvr += offsetv; vert = new warp_Vertex(pos, tur, tvr); } else { tu *= scaleu; tu += offsetu; tv *= scalev; tv += offsetv; vert = new warp_Vertex(pos, tu, tv); } faceObj.addVertex(vert); } } for (int j = 0; j < face.Indices.Count; j += 3) { faceObj.addTriangle( face.Indices[j + 0], face.Indices[j + 1], face.Indices[j + 2]); } faceObj.scaleSelf(prim.Scale.X, prim.Scale.Z, prim.Scale.Y); faceObj.transform(m); faceObj.setPos(primPos); renderer.Scene.addObject(meshName, faceObj); renderer.SetObjectMaterial(meshName, materialName); } }
private List <SensedEntity> doAgentSensor(SensorInfo ts) { List <SensedEntity> sensedEntities = new List <SensedEntity>(); // If nobody about quit fast if (m_CmdManager.m_ScriptEngine.World.GetRootAgentCount() == 0) { return(sensedEntities); } SceneObjectPart SensePoint = ts.host; Vector3 fromRegionPos = SensePoint.GetWorldPosition(); Quaternion q = SensePoint.GetWorldRotation(); if (SensePoint.ParentGroup.IsAttachment) { // In attachments, rotate the sensor cone with the // avatar rotation. This may include a nonzero elevation if // in mouselook. // This will not include the rotation and position of the // attachment point (e.g. your head when a sensor is in your // hair attached to your scull. Your hair will turn with // your head but the sensor will stay with your (global) // avatar rotation and position. // Position of a sensor in a child prim attached to an avatar // will be still wrong. ScenePresence avatar = m_CmdManager.m_ScriptEngine.World.GetScenePresence(SensePoint.ParentGroup.AttachedAvatar); q = avatar.Rotation * q; } LSL_Types.Quaternion r = new LSL_Types.Quaternion(q); LSL_Types.Vector3 forward_dir = (new LSL_Types.Vector3(1, 0, 0) * r); double mag_fwd = LSL_Types.Vector3.Mag(forward_dir); bool attached = (SensePoint.ParentGroup.AttachmentPoint != 0); Vector3 toRegionPos; double dis; Action <ScenePresence> senseEntity = new Action <ScenePresence>(presence => { // m_log.DebugFormat( // "[SENSOR REPEAT]: Inspecting scene presence {0}, type {1} on sensor sweep for {2}, type {3}", // presence.Name, presence.PresenceType, ts.name, ts.type); if ((ts.type & NPC) == 0 && (ts.type & OS_NPC) == 0 && presence.PresenceType == PresenceType.Npc) { INPC npcData = m_npcModule.GetNPC(presence.UUID, presence.Scene); if (npcData == null || !npcData.SenseAsAgent) { // m_log.DebugFormat( // "[SENSOR REPEAT]: Discarding NPC {0} from agent sense sweep for script item id {1}", // presence.Name, ts.itemID); return; } } if ((ts.type & AGENT) == 0) { if (presence.PresenceType == PresenceType.User) { return; } else { INPC npcData = m_npcModule.GetNPC(presence.UUID, presence.Scene); if (npcData != null && npcData.SenseAsAgent) { // m_log.DebugFormat( // "[SENSOR REPEAT]: Discarding NPC {0} from non-agent sense sweep for script item id {1}", // presence.Name, ts.itemID); return; } } } if (presence.IsDeleted || presence.IsChildAgent || presence.GodLevel > 0.0) { return; } // if the object the script is in is attached and the avatar is the owner // then this one is not wanted if (attached && presence.UUID == SensePoint.OwnerID) { return; } toRegionPos = presence.AbsolutePosition; dis = Math.Abs(Util.GetDistanceTo(toRegionPos, fromRegionPos)); // Disabled for now since all osNpc* methods check for appropriate ownership permission. // Perhaps could be re-enabled as an NPC setting at some point since being able to make NPCs not // sensed might be useful. // if (presence.PresenceType == PresenceType.Npc && npcModule != null) // { // UUID npcOwner = npcModule.GetOwner(presence.UUID); // if (npcOwner != UUID.Zero && npcOwner != SensePoint.OwnerID) // return; // } // are they in range if (dis <= ts.range) { // Are they in the required angle of view if (ts.arc < Math.PI) { // not omni-directional. Can you see it ? // vec forward_dir = llRot2Fwd(llGetRot()) // vec obj_dir = toRegionPos-fromRegionPos // dot=dot(forward_dir,obj_dir) // mag_fwd = mag(forward_dir) // mag_obj = mag(obj_dir) // ang = acos(dot /(mag_fwd*mag_obj)) double ang_obj = 0; try { LSL_Types.Vector3 obj_dir = new LSL_Types.Vector3( toRegionPos - fromRegionPos); double dot = LSL_Types.Vector3.Dot(forward_dir, obj_dir); double mag_obj = LSL_Types.Vector3.Mag(obj_dir); ang_obj = Math.Acos(dot / (mag_fwd * mag_obj)); } catch { } if (ang_obj <= ts.arc) { sensedEntities.Add(new SensedEntity(dis, presence.UUID)); } } else { sensedEntities.Add(new SensedEntity(dis, presence.UUID)); } } }); // If this is an avatar sense by key try to get them directly // rather than getting a list to scan through if (ts.keyID != UUID.Zero) { ScenePresence sp; // Try direct lookup by UUID if (!m_CmdManager.m_ScriptEngine.World.TryGetScenePresence(ts.keyID, out sp)) { return(sensedEntities); } senseEntity(sp); } else if (ts.name != null && ts.name != "") { ScenePresence sp; // Try lookup by name will return if/when found if (((ts.type & AGENT) != 0) && m_CmdManager.m_ScriptEngine.World.TryGetAvatarByName(ts.name, out sp)) { senseEntity(sp); } if ((ts.type & AGENT_BY_USERNAME) != 0) { m_CmdManager.m_ScriptEngine.World.ForEachRootScenePresence( delegate(ScenePresence ssp) { if (ssp.Lastname == "Resident") { if (ssp.Firstname.ToLower() == ts.name) { senseEntity(ssp); } return; } if (ssp.Name.Replace(" ", ".").ToLower() == ts.name) { senseEntity(ssp); } } ); } return(sensedEntities); } else { m_CmdManager.m_ScriptEngine.World.ForEachRootScenePresence(senseEntity); } return(sensedEntities); }
private List <SensedEntity> doObjectSensor(SensorInfo ts) { List <EntityBase> Entities; List <SensedEntity> sensedEntities = new List <SensedEntity>(); // If this is an object sense by key try to get it directly // rather than getting a list to scan through if (ts.keyID != UUID.Zero) { EntityBase e = null; m_CmdManager.m_ScriptEngine.World.Entities.TryGetValue(ts.keyID, out e); if (e == null) { return(sensedEntities); } Entities = new List <EntityBase>(); Entities.Add(e); } else { Entities = new List <EntityBase>(m_CmdManager.m_ScriptEngine.World.GetEntities()); } SceneObjectPart SensePoint = ts.host; Vector3 fromRegionPos = SensePoint.GetWorldPosition(); // pre define some things to avoid repeated definitions in the loop body Vector3 toRegionPos; double dis; int objtype; SceneObjectPart part; float dx; float dy; float dz; Quaternion q = SensePoint.GetWorldRotation(); if (SensePoint.ParentGroup.IsAttachment) { // In attachments, rotate the sensor cone with the // avatar rotation. This may include a nonzero elevation if // in mouselook. // This will not include the rotation and position of the // attachment point (e.g. your head when a sensor is in your // hair attached to your scull. Your hair will turn with // your head but the sensor will stay with your (global) // avatar rotation and position. // Position of a sensor in a child prim attached to an avatar // will be still wrong. ScenePresence avatar = m_CmdManager.m_ScriptEngine.World.GetScenePresence(SensePoint.ParentGroup.AttachedAvatar); q = avatar.Rotation * q; } LSL_Types.Quaternion r = new LSL_Types.Quaternion(q); LSL_Types.Vector3 forward_dir = (new LSL_Types.Vector3(1, 0, 0) * r); double mag_fwd = LSL_Types.Vector3.Mag(forward_dir); Vector3 ZeroVector = new Vector3(0, 0, 0); bool nameSearch = (ts.name != null && ts.name != ""); foreach (EntityBase ent in Entities) { bool keep = true; if (nameSearch && ent.Name != ts.name) // Wrong name and it is a named search { continue; } if (ent.IsDeleted) // taken so long to do this it has gone from the scene { continue; } if (!(ent is SceneObjectGroup)) // dont bother if it is a pesky avatar { continue; } toRegionPos = ent.AbsolutePosition; // Calculation is in line for speed dx = toRegionPos.X - fromRegionPos.X; dy = toRegionPos.Y - fromRegionPos.Y; dz = toRegionPos.Z - fromRegionPos.Z; // Weed out those that will not fit in a cube the size of the range // no point calculating if they are within a sphere the size of the range // if they arent even in the cube if (Math.Abs(dx) > ts.range || Math.Abs(dy) > ts.range || Math.Abs(dz) > ts.range) { dis = ts.range + 1.0; } else { dis = Math.Sqrt(dx * dx + dy * dy + dz * dz); } if (keep && dis <= ts.range && ts.host.UUID != ent.UUID) { // In Range and not the object containing the script, is it the right Type ? objtype = 0; part = ((SceneObjectGroup)ent).RootPart; if (part.ParentGroup.AttachmentPoint != 0) // Attached so ignore { continue; } if (part.Inventory.ContainsScripts()) { objtype |= ACTIVE | SCRIPTED; // Scripted and active. It COULD have one hidden ... } else { if (ent.Velocity.Equals(ZeroVector)) { objtype |= PASSIVE; // Passive non-moving } else { objtype |= ACTIVE; // moving so active } } // If any of the objects attributes match any in the requested scan type if (((ts.type & objtype) != 0)) { // Right type too, what about the other params , key and name ? if (ts.arc < Math.PI) { // not omni-directional. Can you see it ? // vec forward_dir = llRot2Fwd(llGetRot()) // vec obj_dir = toRegionPos-fromRegionPos // dot=dot(forward_dir,obj_dir) // mag_fwd = mag(forward_dir) // mag_obj = mag(obj_dir) // ang = acos(dot /(mag_fwd*mag_obj)) double ang_obj = 0; try { Vector3 diff = toRegionPos - fromRegionPos; double dot = LSL_Types.Vector3.Dot(forward_dir, diff); double mag_obj = LSL_Types.Vector3.Mag(diff); ang_obj = Math.Acos(dot / (mag_fwd * mag_obj)); } catch { } if (ang_obj > ts.arc) { keep = false; } } if (keep == true) { // add distance for sorting purposes later sensedEntities.Add(new SensedEntity(dis, ent.UUID)); } } } } return(sensedEntities); }
private void CreatePrim(WarpRenderer renderer, SceneObjectPart prim, bool useTextures) { const float MIN_SIZE_SQUARE = 4f; if ((PCode)prim.Shape.PCode != PCode.Prim) { return; } float primScaleLenSquared = prim.Scale.LengthSquared(); if (primScaleLenSquared < MIN_SIZE_SQUARE) { return; } FacetedMesh renderMesh = null; Primitive omvPrim = prim.Shape.ToOmvPrimitive(prim.OffsetPosition, prim.RotationOffset); if (m_renderMeshes) { if (omvPrim.Sculpt != null && omvPrim.Sculpt.SculptTexture != UUID.Zero) { // Try fetchinng the asset byte[] sculptAsset = m_scene.AssetService.GetData(omvPrim.Sculpt.SculptTexture.ToString()); if (sculptAsset != null) { // Is it a mesh? if (omvPrim.Sculpt.Type == SculptType.Mesh) { AssetMesh meshAsset = new AssetMesh(omvPrim.Sculpt.SculptTexture, sculptAsset); FacetedMesh.TryDecodeFromAsset(omvPrim, meshAsset, DetailLevel.Highest, out renderMesh); meshAsset = null; } else // It's sculptie { IJ2KDecoder imgDecoder = m_scene.RequestModuleInterface <IJ2KDecoder>(); if (imgDecoder != null) { Image sculpt = imgDecoder.DecodeToImage(sculptAsset); if (sculpt != null) { renderMesh = m_primMesher.GenerateFacetedSculptMesh(omvPrim, (Bitmap)sculpt, DetailLevel.Medium); sculpt.Dispose(); } } } } } } // If not a mesh or sculptie, try the regular mesher if (renderMesh == null) { renderMesh = m_primMesher.GenerateFacetedMesh(omvPrim, DetailLevel.Medium); } if (renderMesh == null) { return; } string primID = prim.UUID.ToString(); // Create the prim faces // TODO: Implement the useTextures flag behavior for (int i = 0; i < renderMesh.Faces.Count; i++) { Face face = renderMesh.Faces[i]; string meshName = primID + i.ToString(); // Avoid adding duplicate meshes to the scene if (renderer.Scene.objectData.ContainsKey(meshName)) { continue; } warp_Object faceObj = new warp_Object(); for (int j = 0; j < face.Vertices.Count; j++) { Vertex v = face.Vertices[j]; warp_Vector pos = ConvertVector(v.Position); warp_Vertex vert = new warp_Vertex(pos, v.TexCoord.X, v.TexCoord.Y); faceObj.addVertex(vert); } for (int j = 0; j < face.Indices.Count; j += 3) { faceObj.addTriangle( face.Indices[j + 0], face.Indices[j + 1], face.Indices[j + 2]); } Primitive.TextureEntryFace teFace = prim.Shape.Textures.GetFace((uint)i); Color4 faceColor = GetFaceColor(teFace); string materialName = String.Empty; if (m_texturePrims && primScaleLenSquared > m_texturePrimSize * m_texturePrimSize) { materialName = GetOrCreateMaterial(renderer, faceColor, teFace.TextureID); } else { materialName = GetOrCreateMaterial(renderer, faceColor); } warp_Vector primPos = ConvertVector(prim.GetWorldPosition()); warp_Quaternion primRot = ConvertQuaternion(prim.GetWorldRotation()); warp_Matrix m = warp_Matrix.quaternionMatrix(primRot); faceObj.transform(m); faceObj.setPos(primPos); faceObj.scaleSelf(prim.Scale.X, prim.Scale.Z, prim.Scale.Y); renderer.Scene.addObject(meshName, faceObj); renderer.SetObjectMaterial(meshName, materialName); } }
/// <summary> /// Detects if a scene object group from the scene list has moved or changed scale. The green aura /// that surrounds the object is then moved or scaled with the group. /// </summary> public System.Collections.ArrayList UpdateNormalEntityEffects(SceneObjectGroup group) { System.Collections.ArrayList auraList = new System.Collections.ArrayList(); if (group == null) { return(null); } SceneObjectPart[] parts = group.Parts; for (int i = 0; i < parts.Length; i++) { SceneObjectPart part = parts[i]; if (m_MetaEntityCollection.Auras.ContainsKey(part.UUID)) { ((AuraMetaEntity)m_MetaEntityCollection.Auras[part.UUID]).SetAura(new Vector3(0, 254, 0), part.Scale); ((AuraMetaEntity)m_MetaEntityCollection.Auras[part.UUID]).RootPart.GroupPosition = part.GetWorldPosition(); auraList.Add((AuraMetaEntity)m_MetaEntityCollection.Auras[part.UUID]); } } return(auraList); }
public void SendEmail(UUID objectID, string address, string subject, string body) { SceneObjectPart sceneObject = m_scene.GetSceneObjectPart(objectID); m_sending = (Int32)(DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1))).TotalSeconds; try { lock (m_sendMessages) { MimeMessage message = new MimeMessage(); message.From.Add(new MailboxAddress(sceneObject.Name, sceneObject.UUID + "@" + SMTP_SERVER_SENDER)); message.To.Add(new MailboxAddress("", address)); message.Subject = subject; message.Body = new TextPart("plain") { Text = body }; message.Headers.Add(new Header(Encoding.UTF8, "ObjectID", sceneObject.UUID.ToString())); message.Headers.Add(new Header(Encoding.UTF8, "AvatarID", sceneObject.OwnerID.ToString())); message.Headers.Add(new Header(Encoding.UTF8, "Location", m_scene.Name + "@" + sceneObject.GetWorldPosition().ToString())); m_sendMessages.Add(message); } }catch (Exception _error) { m_log.Error("[" + Name + "] " + _error.Message); } }