Пример #1
0
        private void SetShinyBump(LLPrimitive obj, Shininess shiny, Bumpiness bump, int side)
        {
            int sides = GetNumberOfSides(obj);

            if (side >= 0 && side < sides)
            {
                // Get or create the requested face and update
                Primitive.TextureEntryFace face = obj.Prim.Textures.CreateFace((uint)side);
                face.Shiny = shiny;
                face.Bump  = bump;

                obj.Scene.EntityAddOrUpdate(this, obj, 0, (uint)LLUpdateFlags.Textures);
            }
            else if (side == LSLConstants.ALL_SIDES)
            {
                // Change all of the faces
                for (uint i = 0; i < sides; i++)
                {
                    Primitive.TextureEntryFace face = obj.Prim.Textures.GetFace(i);
                    if (face != null)
                    {
                        face.Shiny = shiny;
                        face.Bump  = bump;
                    }
                }

                obj.Scene.EntityAddOrUpdate(this, obj, 0, (uint)LLUpdateFlags.Textures);
            }
        }
Пример #2
0
        public void SetShiny(SceneObjectPart part, int face, int shiny, Bumpiness bump)
        {

            Shininess sval = new Shininess();

            switch (shiny)
            {
            case 0:
                sval = Shininess.None;
                break;
            case 1:
                sval = Shininess.Low;
                break;
            case 2:
                sval = Shininess.Medium;
                break;
            case 3:
                sval = Shininess.High;
                break;
            default:
                sval = Shininess.None;
                break;
            }

            Primitive.TextureEntry tex = part.Shape.Textures;
            if (face >= 0 && face < GetNumberOfSides(part))
            {
                tex.CreateFace((uint) face);
                tex.FaceTextures[face].Shiny = sval;
                tex.FaceTextures[face].Bump = bump;
                part.UpdateTextureEntry(tex.GetBytes());
                return;
            }
            else if (face == ScriptBaseClass.ALL_SIDES)
            {
                for (uint i = 0; i < GetNumberOfSides(part); i++)
                {
                    if (tex.FaceTextures[i] != null)
                    {
                        tex.FaceTextures[i].Shiny = sval;
                        tex.FaceTextures[i].Bump = bump;;
                    }
                    tex.DefaultTexture.Shiny = sval;
                    tex.DefaultTexture.Bump = bump;
                }
                part.UpdateTextureEntry(tex.GetBytes());
                return;
            }
        }
        private void SetTexPrimitiveParams(TextureEntryFace face, PrimitiveParamsType type, AnArray.MarkEnumerator enumerator, ref UpdateChangedFlags flags, ref bool isUpdated, bool updateParams)
        {
            switch (type)
            {
            case PrimitiveParamsType.Texture:
            {
                UUID    textureID = m_Part.GetTextureParam(enumerator, "PRIM_TEXTURE");
                Vector3 repeats   = ParamsHelper.GetVector(enumerator, "PRIM_TEXTURE");
                Vector3 offsets   = ParamsHelper.GetVector(enumerator, "PRIM_TEXTURE");
                float   rot       = (float)ParamsHelper.GetDouble(enumerator, "PRIM_TEXTURE");

                if (updateParams)
                {
                    if (m_Part.TryFetchTexture(textureID))
                    {
                        face.TextureID = textureID;
                    }
                    face.RepeatU  = (float)repeats.X;
                    face.RepeatV  = (float)repeats.Y;
                    face.OffsetU  = (float)offsets.X;
                    face.OffsetV  = (float)offsets.Y;
                    face.Rotation = rot;
                    flags        |= UpdateChangedFlags.Texture;
                    isUpdated     = true;
                }
            }
            break;

            case PrimitiveParamsType.Color:
            {
                Vector3 color = ParamsHelper.GetVector(enumerator, "PRIM_COLOR");
                double  alpha = ParamsHelper.GetDouble(enumerator, "PRIM_COLOR").Clamp(0, 1);
                if (updateParams)
                {
                    face.TextureColor = new ColorAlpha(color, alpha);
                    flags            |= UpdateChangedFlags.Color;
                    isUpdated         = true;
                }
            }
            break;

            case PrimitiveParamsType.Alpha:
            {
                double alpha = ParamsHelper.GetDouble(enumerator, "PRIM_ALPHA").Clamp(0, 1);
                if (updateParams)
                {
                    ColorAlpha color = face.TextureColor;
                    color.A           = alpha;
                    face.TextureColor = color;
                    flags            |= UpdateChangedFlags.Color;
                    isUpdated         = true;
                }
            }
            break;

            case PrimitiveParamsType.BumpShiny:
            {
                Shininess shiny = (Shininess)ParamsHelper.GetInteger(enumerator, "PRIM_BUMP_SHINY");
                Bumpiness bump  = (Bumpiness)ParamsHelper.GetInteger(enumerator, "PRIM_BUMP_SHINY");
                if (updateParams)
                {
                    face.Shiny = shiny;
                    face.Bump  = bump;
                    flags     |= UpdateChangedFlags.Texture;
                    isUpdated  = true;
                }
            }
            break;

            case PrimitiveParamsType.FullBright:
            {
                bool fbright = ParamsHelper.GetBoolean(enumerator, "PRIM_FULLBRIGHT");
                if (updateParams)
                {
                    face.FullBright = fbright;
                    flags          |= UpdateChangedFlags.Color;
                    isUpdated       = true;
                }
            }
            break;

            case PrimitiveParamsType.TexGen:
            {
                MappingType mapType = (MappingType)ParamsHelper.GetInteger(enumerator, "PRIM_TEXGEN");
                if (updateParams)
                {
                    face.TexMapType = mapType;
                    flags          |= UpdateChangedFlags.Texture;
                    isUpdated       = true;
                }
            }
            break;

            case PrimitiveParamsType.Glow:
            {
                float glow = (float)ParamsHelper.GetDouble(enumerator, "PRIM_GLOW").Clamp(0, 1);
                if (updateParams)
                {
                    face.Glow = glow;
                    flags    |= UpdateChangedFlags.Color;
                    isUpdated = true;
                }
            }
            break;

            case PrimitiveParamsType.AlphaMode:
                /* [ PRIM_ALPHA_MODE, integer face, integer alpha_mode, integer mask_cutoff ] */
            {
                Material mat;
                try
                {
                    mat = m_Part.ObjectGroup.Scene.GetMaterial(face.MaterialID);
                }
                catch
                {
                    mat = new Material();
                }
                mat.DiffuseAlphaMode = ParamsHelper.GetInteger(enumerator, "PRIM_ALPHA_MODE");
                mat.AlphaMaskCutoff  = ParamsHelper.GetInteger(enumerator, "PRIM_ALPHA_MODE");

                if (updateParams)
                {
                    mat.DiffuseAlphaMode = mat.DiffuseAlphaMode.Clamp(0, 3);
                    mat.AlphaMaskCutoff  = mat.AlphaMaskCutoff.Clamp(0, 3);
                    mat.MaterialID       = UUID.Random;
                    m_Part.ObjectGroup.Scene.StoreMaterial(mat);
                    face.MaterialID = mat.MaterialID;
                    flags          |= UpdateChangedFlags.Texture;
                    isUpdated       = true;
                }
            }
            break;

            case PrimitiveParamsType.Normal:
                /* [ PRIM_NORMAL, integer face, string texture, vector repeats, vector offsets, float rotation_in_radians ] */
            {
                UUID    texture  = m_Part.GetTextureParam(enumerator, "PRIM_NORMAL");
                Vector3 repeats  = ParamsHelper.GetVector(enumerator, "PRIM_NORMAL");
                Vector3 offsets  = ParamsHelper.GetVector(enumerator, "PRIM_NORMAL");
                double  rotation = ParamsHelper.GetDouble(enumerator, "PRIM_NORMAL");

                if (updateParams)
                {
                    repeats.X *= Material.MATERIALS_MULTIPLIER;
                    repeats.Y *= Material.MATERIALS_MULTIPLIER;
                    offsets.X *= Material.MATERIALS_MULTIPLIER;
                    offsets.Y *= Material.MATERIALS_MULTIPLIER;
                    rotation  %= Math.PI * 2;
                    rotation  *= Material.MATERIALS_MULTIPLIER;

                    Material mat;
                    try
                    {
                        mat = m_Part.ObjectGroup.Scene.GetMaterial(face.MaterialID);
                    }
                    catch
                    {
                        mat = new Material();
                    }
                    mat.NormMap      = texture;
                    mat.NormOffsetX  = (int)Math.Round(offsets.X);
                    mat.NormOffsetY  = (int)Math.Round(offsets.Y);
                    mat.NormRepeatX  = (int)Math.Round(repeats.X);
                    mat.NormRepeatY  = (int)Math.Round(repeats.Y);
                    mat.NormRotation = (int)Math.Round(rotation);
                    mat.MaterialID   = UUID.Random;
                    if (m_Part.TryFetchTexture(texture))
                    {
                        m_Part.ObjectGroup.Scene.StoreMaterial(mat);
                        face.MaterialID = mat.MaterialID;
                    }
                    flags    |= UpdateChangedFlags.Texture;
                    isUpdated = true;
                }
            }
            break;

            case PrimitiveParamsType.Specular:
                /* [ PRIM_SPECULAR, integer face, string texture, vector repeats, vector offsets, float rotation_in_radians, vector color, integer glossiness, integer environment ] */
            {
                UUID    texture = m_Part.GetTextureParam(enumerator, "PRIM_NORMAL");
                Vector3 repeats = ParamsHelper.GetVector(enumerator, "PRIM_SPECULAR");
                Vector3 offsets = ParamsHelper.GetVector(enumerator, "PRIM_SPECULAR");
                repeats *= Material.MATERIALS_MULTIPLIER;
                offsets *= Material.MATERIALS_MULTIPLIER;
                double rotation = ParamsHelper.GetDouble(enumerator, "PRIM_SPECULAR");
                rotation %= Math.PI * 2;
                rotation *= Material.MATERIALS_MULTIPLIER;
                var color       = new ColorAlpha(ParamsHelper.GetVector(enumerator, "PRIM_SPECULAR"), 1);
                int glossiness  = ParamsHelper.GetInteger(enumerator, "PRIM_SPECULAR");
                int environment = ParamsHelper.GetInteger(enumerator, "PRIM_SPECULAR");
                if (updateParams)
                {
                    environment = environment.Clamp(0, 255);
                    glossiness  = glossiness.Clamp(0, 255);
                    Material mat;
                    try
                    {
                        mat = m_Part.ObjectGroup.Scene.GetMaterial(face.MaterialID);
                    }
                    catch
                    {
                        mat = new Material();
                    }
                    mat.SpecColor    = color;
                    mat.SpecMap      = texture;
                    mat.SpecOffsetX  = (int)Math.Round(offsets.X);
                    mat.SpecOffsetY  = (int)Math.Round(offsets.Y);
                    mat.SpecRepeatX  = (int)Math.Round(repeats.X);
                    mat.SpecRepeatY  = (int)Math.Round(repeats.Y);
                    mat.SpecRotation = (int)Math.Round(rotation);
                    mat.EnvIntensity = environment;
                    mat.SpecExp      = glossiness;
                    mat.MaterialID   = UUID.Random;
                    if (m_Part.TryFetchTexture(texture))
                    {
                        m_Part.ObjectGroup.Scene.StoreMaterial(mat);
                        face.MaterialID = mat.MaterialID;
                    }
                    flags    |= UpdateChangedFlags.Texture;
                    isUpdated = true;
                }
            }
            break;

            default:
                throw new ArgumentException($"Internal error! Primitive parameter type {type} should not be passed to PrimitiveFace");
            }
        }
