/// <summary> /// Set the owner of the root part. /// </summary> /// <param name="part"></param> /// <param name="cAgentID"></param> /// <param name="cGroupID"></param> public void SetRootPartOwner(SceneObjectPart part, UUID cAgentID, UUID cGroupID) { part.LastOwnerID = part.OwnerID; part.OwnerID = cAgentID; part.GroupID = cGroupID; if (part.OwnerID != cAgentID) { // Apply Next Owner Permissions if we're not bypassing permissions if (!m_scene.Permissions.BypassPermissions()) ApplyNextOwnerPermissions(); } part.ScheduleUpdate(PrimUpdateFlags.FullUpdate); }
private void SetTextureAnim(SceneObjectPart part, int mode, int face, int sizex, int sizey, double start, double length, double rate) { Primitive.TextureAnimation pTexAnim = new Primitive.TextureAnimation(); pTexAnim.Flags = (Primitive.TextureAnimMode)mode; //ALL_SIDES if (face == ScriptBaseClass.ALL_SIDES) face = 255; pTexAnim.Face = (uint)face; pTexAnim.Length = (float)length; pTexAnim.Rate = (float)rate; pTexAnim.SizeX = (uint)sizex; pTexAnim.SizeY = (uint)sizey; pTexAnim.Start = (float)start; part.AddTextureAnimation(pTexAnim); part.ScheduleUpdate(PrimUpdateFlags.FindBest); part.ParentGroup.HasGroupChanged = true; }
private void SetParticleSystem(SceneObjectPart part, LSL_List rules) { if (rules.Length == 0) { part.RemoveParticleSystem(); part.ParentGroup.HasGroupChanged = true; } else { Primitive.ParticleSystem prules = getNewParticleSystemWithSLDefaultValues(); LSL_Vector tempv = new LSL_Vector(); float tempf = 0; for (int i = 0; i < rules.Length; i += 2) { LSL_Integer rule = rules.GetLSLIntegerItem(i); if (rule == (int)ScriptBaseClass.PSYS_PART_FLAGS) { prules.PartDataFlags = (Primitive.ParticleSystem.ParticleDataFlags)(uint)rules.GetLSLIntegerItem(i + 1); } else if (rule == (int)ScriptBaseClass.PSYS_PART_START_COLOR) { tempv = rules.GetVector3Item(i + 1); prules.PartStartColor.R = (float)tempv.x; prules.PartStartColor.G = (float)tempv.y; prules.PartStartColor.B = (float)tempv.z; } else if (rule == (int)ScriptBaseClass.PSYS_PART_START_ALPHA) { tempf = (float)rules.GetLSLFloatItem(i + 1); prules.PartStartColor.A = tempf; } else if (rule == (int)ScriptBaseClass.PSYS_PART_END_COLOR) { tempv = rules.GetVector3Item(i + 1); prules.PartEndColor.R = (float)tempv.x; prules.PartEndColor.G = (float)tempv.y; prules.PartEndColor.B = (float)tempv.z; } else if (rule == (int)ScriptBaseClass.PSYS_PART_END_ALPHA) { tempf = (float)rules.GetLSLFloatItem(i + 1); prules.PartEndColor.A = tempf; } else if (rule == (int)ScriptBaseClass.PSYS_PART_START_SCALE) { tempv = rules.GetVector3Item(i + 1); prules.PartStartScaleX = (float)tempv.x; prules.PartStartScaleY = (float)tempv.y; } else if (rule == (int)ScriptBaseClass.PSYS_PART_END_SCALE) { tempv = rules.GetVector3Item(i + 1); prules.PartEndScaleX = (float)tempv.x; prules.PartEndScaleY = (float)tempv.y; } else if (rule == (int)ScriptBaseClass.PSYS_PART_MAX_AGE) { tempf = (float)rules.GetLSLFloatItem(i + 1); prules.PartMaxAge = tempf; } else if (rule == (int)ScriptBaseClass.PSYS_SRC_ACCEL) { tempv = rules.GetVector3Item(i + 1); prules.PartAcceleration.X = (float)tempv.x; prules.PartAcceleration.Y = (float)tempv.y; prules.PartAcceleration.Z = (float)tempv.z; } else if (rule == (int)ScriptBaseClass.PSYS_SRC_PATTERN) { int tmpi = (int)rules.GetLSLIntegerItem(i + 1); prules.Pattern = (Primitive.ParticleSystem.SourcePattern)tmpi; } // PSYS_SRC_INNERANGLE and PSYS_SRC_ANGLE_BEGIN use the same variables. The // PSYS_SRC_OUTERANGLE and PSYS_SRC_ANGLE_END also use the same variable. The // client tells the difference between the two by looking at the 0x02 bit in // the PartFlags variable. else if (rule == (int)ScriptBaseClass.PSYS_SRC_INNERANGLE) { tempf = (float)rules.GetLSLFloatItem(i + 1); prules.InnerAngle = (float)tempf; prules.PartFlags &= 0xFFFFFFFD; // Make sure new angle format is off. } else if (rule == (int)ScriptBaseClass.PSYS_SRC_OUTERANGLE) { tempf = (float)rules.GetLSLFloatItem(i + 1); prules.OuterAngle = (float)tempf; prules.PartFlags &= 0xFFFFFFFD; // Make sure new angle format is off. } else if (rule == (int)ScriptBaseClass.PSYS_SRC_TEXTURE) { prules.Texture = KeyOrName(rules.GetLSLStringItem(i + 1)); } else if (rule == (int)ScriptBaseClass.PSYS_SRC_BURST_RATE) { tempf = (float)rules.GetLSLFloatItem(i + 1); prules.BurstRate = (float)tempf; } else if (rule == (int)ScriptBaseClass.PSYS_SRC_BURST_PART_COUNT) { prules.BurstPartCount = (byte)(int)rules.GetLSLIntegerItem(i + 1); } else if (rule == (int)ScriptBaseClass.PSYS_SRC_BURST_RADIUS) { tempf = (float)rules.GetLSLFloatItem(i + 1); prules.BurstRadius = (float)tempf; } else if (rule == (int)ScriptBaseClass.PSYS_SRC_BURST_SPEED_MIN) { tempf = (float)rules.GetLSLFloatItem(i + 1); prules.BurstSpeedMin = (float)tempf; } else if (rule == (int)ScriptBaseClass.PSYS_SRC_BURST_SPEED_MAX) { tempf = (float)rules.GetLSLFloatItem(i + 1); prules.BurstSpeedMax = (float)tempf; } else if (rule == (int)ScriptBaseClass.PSYS_SRC_MAX_AGE) { tempf = (float)rules.GetLSLFloatItem(i + 1); prules.MaxAge = (float)tempf; } else if (rule == (int)ScriptBaseClass.PSYS_SRC_TARGET_KEY) { UUID key = UUID.Zero; if (UUID.TryParse(rules.Data[i + 1].ToString(), out key)) { prules.Target = key; } else { prules.Target = part.UUID; } } else if (rule == (int)ScriptBaseClass.PSYS_SRC_OMEGA) { // AL: This is an assumption, since it is the only thing that would match. tempv = rules.GetVector3Item(i + 1); prules.AngularVelocity.X = (float)tempv.x; prules.AngularVelocity.Y = (float)tempv.y; prules.AngularVelocity.Z = (float)tempv.z; } else if (rule == (int)ScriptBaseClass.PSYS_SRC_ANGLE_BEGIN) { tempf = (float)rules.GetLSLFloatItem(i + 1); prules.InnerAngle = (float)tempf; prules.PartFlags |= 0x02; // Set new angle format. } else if (rule == (int)ScriptBaseClass.PSYS_SRC_ANGLE_END) { tempf = (float)rules.GetLSLFloatItem(i + 1); prules.OuterAngle = (float)tempf; prules.PartFlags |= 0x02; // Set new angle format. } } prules.CRC = 1; part.AddNewParticleSystem(prules); part.ParentGroup.HasGroupChanged = true; } part.ScheduleUpdate(PrimUpdateFlags.Particles); }
/// <summary> /// Set flexi parameters of a part. /// /// FIXME: Much of this code should probably be within the part itself. /// </summary> /// <param name="part"></param> /// <param name="flexi"></param> /// <param name="softness"></param> /// <param name="gravity"></param> /// <param name="friction"></param> /// <param name="wind"></param> /// <param name="tension"></param> /// <param name="Force"></param> protected void SetFlexi(SceneObjectPart part, bool flexi, int softness, float gravity, float friction, float wind, float tension, LSL_Vector Force) { if (part == null) return; if (flexi) { part.Shape.PathCurve |= (byte)Extrusion.Flexible; part.Shape.FlexiEntry = true; // this setting flexi true isn't working, but the below parameters do // work once the prim is already flexi part.Shape.FlexiSoftness = softness; part.Shape.FlexiGravity = gravity; part.Shape.FlexiDrag = friction; part.Shape.FlexiWind = wind; part.Shape.FlexiTension = tension; part.Shape.FlexiForceX = (float)Force.x; part.Shape.FlexiForceY = (float)Force.y; part.Shape.FlexiForceZ = (float)Force.z; part.Shape.PathCurve = 0x80; } else { int curve = part.Shape.PathCurve; curve &= (int)(~(Extrusion.Flexible)); part.Shape.PathCurve = (byte)curve; part.Shape.FlexiEntry = false; } part.ParentGroup.HasGroupChanged = true; part.ScheduleUpdate(PrimUpdateFlags.FullUpdate); }
/// <summary> /// Set a light point on a part /// </summary> /// FIXME: Much of this code should probably be in SceneObjectGroup /// /// <param name="part"></param> /// <param name="light"></param> /// <param name="color"></param> /// <param name="intensity"></param> /// <param name="radius"></param> /// <param name="falloff"></param> protected void SetPointLight(SceneObjectPart part, bool light, LSL_Vector color, float intensity, float radius, float falloff) { if (part == null) return; if (light) { part.Shape.LightEntry = true; part.Shape.LightColorR = Util.Clip((float)color.x, 0.0f, 1.0f); part.Shape.LightColorG = Util.Clip((float)color.y, 0.0f, 1.0f); part.Shape.LightColorB = Util.Clip((float)color.z, 0.0f, 1.0f); part.Shape.LightIntensity = intensity; part.Shape.LightRadius = radius; part.Shape.LightFalloff = falloff; } else { part.Shape.LightEntry = false; } part.ParentGroup.HasGroupChanged = true; part.ScheduleUpdate(PrimUpdateFlags.FindBest); }
protected void SetAlpha(SceneObjectPart part, double alpha, int face) { Primitive.TextureEntry tex = part.Shape.Textures; Color4 texcolor; if (face >= 0 && face < GetNumberOfSides(part)) { texcolor = tex.CreateFace((uint)face).RGBA; texcolor.A = Util.Clip((float)alpha, 0.0f, 1.0f); tex.FaceTextures[face].RGBA = texcolor; part.UpdateTexture(tex); } else if (face == ScriptBaseClass.ALL_SIDES) { for (int i = 0; i < GetNumberOfSides(part); i++) { if (tex.FaceTextures[i] != null) { texcolor = tex.FaceTextures[i].RGBA; texcolor.A = Util.Clip((float)alpha, 0.0f, 1.0f); tex.FaceTextures[i].RGBA = texcolor; } } texcolor = tex.DefaultTexture.RGBA; texcolor.A = Util.Clip((float)alpha, 0.0f, 1.0f); tex.DefaultTexture.RGBA = texcolor; part.UpdateTexture(tex); } part.ScheduleUpdate(PrimUpdateFlags.FullUpdate); }
protected void SetScale(SceneObjectPart part, LSL_Vector scale) { if (part == null || part.ParentGroup == null || part.ParentGroup.IsDeleted) return; IOpenRegionSettingsModule WSModule = m_host.ParentGroup.Scene.RequestModuleInterface<IOpenRegionSettingsModule>(); if (WSModule != null) { if (WSModule.MinimumPrimScale != -1) { if (scale.x < WSModule.MinimumPrimScale) scale.x = WSModule.MinimumPrimScale; if (scale.y < WSModule.MinimumPrimScale) scale.y = WSModule.MinimumPrimScale; if (scale.z < WSModule.MinimumPrimScale) scale.z = WSModule.MinimumPrimScale; } if (part.ParentGroup.RootPart.PhysActor != null && part.ParentGroup.RootPart.PhysActor.IsPhysical && WSModule.MaximumPhysPrimScale != -1) { if (scale.x > WSModule.MaximumPhysPrimScale) scale.x = WSModule.MaximumPhysPrimScale; if (scale.y > WSModule.MaximumPhysPrimScale) scale.y = WSModule.MaximumPhysPrimScale; if (scale.z > WSModule.MaximumPhysPrimScale) scale.z = WSModule.MaximumPhysPrimScale; } if (WSModule.MaximumPrimScale != -1) { if (scale.x > WSModule.MaximumPrimScale) scale.x = WSModule.MaximumPrimScale; if (scale.y > WSModule.MaximumPrimScale) scale.y = WSModule.MaximumPrimScale; if (scale.z > WSModule.MaximumPrimScale) scale.z = WSModule.MaximumPrimScale; } } Vector3 tmp = part.Scale; tmp.X = (float)scale.x; tmp.Y = (float)scale.y; tmp.Z = (float)scale.z; part.Scale = tmp; part.ScheduleUpdate(PrimUpdateFlags.FindBest); part.ParentGroup.HasGroupChanged = true; }
public void PlaybackState(SceneObjectPart part) { if (part != null) { part.Undoing = true; bool ChangedScale = false; bool ChangedRot = false; bool ChangedPos = false; if (part.UUID == part.ParentGroup.UUID) { if (Position != Vector3.Zero) { ChangedPos = true; part.ParentGroup.AbsolutePosition = Position; } ChangedRot = true; part.RotationOffset = Rotation; if (Scale != Vector3.Zero) { ChangedScale = true; part.Scale = Scale; } #if (!ISWIN) foreach (SceneObjectPart child in part.ParentGroup.ChildrenList) { if (child.UUID != part.UUID) { child.Undo(); //No updates here, child undo will do it on their own } } #else foreach (SceneObjectPart child in part.ParentGroup.ChildrenList.Where(child => child.UUID != part.UUID)) { child.Undo(); //No updates here, child undo will do it on their own } #endif } else { if (Position != Vector3.Zero) { ChangedPos = true; part.FixOffsetPosition(Position, false); } ChangedRot = true; part.UpdateRotation(Rotation); if (Scale != Vector3.Zero) { ChangedScale = true; part.Resize(Scale); } } part.Undoing = false; part.ScheduleUpdate((ChangedScale ? PrimUpdateFlags.Shape : PrimUpdateFlags.None) | (ChangedPos ? PrimUpdateFlags.Position : PrimUpdateFlags.None) | (ChangedRot ? PrimUpdateFlags.Rotation : PrimUpdateFlags.None)); } }
public void SetMediaEntry(SceneObjectPart part, int face, MediaEntry me) { CheckFaceParam(part, face); if (null == part.Shape.Media) part.Shape.Media = new PrimitiveBaseShape.MediaList(new MediaEntry[part.GetNumberOfSides()]); lock (part.Shape.Media) part.Shape.Media[face] = me; UpdateMediaUrl(part, UUID.Zero); part.ScheduleUpdate(PrimUpdateFlags.FullUpdate); part.TriggerScriptChangedEvent(Changed.MEDIA); }
public void PlayfwdState(SceneObjectPart part) { if (part != null) { bool ChangedScale = false; bool ChangedRot = false; bool ChangedPos = false; part.Undoing = true; if (part.UUID == part.ParentGroup.UUID) { if (Position != Vector3.Zero) { ChangedPos = true; part.ParentGroup.AbsolutePosition = Position; } if (Rotation != Quaternion.Identity) { ChangedRot = true; part.UpdateRotation(Rotation); } if (Scale != Vector3.Zero) { ChangedScale = true; part.Resize(Scale); } foreach (SceneObjectPart child in part.ParentGroup.ChildrenList) { if (child.UUID != part.UUID) child.Redo(); //No updates here, child redo will do it on their own } } else { if (Position != Vector3.Zero) { ChangedPos = true; part.FixOffsetPosition(Position,false); } if (Rotation != Quaternion.Identity) { ChangedRot = true; part.ParentGroup.Rotation = (Rotation); } if (Scale != Vector3.Zero) { ChangedScale = true; part.Resize(Scale); } } part.ScheduleUpdate((ChangedScale ? PrimUpdateFlags.Shape : PrimUpdateFlags.None) | (ChangedPos ? PrimUpdateFlags.Position : PrimUpdateFlags.None) | (ChangedRot ? PrimUpdateFlags.Rotation : PrimUpdateFlags.None)); part.Undoing = false; } }