Пример #4
0
 public void Deserialize(OSDMap map)
 {
     Bump = (Bumpiness)map["bump"].AsInteger();
     Color = map["colors"].AsColor4();
     Fullbright = map["fullbright"].AsBoolean();
     Glow = (float)map["glow"].AsReal();
     ImageID = map["imageid"].AsUUID();
     ImageRot = (float)map["imagerot"].AsReal();
     MediaFlags = map["media_flags"].AsInteger();
     OffsetS = (float)map["offsets"].AsReal();
     OffsetT = (float)map["offsett"].AsReal();
     ScaleS = (float)map["scales"].AsReal();
     ScaleT = (float)map["scalet"].AsReal();
 }
Пример #5
0
        private void SetShiny(SceneObjectPart part, int shiny, Bumpiness bump, int face)
        {
            Shininess sval = new Shininess();

            switch (shiny)
            {
                case 0:
                    sval = Shininess.None;
                    break;
                case 1:
                    sval = Shininess.Low;
                    break;
                case 2:
                    sval = Shininess.Medium;
                    break;
                case 3:
                    sval = Shininess.High;
                    break;
                default:
                    sval = Shininess.None;
                    break;
            }

            Primitive.TextureEntry tex = part.Shape.Textures;
            if (face >= 0 && face < MAX_SIDES)
            {
                tex.CreateFace((uint)face);
                tex.FaceTextures[face].Shiny = sval;
                tex.FaceTextures[face].Bump = bump;
                part.UpdateTexture(tex);
                return;
            }
            else if (face == ALL_SIDES)
            {
                for (uint i = 0; i < MAX_SIDES; i++)
                {
                    if (tex.FaceTextures[i] != null)
                    {
                        tex.FaceTextures[i].Shiny = sval;
                        tex.FaceTextures[i].Bump = bump; ;
                    }
                    tex.DefaultTexture.Shiny = sval;
                    tex.DefaultTexture.Bump = bump;
                }
                part.UpdateTexture(tex);
                return;
            }
        }
Пример #6
0
        private void SetPrimParams(IScriptInstance script, ISceneEntity entity, object[] rules)
        {
            LLPrimitive prim = entity as LLPrimitive;

            if (prim == null)
            {
                return;
            }

            bool changedShape = false, changedColor = false, changedTexture = false;

            int i = 0;

            while (i < rules.Length)
            {
                int code = llList2Integer(script, rules, i++);

                switch (code)
                {
                case LSLConstants.PRIM_NAME:
                {
                    SetObjectName(prim, llList2String(script, rules, i++));
                    break;
                }

                case LSLConstants.PRIM_DESC:
                {
                    SetObjectDesc(prim, llList2String(script, rules, i++));
                    break;
                }

                case LSLConstants.PRIM_TYPE:
                {
                    SetPrimType(script, rules, ref i);
                    prim.Scene.EntityAddOrUpdate(this, prim, UpdateFlags.Shape, 0);
                    changedShape = true;
                    break;
                }

                case LSLConstants.PRIM_MATERIAL:
                {
                    prim.Prim.PrimData.Material = (Material)llList2Integer(script, rules, i++);
                    prim.Scene.EntityAddOrUpdate(this, prim, 0, (uint)LLUpdateFlags.Material);
                    break;
                }

                case LSLConstants.PRIM_PHYSICS:
                {
                    SetStatus(prim, LSLConstants.STATUS_PHYSICS, llList2Integer(script, rules, i++));
                    break;
                }

                case LSLConstants.PRIM_TEMP_ON_REZ:
                {
                    bool        tempOnRez = (llList2Integer(script, rules, i++) != 0);
                    LLPrimitive parent    = GetRootEntity(prim) as LLPrimitive;
                    if (parent != null)
                    {
                        if (tempOnRez)
                        {
                            parent.Prim.Flags |= PrimFlags.TemporaryOnRez;
                        }
                        else
                        {
                            parent.Prim.Flags &= ~PrimFlags.TemporaryOnRez;
                        }
                        parent.Scene.EntityAddOrUpdate(this, parent, 0, (uint)LLUpdateFlags.PrimFlags);
                    }
                    break;
                }

                case LSLConstants.PRIM_PHANTOM:
                {
                    SetStatus(prim, LSLConstants.STATUS_PHANTOM, llList2Integer(script, rules, i++));
                    break;
                }

                case LSLConstants.PRIM_POSITION:
                {
                    SetPos(prim, llList2Vector(script, rules, i++));
                    break;
                }

                case LSLConstants.PRIM_ROTATION:
                {
                    SetRot(prim, llList2Rot(script, rules, i++));
                    break;
                }

                case LSLConstants.PRIM_SIZE:
                {
                    SetScale(prim, llList2Vector(script, rules, i++));
                    break;
                }

                case LSLConstants.PRIM_TEXTURE:
                {
                    int     face       = llList2Integer(script, rules, i++);
                    string  texture    = llList2String(script, rules, i++);
                    Vector3 repeats    = llList2Vector(script, rules, i++);
                    Vector3 offsets    = llList2Vector(script, rules, i++);
                    float   rotRadians = llList2Float(script, rules, i++);

                    SetTexture(script, prim, texture, face);
                    ScaleTexture(script, prim, repeats.X, repeats.Y, face);
                    OffsetTexture(script, prim, offsets.X, offsets.Y, face);
                    RotateTexture(script, prim, rotRadians, face);

                    changedTexture = true;
                    break;
                }

                case LSLConstants.PRIM_TEXT:
                {
                    string  text  = llList2String(script, rules, i++);
                    Vector3 color = llList2Vector(script, rules, i++);
                    float   alpha = llList2Float(script, rules, i++);

                    SetText(prim, text, color, alpha);
                    break;
                }

                case LSLConstants.PRIM_COLOR:
                {
                    int     face  = llList2Integer(script, rules, i++);
                    Vector3 color = llList2Vector(script, rules, i++);
                    float   alpha = llList2Float(script, rules, i++);

                    SetColor(prim, color, face);
                    SetAlpha(prim, alpha, face);

                    changedColor = true;
                    break;
                }

                case LSLConstants.PRIM_BUMP_SHINY:
                {
                    int       face  = llList2Integer(script, rules, i++);
                    Shininess shiny = (Shininess)llList2Integer(script, rules, i++);
                    Bumpiness bump  = (Bumpiness)llList2Integer(script, rules, i++);

                    SetShinyBump(prim, shiny, bump, face);

                    changedTexture = true;
                    break;
                }

                case LSLConstants.PRIM_POINT_LIGHT:
                {
                    bool    enabled   = (llList2Integer(script, rules, i++) != 0);
                    Vector3 color     = llList2Vector(script, rules, i++);
                    float   intensity = llList2Float(script, rules, i++);
                    float   radius    = llList2Float(script, rules, i++);
                    float   falloff   = llList2Float(script, rules, i++);

                    if (enabled)
                    {
                        Primitive.LightData light = new Primitive.LightData();
                        light.Color = new Color4(
                            Utils.Clamp(color.X, 0f, 1f),
                            Utils.Clamp(color.Y, 0f, 1f),
                            Utils.Clamp(color.Z, 0f, 1f),
                            1f);
                        light.Intensity = intensity;
                        light.Radius    = radius;
                        light.Falloff   = falloff;

                        prim.Prim.Light = light;
                    }
                    else
                    {
                        prim.Prim.Light = null;
                    }

                    prim.Scene.EntityAddOrUpdate(this, prim, 0, (uint)LLUpdateFlags.ExtraData);
                    break;
                }

                case LSLConstants.PRIM_FULLBRIGHT:
                {
                    int  face       = llList2Integer(script, rules, i++);
                    bool fullbright = (llList2Integer(script, rules, i++) != 0);
                    SetFullbright(prim, fullbright, face);

                    changedTexture = true;
                    break;
                }

                case LSLConstants.PRIM_FLEXIBLE:
                {
                    bool    enabled  = (llList2Integer(script, rules, i++) != 0);
                    int     softness = llList2Integer(script, rules, i++);
                    float   gravity  = llList2Float(script, rules, i++);
                    float   friction = llList2Float(script, rules, i++);
                    float   wind     = llList2Float(script, rules, i++);
                    float   tension  = llList2Float(script, rules, i++);
                    Vector3 force    = llList2Vector(script, rules, i++);

                    if (enabled)
                    {
                        Primitive.FlexibleData flex = new Primitive.FlexibleData();
                        flex.Softness = softness;
                        flex.Gravity  = gravity;
                        flex.Drag     = friction;
                        flex.Wind     = wind;
                        flex.Tension  = tension;
                        flex.Force    = force;

                        prim.Prim.Flexible = flex;
                    }
                    else
                    {
                        prim.Prim.Flexible = null;
                    }

                    prim.Scene.EntityAddOrUpdate(this, prim, 0, (uint)LLUpdateFlags.ExtraData);
                    break;
                }

                case LSLConstants.PRIM_TEXGEN:
                {
                    int         face   = llList2Integer(script, rules, i++);
                    MappingType texgen = (MappingType)llList2Integer(script, rules, i++);
                    SetTexgen(prim, texgen, face);

                    changedTexture = true;
                    break;
                }

                case LSLConstants.PRIM_GLOW:
                {
                    int   face      = llList2Integer(script, rules, i++);
                    float intensity = llList2Float(script, rules, i++);
                    SetGlow(prim, intensity, face);

                    changedTexture = true;
                    break;
                }
                }
            }

            if (m_lslScriptEngine != null)
            {
                if (changedShape)
                {
                    m_lslScriptEngine.PostObjectEvent(prim.ID, "changed", new object[] { LSLConstants.CHANGED_SHAPE }, null);
                }
                if (changedTexture)
                {
                    m_lslScriptEngine.PostObjectEvent(prim.ID, "changed", new object[] { LSLConstants.CHANGED_TEXTURE }, null);
                }
                if (changedColor)
                {
                    m_lslScriptEngine.PostObjectEvent(prim.ID, "changed", new object[] { LSLConstants.CHANGED_COLOR }, null);
                }
            }
        }
Пример #7
0
        private void SetShinyBump(LLPrimitive obj, Shininess shiny, Bumpiness bump, int side)
        {
            int sides = GetNumberOfSides(obj);
            if (side >= 0 && side < sides)
            {
                // Get or create the requested face and update
                Primitive.TextureEntryFace face = obj.Prim.Textures.CreateFace((uint)side);
                face.Shiny = shiny;
                face.Bump = bump;

                obj.Scene.EntityAddOrUpdate(this, obj, 0, (uint)LLUpdateFlags.Textures);
            }
            else if (side == LSLConstants.ALL_SIDES)
            {
                // Change all of the faces
                for (uint i = 0; i < sides; i++)
                {
                    Primitive.TextureEntryFace face = obj.Prim.Textures.GetFace(i);
                    if (face != null)
                    {
                        face.Shiny = shiny;
                        face.Bump = bump;
                    }
                }

                obj.Scene.EntityAddOrUpdate(this, obj, 0, (uint)LLUpdateFlags.Textures);
            }
        }