Exemplo n.º 1
0
        private void CreatePointEntity(Scene scene, UUID uuid, Vector3 groupPos)
        {
            SceneObjectPart y = new SceneObjectPart();

            //Initialize part
            y.Name         = "Very Small Point";
            y.RegionHandle = scene.RegionInfo.RegionHandle;
            y.CreationDate = (Int32)(DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalSeconds;
            y.OwnerID      = UUID.Zero;
            y.CreatorID    = UUID.Zero;
            y.LastOwnerID  = UUID.Zero;
            y.UUID         = uuid;

            y.Shape           = PrimitiveBaseShape.CreateBox();
            y.Scale           = new Vector3(0.01f, 0.01f, 0.01f);
            y.LastOwnerID     = UUID.Zero;
            y.GroupPosition   = groupPos;
            y.OffsetPosition  = Vector3.Zero;
            y.RotationOffset  = Quaternion.Identity;
            y.Velocity        = Vector3.Zero;
            y.AngularVelocity = Vector3.Zero;
            y.Acceleration    = Vector3.Zero;

            y.Flags = 0;
            y.TrimPermissions();

            //Initialize group and add part as root part
            SceneObjectGroup x = new SceneObjectGroup(y);

            x.SetScene(scene);
            x.RegionHandle = scene.RegionInfo.RegionHandle;
            x.SetScene(scene);

            m_Entity = x;
        }
 void InitializeMatrix(Scene scene)
 {
     // We're going to place a grid of objects in world
     for (int y = 0; y < m_yCells; y++)
     {
         for (int x = 0; x < m_xCells; x++)
         {
             Vector3 pos = new Vector3(m_xPos + (x * (m_cellSize + m_cellSpacing)),
                                       m_yPos + (y * (m_cellSize + m_cellSpacing)),
                                       m_zPos);
             PrimitiveBaseShape prim = PrimitiveBaseShape.CreateBox();
             prim.Textures = new Primitive.TextureEntry(new UUID("5748decc-f629-461c-9a36-a35a221fe21f"));
             SceneObjectGroup sog = new SceneObjectGroup(UUID.Zero, pos, prim);
             sog.RootPart.Scale = new Vector3(m_cellSize, m_cellSize, 0.1f);
             Primitive.TextureEntry tex = sog.RootPart.Shape.Textures;
             float  randomValue         = (float)m_random.NextDouble();
             Color4 texcolor            = new Color4(randomValue, randomValue, randomValue, 1.0f);
             m_matrix[y * m_xCells + x] = randomValue;
             tex.DefaultTexture.RGBA    = texcolor;
             sog.RootPart.UpdateTexture(tex);
             m_prims.Add(sog);
         }
     }
     //Add these objects to the list of managed objects
     //Place the objects visibly on the scene
     foreach (SceneObjectGroup sogr in m_prims)
     {
         scene.AddNewSceneObject(sogr, false);
     }
     m_isHidden = false;
 }
Exemplo n.º 3
0
        /// <summary>
        /// Constructs a cube at a given location and size.
        /// </summary>
        /// <param name="pos" type="Vector3">The position of the cube, at it's center, [X,Y,Z]</param>
        /// <param name="dim" type="Vector3">The size of the cube.</param>
        /// <returns>A UUID for the newly created cube or UUID.Zero on failure.</returns>
        /// </summary>
        public PrimitiveBaseShape createCube(Vector3 pos, Vector3 dim, UUID TextureID)
        {
            //  Construct a cube at a given position, size and texture UUID.
            PrimitiveBaseShape cubeShape = PrimitiveBaseShape.CreateBox();// new PrimitiveBaseShape();

            cubeShape.ToOmvPrimitive(pos, Quaternion.Identity);
            cubeShape.Scale = dim;
            sceneGraph.AddNewPrim(UUID.Zero, UUID.Zero, pos, Quaternion.Identity, cubeShape);
            return(cubeShape);
        }
Exemplo n.º 4
0
        public IObject Create(Vector3 position, Quaternion rotation)
        {
            SceneObjectGroup sog = m_scene.AddNewPrim(m_scene.RegionInfo.MasterAvatarAssignedUUID,
                                                      UUID.Zero,
                                                      position,
                                                      rotation,
                                                      PrimitiveBaseShape.CreateBox());

            IObject ret = new SOPObject(m_scene, sog.LocalId);

            return(ret);
        }
Exemplo n.º 5
0
        public IObject Create(Vector3 position, Quaternion rotation)
        {
            ISceneEntity sog = m_scene.SceneGraph.AddNewPrim(m_security.owner.GlobalID,
                                                             UUID.Zero,
                                                             position,
                                                             rotation,
                                                             PrimitiveBaseShape.CreateBox());

            IObject ret = new SOPObject(m_scene, sog.LocalId, m_security);

            return(ret);
        }
Exemplo n.º 6
0
        /// <summary>
        /// Constructs a cube at a given location and size.
        /// </summary>
        /// <param name="pos" type="Vector3">The position of the cube, at it's center, [X,Y,Z]</param>
        /// <param name="dim" type="Vector3">The size of the cube.</param>
        /// <returns>A UUID for the newly created cube or UUID.Zero on failure.</returns>
        /// </summary>
        private PrimitiveBaseShape createCube(Vector3 pos, Vector3 dim, UUID TextureID)
        {
            //  Construct a cube at a given position, size and texture UUID.
            PrimitiveBaseShape cubeShape = PrimitiveBaseShape.CreateBox();// new PrimitiveBaseShape();

            cubeShape.ToOmvPrimitive(pos, Quaternion.Identity);
            cubeShape.Scale = dim;

            // place into the region at given position
            // texture the object from the given texture id, if this texture is not found
            // then default to use one of the standard textures it knows about that
            // during first run it will create and store in the asset database (todo).
            return(cubeShape);
//            return createCube(pos, dim, TextureID);
        }
        void InitializePyramid(Scene scene)
        {
            //Place one large pyramid prim of size size at position pos
            PrimitiveBaseShape prim = PrimitiveBaseShape.CreateBox();

            prim.Textures = new Primitive.TextureEntry(new UUID("5748decc-f629-461c-9a36-a35a236fe36f"));     //give it a blank texture
            SceneObjectGroup sog = new SceneObjectGroup(UUID.Zero, m_pos, prim);

            Primitive.TextureEntry tex = sog.RootPart.Shape.Textures;
            tex.DefaultTexture.RGBA = new Color4(0.0f, 0.50f, 0.0f, 1.0f); //Green
            sog.RootPart.UpdateTexture(tex);
            m_size             = new Vector3(m_xSize, m_ySize, m_zSize);
            sog.RootPart.Scale = m_size;
            m_prims.Add(sog);                      //add it to our list of managed objects
            m_scene.AddNewSceneObject(sog, false); //add it to the scene (not backed up to the db)
        }
Exemplo n.º 8
0
        public void CreateAndDropPhysicalCube()
        {
            PrimitiveBaseShape newcube  = PrimitiveBaseShape.CreateBox();
            Vector3            position = new Vector3(((float)Constants.RegionSize * 0.5f), ((float)Constants.RegionSize * 0.5f), 128f);
            Vector3            size     = new Vector3(0.5f, 0.5f, 0.5f);
            Quaternion         rot      = Quaternion.Identity;
            PhysicsActor       prim     = ps.AddPrimShape("CoolShape", newcube, position, size, rot, true);
            OdePrim            oprim    = (OdePrim)prim;
            OdeScene           pscene   = (OdeScene)ps;

            Assert.That(oprim.m_taintadd);

            prim.LocalID = 5;

            for (int i = 0; i < 58; i++)
            {
                ps.Simulate(0.133f);

                Assert.That(oprim.prim_geom != (IntPtr)0);

                Assert.That(oprim.m_targetSpace != (IntPtr)0);

                //Assert.That(oprim.m_targetSpace == pscene.space);
                m_log.Info("TargetSpace: " + oprim.m_targetSpace + " - SceneMainSpace: " + pscene.space);

                Assert.That(!oprim.m_taintadd);
                m_log.Info("Prim Position (" + oprim.m_localID + "): " + prim.Position.ToString());

                // Make sure we're above the ground
                //Assert.That(prim.Position.Z > 20f);
                //m_log.Info("PrimCollisionScore (" + oprim.m_localID + "): " + oprim.m_collisionscore);

                // Make sure we've got a Body
                Assert.That(oprim.Body != (IntPtr)0);
                //m_log.Info(
            }

            // Make sure we're not somewhere above the ground
            Assert.That(prim.Position.Z < 21.5f);

            ps.RemovePrim(prim);
            Assert.That(oprim.m_taintremove);
            ps.Simulate(0.133f);
            Assert.That(oprim.Body == (IntPtr)0);
        }
        void DoCoverview(Scene scene)
        {
            // We're going to place objects in world
            displayed = slideCount - 1;
            current   = slideCount - 1;
            for (int x = 0; x <= (2 * displayed); x++)
            {
                if (x < displayed)
                {
                    position[x]        = x;
                    updatedPosition[x] = x;
                    offset[x]          = (x - (displayed + 10f)) * spacing;
                }
                if (x == displayed)
                {
                    position[x]        = x;
                    updatedPosition[x] = x;
                    offset[x]          = 0.0f;
                }
                if (x > displayed)
                {
                    offset[x] = (x - (displayed - 10f)) * spacing;
                }
            }

            //Place prims in the region
            for (int x = 0; x <= displayed; x++)
            {
                Vector3          pos = new Vector3(rootPosition + offset[position[x]], yPosition, zPosition);
                SceneObjectGroup sog = new SceneObjectGroup(UUID.Zero, pos, PrimitiveBaseShape.CreateBox());
                if (x == displayed)
                {
                    sog.UpdateGroupRotationR(new Quaternion(0, 0, 1, 1));
                }
                sog.RootPart.Scale = size;
                prims.Add(sog);
            }

            // Now make them visible
            foreach (SceneObjectGroup sogr in prims)
            {
                scene.AddNewSceneObject(sogr, false);
            }
        }
Exemplo n.º 10
0
        public static SceneObjectGroup findAarBox(Scene scene)
        {
            SceneObjectGroup aarBox = null;

            foreach (EntityBase ent in scene.Entities.GetEntities())
            {
                if (ent.Name == AAR.AARBOXNAME)
                {
                    aarBox = (SceneObjectGroup)ent;
                }
            }
            if (aarBox == null)
            {
                aarBox      = new SceneObjectGroup(UUID.Zero, Vector3.Zero, PrimitiveBaseShape.CreateBox());
                aarBox.Name = AAR.AARBOXNAME;
                scene.AddNewSceneObject(aarBox, true);
            }
            return(aarBox);
        }
        //public class FallingPrim
        //{
        //public bool DoneMoving = false;
        //public uint localId;

        public void FallingPrim(OdeScene ps, CollisionPlane Plane, PhysicsVector position, int x, int y, float offsetZ)
        {
            uint localId = Plane.fallingPrims;
            PrimitiveBaseShape newcube = PrimitiveBaseShape.CreateBox();
            OdePrim            oprim   = (OdePrim)ps.AddPrimShape("FallingPrim_" + localId, newcube, position, new PhysicsVector(0.1f, 0.1f, 2f), Quaternion.Identity, true);

            oprim.LocalID            = localId + 100000;
            oprim.OnCollisionUpdate += delegate(EventArgs args)
            {
                if (!oprim.m_taintremove)
                {
                    // CollisionEventUpdate arg = (CollisionEventUpdate)args;
                    //simhinfo 58 58 30
                    // DoneMoving = true;
                    LandingHieghts[x, y] = oprim.Position.Z + offsetZ;
                    fallingPrims--;
                    ps.remCollisionEventReporting(oprim);
                    ps.RemovePrim(oprim);
                }
            };
            oprim.SubscribeEvents(30000);
        }
Exemplo n.º 12
0
        /// <summary>
        /// Construct the building class instance from the given properties.
        /// </summary>
        /// <param name="type" type="BuildingType">type</param>
        /// <param name="plot">The plot of land this building stands on, note it might be bigger than the
        /// actual buildings footprint, for example if it is part of a larger complex, limit the size of
        /// buildings to have a footprint of no more than 100 square meters.</param>
        /// <param name="flags"></param>
        /// <param name="owner">The owner of the building either a user, or company (group of companies) own buildings.</param>
        /// <param name="seed"></param>
        /// <param name="height">The height in floors of the building, not each floor is approximately 3 meters in size
        /// and thus buildings are limited to a maximum height of 100 floors.</param>
        public CityBuilding(BuildingType type, BuildingPlot plot, BuildingFlags flags,
                            UUID owner, IScene scene, string name) : base(owner, new Vector3(plot.xpos, 21, plot.ypos),
                                                                          Quaternion.Identity, PrimitiveBaseShape.CreateBox(), name, scene)
        {
            //  Start the process of constructing a building given the parameters specified. For
            // truly random buildings change the following value (6) too another number, this is
            // used to allow for the buildings to be fairly fixed during research and development.
            buildingSeed  = 6; // TODO FIX ACCESS TO THE CityModule.randomValue(n) code.
            buildingType  = type;
            buildingPlot  = plot;
            buildingFlags = flags;
            //  Has a valid owner been specified, if not use the default library owner (i think) of the zero uuid.
            if (!owner.Equals(UUID.Zero))
            {
                buildingOwner = owner;
            }
            else
            {
                buildingOwner = UUID.Zero;
            }

            //  Generate a unique value for this building and it's own group if it's part of a complex,
            // otherwise use the zero uuid for group (perhaps it should inherit from the city?)
            buildingUUID = UUID.Random();
            buildingGUID = UUID.Random();

            buildingCenter = new Vector3((plot.xpos + plot.width / 2), 21, (plot.ypos + plot.depth) / 2);
            if (name.Length > 0)
            {
                buildingName = name;
            }
            else
            {
                buildingName = "Building" + type.ToString();
            }
            //  Now that internal variables that are used by other methods have been set construct
            // the building based on the type, plot, flags and seed given in the parameters.
            switch (type)
            {
            case BuildingType.BUILDING_GENERAL:
                OpenSim.Framework.MainConsole.Instance.Output("Building Type GENERAL", log4net.Core.Level.Info);
                createBlocky();
                break;

            case BuildingType.BUILDING_LOCALE:
                /*
                 * switch ( CityModule.randomValue(8) )
                 * {
                 *  case 0:
                 *      OpenSim.Framework.MainConsole.Instance.Output("Locale general.", log4net.Core.Level.Info);
                 *      createSimple();
                 *      break;
                 *  case 1:
                 *      OpenSim.Framework.MainConsole.Instance.Output("locale 1", log4net.Core.Level.Info);
                 *      createBlocky();
                 *      break;
                 * }
                 */
                break;

            case BuildingType.BUILDING_CIVIL:
                createTower();
                break;

            case BuildingType.BUILDING_MILITARY:
                break;

            case BuildingType.BUILDING_HEALTHCARE:
                break;

            case BuildingType.BUILDING_SPORTS:
                break;

            case BuildingType.BUILDING_ENTERTAINMENT:
                break;

            case BuildingType.BUILDING_EDUCATION:
                break;

            case BuildingType.BUILDING_RELIGIOUS:
                break;

            case BuildingType.BUILDING_MUSEUM:
                break;

            case BuildingType.BUILDING_POWERSTATION:
                break;

            case BuildingType.BUILDING_MINEOILGAS:
                break;

            case BuildingType.BUILDING_ZOOLOGICAL:
                break;

            case BuildingType.BUILDING_CEMETARY:
                break;

            case BuildingType.BUILDING_PRISON:
                break;

            case BuildingType.BUILDING_AGRICULTURAL:
                break;

            case BuildingType.BUILDING_RECREATION:
                break;

            default:
                createSimple();
                break;
            }
        }
Exemplo n.º 13
0
        public Hashtable ProcessAdd(Hashtable request, UUID AgentId, Caps cap)
        {
            Hashtable responsedata = new Hashtable();

            responsedata["int_response_code"]   = 400; //501; //410; //404;
            responsedata["content_type"]        = "text/plain";
            responsedata["keepalive"]           = false;
            responsedata["str_response_string"] = "Request wasn't what was expected";
            ScenePresence avatar;

            if (!m_scene.TryGetScenePresence(AgentId, out avatar))
            {
                return(responsedata);
            }


            OSD r = OSDParser.DeserializeLLSDXml((string)request["requestbody"]);

            if (r.Type != OSDType.Map) // not a proper req
            {
                return(responsedata);
            }

            //UUID session_id = UUID.Zero;
            bool       bypass_raycast          = false;
            uint       everyone_mask           = 0;
            uint       group_mask              = 0;
            uint       next_owner_mask         = 0;
            uint       flags                   = 0;
            UUID       group_id                = UUID.Zero;
            int        hollow                  = 0;
            int        material                = 0;
            int        p_code                  = 0;
            int        path_begin              = 0;
            int        path_curve              = 0;
            int        path_end                = 0;
            int        path_radius_offset      = 0;
            int        path_revolutions        = 0;
            int        path_scale_x            = 0;
            int        path_scale_y            = 0;
            int        path_shear_x            = 0;
            int        path_shear_y            = 0;
            int        path_skew               = 0;
            int        path_taper_x            = 0;
            int        path_taper_y            = 0;
            int        path_twist              = 0;
            int        path_twist_begin        = 0;
            int        profile_begin           = 0;
            int        profile_curve           = 0;
            int        profile_end             = 0;
            Vector3    ray_end                 = Vector3.Zero;
            bool       ray_end_is_intersection = false;
            Vector3    ray_start               = Vector3.Zero;
            UUID       ray_target_id           = UUID.Zero;
            Quaternion rotation                = Quaternion.Identity;
            Vector3    scale                   = Vector3.Zero;
            int        state                   = 0;
            int        lastattach              = 0;

            OSDMap rm = (OSDMap)r;
            OSD    tmpOSD;

            if (rm.TryGetValue("ObjectData", out tmpOSD)) //v2
            {
                if (tmpOSD.Type != OSDType.Map)
                {
                    responsedata["str_response_string"] = "Has ObjectData key, but data not in expected format";
                    return(responsedata);
                }

                OSDMap ObjMap = (OSDMap)tmpOSD;

                bypass_raycast  = ObjMap["BypassRaycast"].AsBoolean();
                everyone_mask   = ReadUIntVal(ObjMap["EveryoneMask"]);
                flags           = ReadUIntVal(ObjMap["Flags"]);
                group_mask      = ReadUIntVal(ObjMap["GroupMask"]);
                material        = ObjMap["Material"].AsInteger();
                next_owner_mask = ReadUIntVal(ObjMap["NextOwnerMask"]);
                p_code          = ObjMap["PCode"].AsInteger();

                if (ObjMap.TryGetValue("Path", out tmpOSD))
                {
                    if (tmpOSD.Type != OSDType.Map)
                    {
                        responsedata["str_response_string"] = "Has Path key, but data not in expected format";
                        return(responsedata);
                    }

                    OSDMap PathMap = (OSDMap)tmpOSD;
                    path_begin         = PathMap["Begin"].AsInteger();
                    path_curve         = PathMap["Curve"].AsInteger();
                    path_end           = PathMap["End"].AsInteger();
                    path_radius_offset = PathMap["RadiusOffset"].AsInteger();
                    path_revolutions   = PathMap["Revolutions"].AsInteger();
                    path_scale_x       = PathMap["ScaleX"].AsInteger();
                    path_scale_y       = PathMap["ScaleY"].AsInteger();
                    path_shear_x       = PathMap["ShearX"].AsInteger();
                    path_shear_y       = PathMap["ShearY"].AsInteger();
                    path_skew          = PathMap["Skew"].AsInteger();
                    path_taper_x       = PathMap["TaperX"].AsInteger();
                    path_taper_y       = PathMap["TaperY"].AsInteger();
                    path_twist         = PathMap["Twist"].AsInteger();
                    path_twist_begin   = PathMap["TwistBegin"].AsInteger();
                }

                if (ObjMap.TryGetValue("Profile", out tmpOSD))
                {
                    if (tmpOSD.Type != OSDType.Map)
                    {
                        responsedata["str_response_string"] = "Has Profile key, but data not in expected format";
                        return(responsedata);
                    }

                    OSDMap ProfileMap = (OSDMap)tmpOSD;

                    profile_begin = ProfileMap["Begin"].AsInteger();
                    profile_curve = ProfileMap["Curve"].AsInteger();
                    profile_end   = ProfileMap["End"].AsInteger();
                    hollow        = ProfileMap["Hollow"].AsInteger();
                }
                ray_end_is_intersection = ObjMap["RayEndIsIntersection"].AsBoolean();

                ray_target_id = ObjMap["RayTargetId"].AsUUID();
                state         = ObjMap["State"].AsInteger();
                lastattach    = ObjMap["LastAttachPoint"].AsInteger();
                try
                {
                    ray_end   = ((OSDArray)ObjMap["RayEnd"]).AsVector3();
                    ray_start = ((OSDArray)ObjMap["RayStart"]).AsVector3();
                    scale     = ((OSDArray)ObjMap["Scale"]).AsVector3();
                    rotation  = ((OSDArray)ObjMap["Rotation"]).AsQuaternion();
                }
                catch (Exception)
                {
                    responsedata["str_response_string"] = "RayEnd, RayStart, Scale or Rotation wasn't in the expected format";
                    return(responsedata);
                }

                if (rm.TryGetValue("AgentData", out tmpOSD))
                {
                    if (tmpOSD.Type != OSDType.Map)
                    {
                        responsedata["str_response_string"] = "Has AgentData key, but data not in expected format";
                        return(responsedata);
                    }

                    OSDMap AgentDataMap = (OSDMap)tmpOSD;

                    //session_id = AgentDataMap["SessionId"].AsUUID();
                    group_id = AgentDataMap["GroupId"].AsUUID();
                }
            }
            else
            { //v1
                bypass_raycast = rm["bypass_raycast"].AsBoolean();

                everyone_mask      = ReadUIntVal(rm["everyone_mask"]);
                flags              = ReadUIntVal(rm["flags"]);
                group_id           = rm["group_id"].AsUUID();
                group_mask         = ReadUIntVal(rm["group_mask"]);
                hollow             = rm["hollow"].AsInteger();
                material           = rm["material"].AsInteger();
                next_owner_mask    = ReadUIntVal(rm["next_owner_mask"]);
                hollow             = rm["hollow"].AsInteger();
                p_code             = rm["p_code"].AsInteger();
                path_begin         = rm["path_begin"].AsInteger();
                path_curve         = rm["path_curve"].AsInteger();
                path_end           = rm["path_end"].AsInteger();
                path_radius_offset = rm["path_radius_offset"].AsInteger();
                path_revolutions   = rm["path_revolutions"].AsInteger();
                path_scale_x       = rm["path_scale_x"].AsInteger();
                path_scale_y       = rm["path_scale_y"].AsInteger();
                path_shear_x       = rm["path_shear_x"].AsInteger();
                path_shear_y       = rm["path_shear_y"].AsInteger();
                path_skew          = rm["path_skew"].AsInteger();
                path_taper_x       = rm["path_taper_x"].AsInteger();
                path_taper_y       = rm["path_taper_y"].AsInteger();
                path_twist         = rm["path_twist"].AsInteger();
                path_twist_begin   = rm["path_twist_begin"].AsInteger();
                profile_begin      = rm["profile_begin"].AsInteger();
                profile_curve      = rm["profile_curve"].AsInteger();
                profile_end        = rm["profile_end"].AsInteger();

                ray_end_is_intersection = rm["ray_end_is_intersection"].AsBoolean();

                ray_target_id = rm["ray_target_id"].AsUUID();


                //session_id = rm["session_id"].AsUUID();
                state      = rm["state"].AsInteger();
                lastattach = rm["last_attach_point"].AsInteger();
                try
                {
                    ray_end   = ((OSDArray)rm["ray_end"]).AsVector3();
                    ray_start = ((OSDArray)rm["ray_start"]).AsVector3();
                    rotation  = ((OSDArray)rm["rotation"]).AsQuaternion();
                    scale     = ((OSDArray)rm["scale"]).AsVector3();
                }
                catch (Exception)
                {
                    responsedata["str_response_string"] = "RayEnd, RayStart, Scale or Rotation wasn't in the expected format";
                    return(responsedata);
                }
            }

            Vector3 pos = m_scene.GetNewRezLocation(ray_start, ray_end, ray_target_id, rotation, (bypass_raycast) ? (byte)1 : (byte)0, (ray_end_is_intersection) ? (byte)1 : (byte)0, true, scale, false);

            PrimitiveBaseShape pbs = PrimitiveBaseShape.CreateBox();

            pbs.PathBegin        = (ushort)path_begin;
            pbs.PathCurve        = (byte)path_curve;
            pbs.PathEnd          = (ushort)path_end;
            pbs.PathRadiusOffset = (sbyte)path_radius_offset;
            pbs.PathRevolutions  = (byte)path_revolutions;
            pbs.PathScaleX       = (byte)path_scale_x;
            pbs.PathScaleY       = (byte)path_scale_y;
            pbs.PathShearX       = (byte)path_shear_x;
            pbs.PathShearY       = (byte)path_shear_y;
            pbs.PathSkew         = (sbyte)path_skew;
            pbs.PathTaperX       = (sbyte)path_taper_x;
            pbs.PathTaperY       = (sbyte)path_taper_y;
            pbs.PathTwist        = (sbyte)path_twist;
            pbs.PathTwistBegin   = (sbyte)path_twist_begin;
            pbs.HollowShape      = (HollowShape)hollow;
            pbs.PCode            = (byte)p_code;
            pbs.ProfileBegin     = (ushort)profile_begin;
            pbs.ProfileCurve     = (byte)profile_curve;
            pbs.ProfileEnd       = (ushort)profile_end;
            pbs.Scale            = scale;
            pbs.State            = (byte)state;
            pbs.LastAttachPoint  = (byte)lastattach;

            SceneObjectGroup obj = null;;

            if (m_scene.Permissions.CanRezObject(1, avatar.UUID, pos))
            {
                // rez ON the ground, not IN the ground
                // pos.Z += 0.25F;

                obj = m_scene.AddNewPrim(avatar.UUID, group_id, pos, rotation, pbs);
            }

            if (obj == null)
            {
                return(responsedata);
            }

            SceneObjectPart rootpart = obj.RootPart;

            rootpart.Shape         = pbs;
            rootpart.Flags        |= (PrimFlags)flags;
            rootpart.EveryoneMask  = everyone_mask;
            rootpart.GroupID       = group_id;
            rootpart.GroupMask     = group_mask;
            rootpart.NextOwnerMask = next_owner_mask;
            rootpart.Material      = (byte)material;

            obj.InvalidateDeepEffectivePerms();

            m_scene.PhysicsScene.AddPhysicsActorTaint(rootpart.PhysActor);

            responsedata["int_response_code"]   = 200; //501; //410; //404;
            responsedata["content_type"]        = "text/plain";
            responsedata["keepalive"]           = false;
            responsedata["str_response_string"] = String.Format("<llsd><map><key>local_id</key>{0}</map></llsd>", ConvertUintToBytes(obj.LocalId));

            return(responsedata);
        }
Exemplo n.º 14
0
        public void ProcessAdd(IOSHttpRequest httpRequest, IOSHttpResponse httpResponse, OSDMap map, UUID avatarID)
        {
            httpResponse.KeepAlive = false;
            if (!m_scene.TryGetScenePresence(avatarID, out ScenePresence sp))
            {
                httpResponse.StatusCode = (int)HttpStatusCode.Gone;
                return;
            }

            //UUID session_id = UUID.Zero;
            bool       bypass_raycast          = false;
            uint       everyone_mask           = 0;
            uint       group_mask              = 0;
            uint       next_owner_mask         = 0;
            uint       flags                   = 0;
            UUID       group_id                = UUID.Zero;
            int        hollow                  = 0;
            int        material                = 0;
            int        p_code                  = 0;
            int        path_begin              = 0;
            int        path_curve              = 0;
            int        path_end                = 0;
            int        path_radius_offset      = 0;
            int        path_revolutions        = 0;
            int        path_scale_x            = 0;
            int        path_scale_y            = 0;
            int        path_shear_x            = 0;
            int        path_shear_y            = 0;
            int        path_skew               = 0;
            int        path_taper_x            = 0;
            int        path_taper_y            = 0;
            int        path_twist              = 0;
            int        path_twist_begin        = 0;
            int        profile_begin           = 0;
            int        profile_curve           = 0;
            int        profile_end             = 0;
            Vector3    ray_end                 = Vector3.Zero;
            bool       ray_end_is_intersection = false;
            Vector3    ray_start               = Vector3.Zero;
            UUID       ray_target_id           = UUID.Zero;
            Quaternion rotation                = Quaternion.Identity;
            Vector3    scale                   = Vector3.Zero;
            int        state                   = 0;
            int        lastattach              = 0;

            OSD tmpOSD;

            if (map.TryGetValue("ObjectData", out tmpOSD)) //v2
            {
                if (tmpOSD.Type != OSDType.Map)
                {
                    httpResponse.StatusCode = (int)HttpStatusCode.BadRequest;
                    return;
                }

                OSDMap ObjMap = (OSDMap)tmpOSD;

                bypass_raycast  = ObjMap["BypassRaycast"].AsBoolean();
                everyone_mask   = ReadUIntVal(ObjMap["EveryoneMask"]);
                flags           = ReadUIntVal(ObjMap["Flags"]);
                group_mask      = ReadUIntVal(ObjMap["GroupMask"]);
                material        = ObjMap["Material"].AsInteger();
                next_owner_mask = ReadUIntVal(ObjMap["NextOwnerMask"]);
                p_code          = ObjMap["PCode"].AsInteger();

                if (ObjMap.TryGetValue("Path", out tmpOSD))
                {
                    if (tmpOSD.Type != OSDType.Map)
                    {
                        httpResponse.StatusCode = (int)HttpStatusCode.BadRequest;
                        return;
                    }

                    OSDMap PathMap = (OSDMap)tmpOSD;
                    path_begin         = PathMap["Begin"].AsInteger();
                    path_curve         = PathMap["Curve"].AsInteger();
                    path_end           = PathMap["End"].AsInteger();
                    path_radius_offset = PathMap["RadiusOffset"].AsInteger();
                    path_revolutions   = PathMap["Revolutions"].AsInteger();
                    path_scale_x       = PathMap["ScaleX"].AsInteger();
                    path_scale_y       = PathMap["ScaleY"].AsInteger();
                    path_shear_x       = PathMap["ShearX"].AsInteger();
                    path_shear_y       = PathMap["ShearY"].AsInteger();
                    path_skew          = PathMap["Skew"].AsInteger();
                    path_taper_x       = PathMap["TaperX"].AsInteger();
                    path_taper_y       = PathMap["TaperY"].AsInteger();
                    path_twist         = PathMap["Twist"].AsInteger();
                    path_twist_begin   = PathMap["TwistBegin"].AsInteger();
                }

                if (ObjMap.TryGetValue("Profile", out tmpOSD))
                {
                    if (tmpOSD.Type != OSDType.Map)
                    {
                        httpResponse.StatusCode = (int)HttpStatusCode.BadRequest;
                        return;
                    }

                    OSDMap ProfileMap = (OSDMap)tmpOSD;

                    profile_begin = ProfileMap["Begin"].AsInteger();
                    profile_curve = ProfileMap["Curve"].AsInteger();
                    profile_end   = ProfileMap["End"].AsInteger();
                    hollow        = ProfileMap["Hollow"].AsInteger();
                }
                ray_end_is_intersection = ObjMap["RayEndIsIntersection"].AsBoolean();

                ray_target_id = ObjMap["RayTargetId"].AsUUID();
                state         = ObjMap["State"].AsInteger();
                lastattach    = ObjMap["LastAttachPoint"].AsInteger();
                try
                {
                    ray_end   = ((OSDArray)ObjMap["RayEnd"]).AsVector3();
                    ray_start = ((OSDArray)ObjMap["RayStart"]).AsVector3();
                    scale     = ((OSDArray)ObjMap["Scale"]).AsVector3();
                    rotation  = ((OSDArray)ObjMap["Rotation"]).AsQuaternion();
                }
                catch (Exception)
                {
                    httpResponse.StatusCode = (int)HttpStatusCode.BadRequest;
                    return;
                }

                if (map.TryGetValue("AgentData", out tmpOSD))
                {
                    if (tmpOSD.Type != OSDType.Map)
                    {
                        httpResponse.StatusCode = (int)HttpStatusCode.BadRequest;
                        return;
                    }

                    OSDMap AgentDataMap = (OSDMap)tmpOSD;

                    //session_id = AgentDataMap["SessionId"].AsUUID();
                    group_id = AgentDataMap["GroupId"].AsUUID();
                }
            }
            else
            { //v1
                bypass_raycast = map["bypass_raycast"].AsBoolean();

                everyone_mask      = ReadUIntVal(map["everyone_mask"]);
                flags              = ReadUIntVal(map["flags"]);
                group_id           = map["group_id"].AsUUID();
                group_mask         = ReadUIntVal(map["group_mask"]);
                hollow             = map["hollow"].AsInteger();
                material           = map["material"].AsInteger();
                next_owner_mask    = ReadUIntVal(map["next_owner_mask"]);
                hollow             = map["hollow"].AsInteger();
                p_code             = map["p_code"].AsInteger();
                path_begin         = map["path_begin"].AsInteger();
                path_curve         = map["path_curve"].AsInteger();
                path_end           = map["path_end"].AsInteger();
                path_radius_offset = map["path_radius_offset"].AsInteger();
                path_revolutions   = map["path_revolutions"].AsInteger();
                path_scale_x       = map["path_scale_x"].AsInteger();
                path_scale_y       = map["path_scale_y"].AsInteger();
                path_shear_x       = map["path_shear_x"].AsInteger();
                path_shear_y       = map["path_shear_y"].AsInteger();
                path_skew          = map["path_skew"].AsInteger();
                path_taper_x       = map["path_taper_x"].AsInteger();
                path_taper_y       = map["path_taper_y"].AsInteger();
                path_twist         = map["path_twist"].AsInteger();
                path_twist_begin   = map["path_twist_begin"].AsInteger();
                profile_begin      = map["profile_begin"].AsInteger();
                profile_curve      = map["profile_curve"].AsInteger();
                profile_end        = map["profile_end"].AsInteger();

                ray_end_is_intersection = map["ray_end_is_intersection"].AsBoolean();

                ray_target_id = map["ray_target_id"].AsUUID();


                //session_id = rm["session_id"].AsUUID();
                state      = map["state"].AsInteger();
                lastattach = map["last_attach_point"].AsInteger();
                try
                {
                    ray_end   = ((OSDArray)map["ray_end"]).AsVector3();
                    ray_start = ((OSDArray)map["ray_start"]).AsVector3();
                    rotation  = ((OSDArray)map["rotation"]).AsQuaternion();
                    scale     = ((OSDArray)map["scale"]).AsVector3();
                }
                catch
                {
                    httpResponse.StatusCode = (int)HttpStatusCode.BadRequest;
                    return;
                }
            }

            Vector3 pos = m_scene.GetNewRezLocation(ray_start, ray_end, ray_target_id, rotation, (bypass_raycast) ? (byte)1 : (byte)0, (ray_end_is_intersection) ? (byte)1 : (byte)0, true, scale, false);

            if (!m_scene.Permissions.CanRezObject(1, avatarID, pos))
            {
                httpResponse.StatusCode = (int)HttpStatusCode.Unauthorized;
                return;
            }

            PrimitiveBaseShape pbs = PrimitiveBaseShape.CreateBox();

            pbs.PathBegin        = (ushort)path_begin;
            pbs.PathCurve        = (byte)path_curve;
            pbs.PathEnd          = (ushort)path_end;
            pbs.PathRadiusOffset = (sbyte)path_radius_offset;
            pbs.PathRevolutions  = (byte)path_revolutions;
            pbs.PathScaleX       = (byte)path_scale_x;
            pbs.PathScaleY       = (byte)path_scale_y;
            pbs.PathShearX       = (byte)path_shear_x;
            pbs.PathShearY       = (byte)path_shear_y;
            pbs.PathSkew         = (sbyte)path_skew;
            pbs.PathTaperX       = (sbyte)path_taper_x;
            pbs.PathTaperY       = (sbyte)path_taper_y;
            pbs.PathTwist        = (sbyte)path_twist;
            pbs.PathTwistBegin   = (sbyte)path_twist_begin;
            pbs.HollowShape      = (HollowShape)hollow;
            pbs.PCode            = (byte)p_code;
            pbs.ProfileBegin     = (ushort)profile_begin;
            pbs.ProfileCurve     = (byte)profile_curve;
            pbs.ProfileEnd       = (ushort)profile_end;
            pbs.Scale            = scale;
            pbs.State            = (byte)state;
            pbs.LastAttachPoint  = (byte)lastattach;

            SceneObjectGroup obj = m_scene.AddNewPrim(avatarID, group_id, pos, rotation, pbs);

            SceneObjectPart rootpart = obj.RootPart;

            rootpart.Shape         = pbs;
            rootpart.Flags        |= (PrimFlags)flags;
            rootpart.EveryoneMask  = everyone_mask;
            rootpart.GroupID       = group_id;
            rootpart.GroupMask     = group_mask;
            rootpart.NextOwnerMask = next_owner_mask;
            rootpart.Material      = (byte)material;

            obj.InvalidateDeepEffectivePerms();

            m_scene.PhysicsScene.AddPhysicsActorTaint(rootpart.PhysActor);

            httpResponse.StatusCode = (int)HttpStatusCode.OK;
            httpResponse.RawBuffer  = Util.UTF8NBGetbytes(String.Format("<llsd><map><key>local_id</key>{0}</map></llsd>", ConvertUintToBytes(obj.LocalId)));
        }
Exemplo n.º 15
0
        /// <summary>
        ///   Parses ad request
        /// </summary>
        /// <param name = "request"></param>
        /// <param name = "AgentId"></param>
        /// <param name = "cap"></param>
        /// <returns></returns>
        public byte[] ProcessAdd(Stream request, OSHttpResponse response, UUID AgentId)
        {
            IScenePresence avatar;

            if (!m_scene.TryGetScenePresence(AgentId, out avatar))
            {
                return(MainServer.NoResponse);
            }

            OSDMap r = (OSDMap)OSDParser.Deserialize(request);
            UploadObjectAssetMessage message = new UploadObjectAssetMessage();

            try
            {
                message.Deserialize(r);
            }
            catch (Exception ex)
            {
                MainConsole.Instance.Error("[UploadObjectAssetModule]: Error deserializing message " + ex);
                message = null;
            }

            if (message == null)
            {
                response.StatusCode = 400; //501; //410; //404;
                return(Encoding.UTF8.GetBytes("<llsd><map><key>error</key><string>Error parsing Object</string></map></llsd>"));
            }

            Vector3    pos     = avatar.AbsolutePosition + (Vector3.UnitX * avatar.Rotation);
            Quaternion rot     = Quaternion.Identity;
            Vector3    rootpos = Vector3.Zero;

            SceneObjectGroup rootGroup = null;

            SceneObjectGroup[] allparts = new SceneObjectGroup[message.Objects.Length];
            for (int i = 0; i < message.Objects.Length; i++)
            {
                UploadObjectAssetMessage.Object obj = message.Objects[i];
                PrimitiveBaseShape pbs = PrimitiveBaseShape.CreateBox();

                if (i == 0)
                {
                    rootpos = obj.Position;
                }


                // Combine the extraparams data into it's ugly blob again....
                //int bytelength = 0;
                //for (int extparams = 0; extparams < obj.ExtraParams.Length; extparams++)
                //{
                //    bytelength += obj.ExtraParams[extparams].ExtraParamData.Length;
                //}
                //byte[] extraparams = new byte[bytelength];
                //int position = 0;


                //for (int extparams = 0; extparams < obj.ExtraParams.Length; extparams++)
                //{
                //    Buffer.BlockCopy(obj.ExtraParams[extparams].ExtraParamData, 0, extraparams, position,
                //                     obj.ExtraParams[extparams].ExtraParamData.Length);
                //
                //    position += obj.ExtraParams[extparams].ExtraParamData.Length;
                // }

                //pbs.ExtraParams = extraparams;
                foreach (UploadObjectAssetMessage.Object.ExtraParam extraParam in obj.ExtraParams)
                {
                    switch ((ushort)extraParam.Type)
                    {
                    case (ushort)ExtraParamType.Sculpt:
                        Primitive.SculptData sculpt = new Primitive.SculptData(extraParam.ExtraParamData, 0);

                        pbs.SculptEntry = true;

                        pbs.SculptTexture = obj.SculptID;
                        pbs.SculptType    = (byte)sculpt.Type;

                        break;

                    case (ushort)ExtraParamType.Flexible:
                        Primitive.FlexibleData flex = new Primitive.FlexibleData(extraParam.ExtraParamData, 0);
                        pbs.FlexiEntry    = true;
                        pbs.FlexiDrag     = flex.Drag;
                        pbs.FlexiForceX   = flex.Force.X;
                        pbs.FlexiForceY   = flex.Force.Y;
                        pbs.FlexiForceZ   = flex.Force.Z;
                        pbs.FlexiGravity  = flex.Gravity;
                        pbs.FlexiSoftness = flex.Softness;
                        pbs.FlexiTension  = flex.Tension;
                        pbs.FlexiWind     = flex.Wind;
                        break;

                    case (ushort)ExtraParamType.Light:
                        Primitive.LightData light = new Primitive.LightData(extraParam.ExtraParamData, 0);
                        pbs.LightColorA    = light.Color.A;
                        pbs.LightColorB    = light.Color.B;
                        pbs.LightColorG    = light.Color.G;
                        pbs.LightColorR    = light.Color.R;
                        pbs.LightCutoff    = light.Cutoff;
                        pbs.LightEntry     = true;
                        pbs.LightFalloff   = light.Falloff;
                        pbs.LightIntensity = light.Intensity;
                        pbs.LightRadius    = light.Radius;
                        break;

                    case 0x40:
                        pbs.ReadProjectionData(extraParam.ExtraParamData, 0);
                        break;
                    }
                }
                pbs.PathBegin        = (ushort)obj.PathBegin;
                pbs.PathCurve        = (byte)obj.PathCurve;
                pbs.PathEnd          = (ushort)obj.PathEnd;
                pbs.PathRadiusOffset = (sbyte)obj.RadiusOffset;
                pbs.PathRevolutions  = (byte)obj.Revolutions;
                pbs.PathScaleX       = (byte)obj.ScaleX;
                pbs.PathScaleY       = (byte)obj.ScaleY;
                pbs.PathShearX       = (byte)obj.ShearX;
                pbs.PathShearY       = (byte)obj.ShearY;
                pbs.PathSkew         = (sbyte)obj.Skew;
                pbs.PathTaperX       = (sbyte)obj.TaperX;
                pbs.PathTaperY       = (sbyte)obj.TaperY;
                pbs.PathTwist        = (sbyte)obj.Twist;
                pbs.PathTwistBegin   = (sbyte)obj.TwistBegin;
                pbs.HollowShape      = (HollowShape)obj.ProfileHollow;
                pbs.PCode            = (byte)PCode.Prim;
                pbs.ProfileBegin     = (ushort)obj.ProfileBegin;
                pbs.ProfileCurve     = (byte)obj.ProfileCurve;
                pbs.ProfileEnd       = (ushort)obj.ProfileEnd;
                pbs.Scale            = obj.Scale;
                pbs.State            = 0;
                SceneObjectPart prim = new SceneObjectPart(AgentId, pbs, obj.Position, obj.Rotation,
                                                           Vector3.Zero, obj.Name, m_scene)
                {
                    UUID      = UUID.Random(),
                    CreatorID = AgentId,
                    OwnerID   = AgentId,
                    GroupID   = obj.GroupID
                };
                prim.LastOwnerID  = prim.OwnerID;
                prim.CreationDate = Util.UnixTimeSinceEpoch();
                prim.Name         = obj.Name;
                prim.Description  = "";

                prim.PayPrice[0] = -2;
                prim.PayPrice[1] = -2;
                prim.PayPrice[2] = -2;
                prim.PayPrice[3] = -2;
                prim.PayPrice[4] = -2;
                Primitive.TextureEntry tmp =
                    new Primitive.TextureEntry(UUID.Parse("89556747-24cb-43ed-920b-47caed15465f"));

                for (int j = 0; j < obj.Faces.Length; j++)
                {
                    UploadObjectAssetMessage.Object.Face face = obj.Faces[j];

                    Primitive.TextureEntryFace primFace = tmp.CreateFace((uint)j);

                    primFace.Bump       = face.Bump;
                    primFace.RGBA       = face.Color;
                    primFace.Fullbright = face.Fullbright;
                    primFace.Glow       = face.Glow;
                    primFace.TextureID  = face.ImageID;
                    primFace.Rotation   = face.ImageRot;
                    primFace.MediaFlags = ((face.MediaFlags & 1) != 0);

                    primFace.OffsetU    = face.OffsetS;
                    primFace.OffsetV    = face.OffsetT;
                    primFace.RepeatU    = face.ScaleS;
                    primFace.RepeatV    = face.ScaleT;
                    primFace.TexMapType = (MappingType)(face.MediaFlags & 6);
                }
                pbs.TextureEntry = tmp.GetBytes();
                prim.Shape       = pbs;
                prim.Scale       = obj.Scale;

                SceneObjectGroup grp = new SceneObjectGroup(prim, m_scene);

                prim.ParentID = 0;
                if (i == 0)
                {
                    rootGroup = grp;
                }

                grp.AbsolutePosition = obj.Position;
                prim.RotationOffset  = obj.Rotation;

                grp.RootPart.IsAttachment = false;

                string reason;
                if (m_scene.Permissions.CanRezObject(1, avatar.UUID, pos, out reason))
                {
                    m_scene.SceneGraph.AddPrimToScene(grp);
                    grp.AbsolutePosition = obj.Position;
                }
                else
                {
                    //Stop now then
                    avatar.ControllingClient.SendAlertMessage("You do not have permission to rez objects here: " +
                                                              reason);
                    return(MainServer.NoResponse);
                }
                allparts[i] = grp;
            }

            for (int j = 1; j < allparts.Length; j++)
            {
                rootGroup.LinkToGroup(allparts[j]);
            }

            rootGroup.ScheduleGroupUpdate(PrimUpdateFlags.ForcedFullUpdate);
            pos = m_scene.SceneGraph.GetNewRezLocation(Vector3.Zero, rootpos, UUID.Zero, rot, 1, 1, true,
                                                       allparts[0].GroupScale(), false);

            OSDMap map = new OSDMap();

            map["local_id"] = allparts[0].LocalId;
            return(OSDParser.SerializeLLSDXmlBytes(map));
        }
        /// <summary>
        /// Parses add request
        /// </summary>
        /// <param name="request"></param>
        /// <param name="agentID"></param>
        /// <param name="cap"></param>
        /// <returns></returns>
        public void ProcessAdd(IOSHttpRequest httpRequest, IOSHttpResponse httpResponse, OSDMap map, UUID agentID, Caps cap)
        {
            httpResponse.KeepAlive = false;

            if (!m_scene.TryGetScenePresence(agentID, out ScenePresence avatar))
            {
                httpResponse.StatusCode = (int)HttpStatusCode.Gone;
                return;
            }

            UploadObjectAssetMessage message = new UploadObjectAssetMessage();

            try
            {
                message.Deserialize(map);
            }
            catch (Exception ex)
            {
                m_log.Error("[UPLOAD OBJECT ASSET MODULE]: Error deserializing message " + ex.ToString());
                message = null;
            }

            if (message == null)
            {
                httpResponse.StatusCode = (int)HttpStatusCode.BadRequest;
                return;
            }

            try
            {
                Vector3    pos     = avatar.AbsolutePosition + (Vector3.UnitX * avatar.Rotation);
                Quaternion rot     = Quaternion.Identity;
                Vector3    rootpos = Vector3.Zero;

                SceneObjectGroup   rootGroup = null;
                SceneObjectGroup[] allparts  = new SceneObjectGroup[message.Objects.Length];
                for (int i = 0; i < message.Objects.Length; i++)
                {
                    UploadObjectAssetMessage.Object obj = message.Objects[i];
                    PrimitiveBaseShape pbs = PrimitiveBaseShape.CreateBox();

                    if (i == 0)
                    {
                        rootpos = obj.Position;
                    }

                    for (int extparams = 0; extparams < obj.ExtraParams.Length; extparams++)
                    {
                        UploadObjectAssetMessage.Object.ExtraParam extraParam = obj.ExtraParams[extparams];
                        switch ((ushort)extraParam.Type)
                        {
                        case (ushort)ExtraParamType.Sculpt:
                            Primitive.SculptData sculpt = new Primitive.SculptData(extraParam.ExtraParamData, 0);

                            pbs.SculptEntry = true;

                            pbs.SculptTexture = obj.SculptID;
                            pbs.SculptType    = (byte)sculpt.Type;

                            break;

                        case (ushort)ExtraParamType.Flexible:
                            Primitive.FlexibleData flex = new Primitive.FlexibleData(extraParam.ExtraParamData, 0);
                            pbs.FlexiEntry    = true;
                            pbs.FlexiDrag     = flex.Drag;
                            pbs.FlexiForceX   = flex.Force.X;
                            pbs.FlexiForceY   = flex.Force.Y;
                            pbs.FlexiForceZ   = flex.Force.Z;
                            pbs.FlexiGravity  = flex.Gravity;
                            pbs.FlexiSoftness = flex.Softness;
                            pbs.FlexiTension  = flex.Tension;
                            pbs.FlexiWind     = flex.Wind;
                            break;

                        case (ushort)ExtraParamType.Light:
                            Primitive.LightData light = new Primitive.LightData(extraParam.ExtraParamData, 0);
                            pbs.LightColorA    = light.Color.A;
                            pbs.LightColorB    = light.Color.B;
                            pbs.LightColorG    = light.Color.G;
                            pbs.LightColorR    = light.Color.R;
                            pbs.LightCutoff    = light.Cutoff;
                            pbs.LightEntry     = true;
                            pbs.LightFalloff   = light.Falloff;
                            pbs.LightIntensity = light.Intensity;
                            pbs.LightRadius    = light.Radius;
                            break;

                        case 0x40:
                            pbs.ReadProjectionData(extraParam.ExtraParamData, 0);
                            break;
                        }
                    }

                    pbs.PathBegin        = (ushort)obj.PathBegin;
                    pbs.PathCurve        = (byte)obj.PathCurve;
                    pbs.PathEnd          = (ushort)obj.PathEnd;
                    pbs.PathRadiusOffset = (sbyte)obj.RadiusOffset;
                    pbs.PathRevolutions  = (byte)obj.Revolutions;
                    pbs.PathScaleX       = (byte)obj.ScaleX;
                    pbs.PathScaleY       = (byte)obj.ScaleY;
                    pbs.PathShearX       = (byte)obj.ShearX;
                    pbs.PathShearY       = (byte)obj.ShearY;
                    pbs.PathSkew         = (sbyte)obj.Skew;
                    pbs.PathTaperX       = (sbyte)obj.TaperX;
                    pbs.PathTaperY       = (sbyte)obj.TaperY;
                    pbs.PathTwist        = (sbyte)obj.Twist;
                    pbs.PathTwistBegin   = (sbyte)obj.TwistBegin;
                    pbs.HollowShape      = (HollowShape)obj.ProfileHollow;
                    pbs.PCode            = (byte)PCode.Prim;
                    pbs.ProfileBegin     = (ushort)obj.ProfileBegin;
                    pbs.ProfileCurve     = (byte)obj.ProfileCurve;
                    pbs.ProfileEnd       = (ushort)obj.ProfileEnd;
                    pbs.Scale            = obj.Scale;
                    pbs.State            = (byte)0;
                    pbs.LastAttachPoint  = (byte)0;
                    SceneObjectPart prim = new SceneObjectPart();
                    prim.UUID         = UUID.Random();
                    prim.CreatorID    = agentID;
                    prim.OwnerID      = agentID;
                    prim.GroupID      = obj.GroupID;
                    prim.LastOwnerID  = prim.OwnerID;
                    prim.RezzerID     = agentID;
                    prim.CreationDate = Util.UnixTimeSinceEpoch();
                    prim.Name         = obj.Name;
                    prim.Description  = "";

                    prim.PayPrice[0] = -2;
                    prim.PayPrice[1] = -2;
                    prim.PayPrice[2] = -2;
                    prim.PayPrice[3] = -2;
                    prim.PayPrice[4] = -2;
                    Primitive.TextureEntry tmp =
                        new Primitive.TextureEntry(UUID.Parse("89556747-24cb-43ed-920b-47caed15465f"));

                    for (int j = 0; j < obj.Faces.Length; j++)
                    {
                        UploadObjectAssetMessage.Object.Face face     = obj.Faces[j];
                        Primitive.TextureEntryFace           primFace = tmp.CreateFace((uint)j);

                        primFace.Bump       = face.Bump;
                        primFace.RGBA       = face.Color;
                        primFace.Fullbright = face.Fullbright;
                        primFace.Glow       = face.Glow;
                        primFace.TextureID  = face.ImageID;
                        primFace.Rotation   = face.ImageRot;
                        primFace.MediaFlags = ((face.MediaFlags & 1) != 0);

                        primFace.OffsetU    = face.OffsetS;
                        primFace.OffsetV    = face.OffsetT;
                        primFace.RepeatU    = face.ScaleS;
                        primFace.RepeatV    = face.ScaleT;
                        primFace.TexMapType = (MappingType)(face.MediaFlags & 6);
                    }

                    pbs.TextureEntry = tmp.GetBytes();
                    prim.Shape       = pbs;
                    prim.Scale       = obj.Scale;

                    SceneObjectGroup grp = new SceneObjectGroup();

                    grp.SetRootPart(prim);
                    prim.ParentID = 0;
                    if (i == 0)
                    {
                        rootGroup = grp;
                    }

                    grp.AttachToScene(m_scene);
                    grp.AbsolutePosition = obj.Position;
                    prim.RotationOffset  = obj.Rotation;

                    // Required for linking
                    grp.RootPart.ClearUpdateSchedule();

                    if (m_scene.Permissions.CanRezObject(1, avatar.UUID, pos))
                    {
                        m_scene.AddSceneObject(grp);
                        grp.AbsolutePosition = obj.Position;
                    }

                    allparts[i] = grp;
                }

                for (int j = 1; j < allparts.Length; j++)
                {
                    // Required for linking
                    rootGroup.RootPart.ClearUpdateSchedule();
                    allparts[j].RootPart.ClearUpdateSchedule();
                    rootGroup.LinkToGroup(allparts[j]);
                }

                rootGroup.ScheduleGroupForFullAnimUpdate();

                httpResponse.StatusCode = (int)HttpStatusCode.OK;
                httpResponse.RawBuffer  = Util.UTF8NBGetbytes(String.Format("<llsd><map><key>local_id</key>{0}</map></llsd>", ConvertUintToBytes(allparts[0].LocalId)));
            }
            catch { }

            httpResponse.StatusCode = (int)HttpStatusCode.BadRequest;
        }
Exemplo n.º 17
0
        public byte[] ProcessAdd(Stream request, UUID AgentId)
        {
            IScenePresence avatar;

            if (!m_scene.TryGetScenePresence(AgentId, out avatar))
            {
                return(MainServer.BadRequest);
            }


            OSD r = OSDParser.DeserializeLLSDXml(HttpServerHandlerHelpers.ReadFully(request));
            //UUID session_id = UUID.Zero;
            bool       bypass_raycast          = false;
            uint       everyone_mask           = 0;
            uint       group_mask              = 0;
            uint       next_owner_mask         = 0;
            uint       flags                   = 0;
            UUID       group_id                = UUID.Zero;
            int        hollow                  = 0;
            int        material                = 0;
            int        p_code                  = 0;
            int        path_begin              = 0;
            int        path_curve              = 0;
            int        path_end                = 0;
            int        path_radius_offset      = 0;
            int        path_revolutions        = 0;
            int        path_scale_x            = 0;
            int        path_scale_y            = 0;
            int        path_shear_x            = 0;
            int        path_shear_y            = 0;
            int        path_skew               = 0;
            int        path_taper_x            = 0;
            int        path_taper_y            = 0;
            int        path_twist              = 0;
            int        path_twist_begin        = 0;
            int        profile_begin           = 0;
            int        profile_curve           = 0;
            int        profile_end             = 0;
            Vector3    ray_end                 = Vector3.Zero;
            bool       ray_end_is_intersection = false;
            Vector3    ray_start               = Vector3.Zero;
            UUID       ray_target_id           = UUID.Zero;
            Quaternion rotation                = Quaternion.Identity;
            Vector3    scale                   = Vector3.Zero;
            int        state                   = 0;

            if (r.Type != OSDType.Map) // not a proper req
            {
                return(MainServer.BadRequest);
            }

            OSDMap rm = (OSDMap)r;

            if (rm.ContainsKey("ObjectData")) //v2
            {
                if (rm["ObjectData"].Type != OSDType.Map)
                {
                    return(Encoding.UTF8.GetBytes("Has ObjectData key, but data not in expected format"));
                }

                OSDMap ObjMap = (OSDMap)rm["ObjectData"];

                bypass_raycast  = ObjMap["BypassRaycast"].AsBoolean();
                everyone_mask   = ObjMap["EveryoneMask"];
                flags           = ObjMap["Flags"];
                group_mask      = ObjMap["GroupMask"];
                material        = ObjMap["Material"].AsInteger();
                next_owner_mask = ObjMap["NextOwnerMask"];
                p_code          = ObjMap["PCode"].AsInteger();

                if (ObjMap.ContainsKey("Path"))
                {
                    if (ObjMap["Path"].Type != OSDType.Map)
                    {
                        return(Encoding.UTF8.GetBytes("Has Path key, but data not in expected format"));
                    }

                    OSDMap PathMap = (OSDMap)ObjMap["Path"];
                    path_begin         = PathMap["Begin"].AsInteger();
                    path_curve         = PathMap["Curve"].AsInteger();
                    path_end           = PathMap["End"].AsInteger();
                    path_radius_offset = PathMap["RadiusOffset"].AsInteger();
                    path_revolutions   = PathMap["Revolutions"].AsInteger();
                    path_scale_x       = PathMap["ScaleX"].AsInteger();
                    path_scale_y       = PathMap["ScaleY"].AsInteger();
                    path_shear_x       = PathMap["ShearX"].AsInteger();
                    path_shear_y       = PathMap["ShearY"].AsInteger();
                    path_skew          = PathMap["Skew"].AsInteger();
                    path_taper_x       = PathMap["TaperX"].AsInteger();
                    path_taper_y       = PathMap["TaperY"].AsInteger();
                    path_twist         = PathMap["Twist"].AsInteger();
                    path_twist_begin   = PathMap["TwistBegin"].AsInteger();
                }

                if (ObjMap.ContainsKey("Profile"))
                {
                    if (ObjMap["Profile"].Type != OSDType.Map)
                    {
                        return(Encoding.UTF8.GetBytes("Has Profile key, but data not in expected format"));
                    }

                    OSDMap ProfileMap = (OSDMap)ObjMap["Profile"];

                    profile_begin = ProfileMap["Begin"].AsInteger();
                    profile_curve = ProfileMap["Curve"].AsInteger();
                    profile_end   = ProfileMap["End"].AsInteger();
                    hollow        = ProfileMap["Hollow"].AsInteger();
                }
                ray_end_is_intersection = ObjMap["RayEndIsIntersection"].AsBoolean();

                ray_target_id = ObjMap["RayTargetId"].AsUUID();
                state         = ObjMap["State"].AsInteger();
                try
                {
                    ray_end   = (ObjMap["RayEnd"]).AsVector3();
                    ray_start = (ObjMap["RayStart"]).AsVector3();
                    scale     = (ObjMap["Scale"]).AsVector3();
                    rotation  = (ObjMap["Rotation"]).AsQuaternion();
                }
                catch (Exception)
                {
                    return(Encoding.UTF8.GetBytes("RayEnd, RayStart, Scale or Rotation wasn't in the expected format"));
                }

                if (rm.ContainsKey("AgentData"))
                {
                    if (rm["AgentData"].Type != OSDType.Map)
                    {
                        return(Encoding.UTF8.GetBytes("Has AgentData key, but data not in expected format"));
                    }

                    OSDMap AgentDataMap = (OSDMap)rm["AgentData"];

                    //session_id = AgentDataMap["SessionId"].AsUUID();
                    group_id = AgentDataMap["GroupId"].AsUUID();
                }
            }
            else
            {
                //v1
                bypass_raycast = rm["bypass_raycast"].AsBoolean();

                everyone_mask      = rm["everyone_mask"];
                flags              = rm["flags"];
                group_id           = rm["group_id"].AsUUID();
                group_mask         = rm["group_mask"];
                hollow             = rm["hollow"].AsInteger();
                material           = rm["material"].AsInteger();
                next_owner_mask    = rm["next_owner_mask"];
                hollow             = rm["hollow"].AsInteger();
                p_code             = rm["p_code"].AsInteger();
                path_begin         = rm["path_begin"].AsInteger();
                path_curve         = rm["path_curve"].AsInteger();
                path_end           = rm["path_end"].AsInteger();
                path_radius_offset = rm["path_radius_offset"].AsInteger();
                path_revolutions   = rm["path_revolutions"].AsInteger();
                path_scale_x       = rm["path_scale_x"].AsInteger();
                path_scale_y       = rm["path_scale_y"].AsInteger();
                path_shear_x       = rm["path_shear_x"].AsInteger();
                path_shear_y       = rm["path_shear_y"].AsInteger();
                path_skew          = rm["path_skew"].AsInteger();
                path_taper_x       = rm["path_taper_x"].AsInteger();
                path_taper_y       = rm["path_taper_y"].AsInteger();
                path_twist         = rm["path_twist"].AsInteger();
                path_twist_begin   = rm["path_twist_begin"].AsInteger();
                profile_begin      = rm["profile_begin"].AsInteger();
                profile_curve      = rm["profile_curve"].AsInteger();
                profile_end        = rm["profile_end"].AsInteger();

                ray_end_is_intersection = rm["ray_end_is_intersection"].AsBoolean();

                ray_target_id = rm["ray_target_id"].AsUUID();


                //session_id = rm["session_id"].AsUUID();
                state = rm["state"].AsInteger();
                try
                {
                    ray_end   = (rm["ray_end"]).AsVector3();
                    ray_start = (rm["ray_start"]).AsVector3();
                    rotation  = (rm["rotation"]).AsQuaternion();
                    scale     = (rm["scale"]).AsVector3();
                }
                catch (Exception)
                {
                    return(Encoding.UTF8.GetBytes("RayEnd, RayStart, Scale or Rotation wasn't in the expected format"));
                }
            }


            Vector3 pos = m_scene.SceneGraph.GetNewRezLocation(ray_start, ray_end, ray_target_id, rotation,
                                                               (bypass_raycast) ? (byte)1 : (byte)0,
                                                               (ray_end_is_intersection) ? (byte)1 : (byte)0, true,
                                                               scale, false);

            PrimitiveBaseShape pbs = PrimitiveBaseShape.CreateBox();

            pbs.PathBegin        = (ushort)path_begin;
            pbs.PathCurve        = (byte)path_curve;
            pbs.PathEnd          = (ushort)path_end;
            pbs.PathRadiusOffset = (sbyte)path_radius_offset;
            pbs.PathRevolutions  = (byte)path_revolutions;
            pbs.PathScaleX       = (byte)path_scale_x;
            pbs.PathScaleY       = (byte)path_scale_y;
            pbs.PathShearX       = (byte)path_shear_x;
            pbs.PathShearY       = (byte)path_shear_y;
            pbs.PathSkew         = (sbyte)path_skew;
            pbs.PathTaperX       = (sbyte)path_taper_x;
            pbs.PathTaperY       = (sbyte)path_taper_y;
            pbs.PathTwist        = (sbyte)path_twist;
            pbs.PathTwistBegin   = (sbyte)path_twist_begin;
            pbs.HollowShape      = (HollowShape)hollow;
            pbs.PCode            = (byte)p_code;
            pbs.ProfileBegin     = (ushort)profile_begin;
            pbs.ProfileCurve     = (byte)profile_curve;
            pbs.ProfileEnd       = (ushort)profile_end;
            pbs.Scale            = scale;
            pbs.State            = (byte)state;

            ISceneEntity obj = null;

            string reason;

            if (m_scene.Permissions.CanRezObject(1, avatar.UUID, pos, out reason))
            {
                // rez ON the ground, not IN the ground
                // pos.Z += 0.25F;

                obj = m_scene.SceneGraph.AddNewPrim(avatar.UUID, group_id, pos, rotation, pbs);
            }
            else
            {
                avatar.ControllingClient.SendAlertMessage("You do not have permission to rez objects here: " + reason);
            }


            if (obj == null)
            {
                return(MainServer.BadRequest);
            }

            ISceneChildEntity rootpart = obj.RootChild;

            rootpart.Shape         = pbs;
            rootpart.Flags        |= (PrimFlags)flags;
            rootpart.EveryoneMask  = everyone_mask;
            rootpart.GroupID       = group_id;
            rootpart.GroupMask     = group_mask;
            rootpart.NextOwnerMask = next_owner_mask;
            rootpart.UpdateMaterial(material);

            OSDMap map = new OSDMap();

            map["local_id"] = obj.LocalId;
            return(OSDParser.SerializeLLSDXmlBytes(map));
        }
Exemplo n.º 18
0
        /// <summary>
        /// Convert raw uploaded data into the appropriate asset and item.
        /// </summary>
        /// <param name="assetID"></param>
        /// <param name="inventoryItem"></param>
        /// <param name="data"></param>
        public void UploadCompleteHandler(string assetName, string assetDescription, UUID assetID,
                                          UUID inventoryItem, UUID parentFolder, byte[] data, string inventoryType,
                                          string assetType)
        {
            m_log.DebugFormat(
                "[BUNCH OF CAPS]: Uploaded asset {0} for inventory item {1}, inv type {2}, asset type {3}",
                assetID, inventoryItem, inventoryType, assetType);

            sbyte assType = 0;
            sbyte inType  = 0;

            if (inventoryType == "sound")
            {
                inType  = 1;
                assType = 1;
            }
            else if (inventoryType == "animation")
            {
                inType  = 19;
                assType = 20;
            }
            else if (inventoryType == "wearable")
            {
                inType = 18;
                switch (assetType)
                {
                case "bodypart":
                    assType = 13;
                    break;

                case "clothing":
                    assType = 5;
                    break;
                }
            }
            else if (inventoryType == "object")
            {
                inType  = (sbyte)InventoryType.Object;
                assType = (sbyte)AssetType.Object;

                List <Vector3>    positions     = new List <Vector3>();
                List <Quaternion> rotations     = new List <Quaternion>();
                OSDMap            request       = (OSDMap)OSDParser.DeserializeLLSDXml(data);
                OSDArray          instance_list = (OSDArray)request["instance_list"];
                OSDArray          mesh_list     = (OSDArray)request["mesh_list"];
                OSDArray          texture_list  = (OSDArray)request["texture_list"];
                SceneObjectGroup  grp           = null;

                List <UUID> textures = new List <UUID>();
                for (int i = 0; i < texture_list.Count; i++)
                {
                    AssetBase textureAsset = new AssetBase(UUID.Random(), assetName, (sbyte)AssetType.Texture, "");
                    textureAsset.Data = texture_list[i].AsBinary();
                    m_assetService.Store(textureAsset);
                    textures.Add(textureAsset.FullID);
                }

                for (int i = 0; i < mesh_list.Count; i++)
                {
                    PrimitiveBaseShape pbs = PrimitiveBaseShape.CreateBox();

                    Primitive.TextureEntry textureEntry
                        = new Primitive.TextureEntry(Primitive.TextureEntry.WHITE_TEXTURE);
                    OSDMap inner_instance_list = (OSDMap)instance_list[i];

                    OSDArray face_list = (OSDArray)inner_instance_list["face_list"];
                    for (uint face = 0; face < face_list.Count; face++)
                    {
                        OSDMap faceMap = (OSDMap)face_list[(int)face];
                        Primitive.TextureEntryFace f = pbs.Textures.CreateFace(face);
                        if (faceMap.ContainsKey("fullbright"))
                        {
                            f.Fullbright = faceMap["fullbright"].AsBoolean();
                        }
                        if (faceMap.ContainsKey("diffuse_color"))
                        {
                            f.RGBA = faceMap["diffuse_color"].AsColor4();
                        }

                        int   textureNum = faceMap["image"].AsInteger();
                        float imagerot   = faceMap["imagerot"].AsInteger();
                        float offsets    = (float)faceMap["offsets"].AsReal();
                        float offsett    = (float)faceMap["offsett"].AsReal();
                        float scales     = (float)faceMap["scales"].AsReal();
                        float scalet     = (float)faceMap["scalet"].AsReal();

                        if (imagerot != 0)
                        {
                            f.Rotation = imagerot;
                        }

                        if (offsets != 0)
                        {
                            f.OffsetU = offsets;
                        }

                        if (offsett != 0)
                        {
                            f.OffsetV = offsett;
                        }

                        if (scales != 0)
                        {
                            f.RepeatU = scales;
                        }

                        if (scalet != 0)
                        {
                            f.RepeatV = scalet;
                        }

                        if (textures.Count > textureNum)
                        {
                            f.TextureID = textures[textureNum];
                        }
                        else
                        {
                            f.TextureID = Primitive.TextureEntry.WHITE_TEXTURE;
                        }

                        textureEntry.FaceTextures[face] = f;
                    }

                    pbs.TextureEntry = textureEntry.GetBytes();

                    AssetBase meshAsset = new AssetBase(UUID.Random(), assetName, (sbyte)AssetType.Mesh, "");
                    meshAsset.Data = mesh_list[i].AsBinary();
                    m_assetService.Store(meshAsset);

                    pbs.SculptEntry   = true;
                    pbs.SculptTexture = meshAsset.FullID;
                    pbs.SculptType    = (byte)SculptType.Mesh;
                    pbs.SculptData    = meshAsset.Data;

                    Vector3    position = inner_instance_list["position"].AsVector3();
                    Vector3    scale    = inner_instance_list["scale"].AsVector3();
                    Quaternion rotation = inner_instance_list["rotation"].AsQuaternion();

// no longer used - begin ------------------------
//                    int physicsShapeType = inner_instance_list["physics_shape_type"].AsInteger();
//                    int material = inner_instance_list["material"].AsInteger();
//                    int mesh = inner_instance_list["mesh"].AsInteger();

//                    OSDMap permissions = (OSDMap)inner_instance_list["permissions"];
//                    int base_mask = permissions["base_mask"].AsInteger();
//                    int everyone_mask = permissions["everyone_mask"].AsInteger();
//                    UUID creator_id = permissions["creator_id"].AsUUID();
//                    UUID group_id = permissions["group_id"].AsUUID();
//                    int group_mask = permissions["group_mask"].AsInteger();
//                    bool is_owner_group = permissions["is_owner_group"].AsBoolean();
//                    UUID last_owner_id = permissions["last_owner_id"].AsUUID();
//                    int next_owner_mask = permissions["next_owner_mask"].AsInteger();
//                    UUID owner_id = permissions["owner_id"].AsUUID();
//                    int owner_mask = permissions["owner_mask"].AsInteger();
// no longer used - end ------------------------

                    UUID owner_id = m_HostCapsObj.AgentID;

                    SceneObjectPart prim
                        = new SceneObjectPart(owner_id, pbs, position, Quaternion.Identity, Vector3.Zero);

                    prim.Scale          = scale;
                    prim.OffsetPosition = position;
                    rotations.Add(rotation);
                    positions.Add(position);
                    prim.UUID         = UUID.Random();
                    prim.CreatorID    = owner_id;
                    prim.OwnerID      = owner_id;
                    prim.GroupID      = UUID.Zero;
                    prim.LastOwnerID  = prim.OwnerID;
                    prim.CreationDate = Util.UnixTimeSinceEpoch();
                    prim.Name         = assetName;
                    prim.Description  = "";

//                    prim.BaseMask = (uint)base_mask;
//                    prim.EveryoneMask = (uint)everyone_mask;
//                    prim.GroupMask = (uint)group_mask;
//                    prim.NextOwnerMask = (uint)next_owner_mask;
//                    prim.OwnerMask = (uint)owner_mask;

                    if (grp == null)
                    {
                        grp = new SceneObjectGroup(prim);
                    }
                    else
                    {
                        grp.AddPart(prim);
                    }
                }

                // Fix first link number
                if (grp.Parts.Length > 1)
                {
                    grp.RootPart.LinkNum++;
                }

                Vector3 rootPos = positions[0];
                grp.AbsolutePosition = rootPos;
                for (int i = 0; i < positions.Count; i++)
                {
                    Vector3 offset = positions[i] - rootPos;
                    grp.Parts[i].OffsetPosition = offset;
                }

                for (int i = 0; i < rotations.Count; i++)
                {
                    if (i != 0)
                    {
                        grp.Parts[i].RotationOffset = rotations[i];
                    }
                }

                grp.UpdateGroupRotationR(rotations[0]);
                data = ASCIIEncoding.ASCII.GetBytes(SceneObjectSerializer.ToOriginalXmlFormat(grp));
            }

            AssetBase asset;

            asset      = new AssetBase(assetID, assetName, assType, m_HostCapsObj.AgentID.ToString());
            asset.Data = data;
            if (AddNewAsset != null)
            {
                AddNewAsset(asset);
            }
            else if (m_assetService != null)
            {
                m_assetService.Store(asset);
            }

            InventoryItemBase item = new InventoryItemBase();

            item.Owner       = m_HostCapsObj.AgentID;
            item.CreatorId   = m_HostCapsObj.AgentID.ToString();
            item.CreatorData = String.Empty;
            item.ID          = inventoryItem;
            item.AssetID     = asset.FullID;
            item.Description = assetDescription;
            item.Name        = assetName;
            item.AssetType   = assType;
            item.InvType     = inType;
            item.Folder      = parentFolder;

            // If we set PermissionMask.All then when we rez the item the next permissions will replace the current
            // (owner) permissions.  This becomes a problem if next permissions are changed.
            item.CurrentPermissions
                = (uint)(PermissionMask.Move | PermissionMask.Copy | PermissionMask.Modify | PermissionMask.Transfer);

            item.BasePermissions     = (uint)PermissionMask.All;
            item.EveryOnePermissions = 0;
            item.NextPermissions     = (uint)PermissionMask.All;
            item.CreationDate        = Util.UnixTimeSinceEpoch();

            if (AddNewInventoryItem != null)
            {
                AddNewInventoryItem(m_HostCapsObj.AgentID, item);
            }
        }
Exemplo n.º 19
0
        ///<summary>
        ///</summary>
        ///<param name = "assetID"></param>
        ///<param name = "inventoryItem"></param>
        ///<param name = "data"></param>
        public UUID UploadCompleteHandler(string assetName, string assetDescription, UUID assetID,
                                          UUID inventoryItem, UUID parentFolder, byte[] data, string inventoryType,
                                          string assetType, uint everyone_mask, uint group_mask, uint next_owner_mask)
        {
            sbyte assType = 0;
            sbyte inType  = 0;

            if (inventoryType == "sound")
            {
                inType  = 1;
                assType = 1;
            }
            else if (inventoryType == "animation")
            {
                inType  = 19;
                assType = 20;
            }
            else if (inventoryType == "snapshot")
            {
                inType  = 15;
                assType = 0;
            }
            else if (inventoryType == "wearable")
            {
                inType = 18;
                switch (assetType)
                {
                case "bodypart":
                    assType = 13;
                    break;

                case "clothing":
                    assType = 5;
                    break;
                }
            }
            else if (inventoryType == "object")
            {
                inType  = (sbyte)InventoryType.Object;
                assType = (sbyte)AssetType.Object;

                List <Vector3>    positions     = new List <Vector3>();
                List <Quaternion> rotations     = new List <Quaternion>();
                OSDMap            request       = (OSDMap)OSDParser.DeserializeLLSDXml(data);
                OSDArray          instance_list = (OSDArray)request["instance_list"];
                OSDArray          mesh_list     = (OSDArray)request["mesh_list"];
                OSDArray          texture_list  = (OSDArray)request["texture_list"];
                SceneObjectGroup  grp           = null;

                List <UUID> textures = new List <UUID>();
#if (!ISWIN)
                for (int i = 0; i < texture_list.Count; i++)
                {
                    AssetBase textureAsset = new AssetBase(UUID.Random(), assetName, AssetType.Texture, m_service.AgentID);
                    textureAsset.Data = texture_list[i].AsBinary();
                    textureAsset.ID   = m_assetService.Store(textureAsset);
                    textures.Add(textureAsset.ID);
                }
#else
                foreach (AssetBase textureAsset in texture_list.Select(t => new AssetBase(UUID.Random(), assetName, AssetType.Texture,
                                                                                          m_service.AgentID)
                {
                    Data = t.AsBinary()
                }))
                {
                    textureAsset.ID = m_assetService.Store(textureAsset);
                    textures.Add(textureAsset.ID);
                }
#endif
                InventoryFolderBase meshFolder = m_inventoryService.GetFolderForType(m_service.AgentID,
                                                                                     InventoryType.Mesh, AssetType.Mesh);
                for (int i = 0; i < mesh_list.Count; i++)
                {
                    PrimitiveBaseShape pbs = PrimitiveBaseShape.CreateBox();

                    Primitive.TextureEntry textureEntry =
                        new Primitive.TextureEntry(Primitive.TextureEntry.WHITE_TEXTURE);
                    OSDMap inner_instance_list = (OSDMap)instance_list[i];

                    OSDArray face_list = (OSDArray)inner_instance_list["face_list"];
                    for (uint face = 0; face < face_list.Count; face++)
                    {
                        OSDMap faceMap = (OSDMap)face_list[(int)face];
                        Primitive.TextureEntryFace f = pbs.Textures.CreateFace(face);
                        if (faceMap.ContainsKey("fullbright"))
                        {
                            f.Fullbright = faceMap["fullbright"].AsBoolean();
                        }
                        if (faceMap.ContainsKey("diffuse_color"))
                        {
                            f.RGBA = faceMap["diffuse_color"].AsColor4();
                        }

                        int   textureNum = faceMap["image"].AsInteger();
                        float imagerot   = faceMap["imagerot"].AsInteger();
                        float offsets    = (float)faceMap["offsets"].AsReal();
                        float offsett    = (float)faceMap["offsett"].AsReal();
                        float scales     = (float)faceMap["scales"].AsReal();
                        float scalet     = (float)faceMap["scalet"].AsReal();

                        if (imagerot != 0)
                        {
                            f.Rotation = imagerot;
                        }
                        if (offsets != 0)
                        {
                            f.OffsetU = offsets;
                        }
                        if (offsett != 0)
                        {
                            f.OffsetV = offsett;
                        }
                        if (scales != 0)
                        {
                            f.RepeatU = scales;
                        }
                        if (scalet != 0)
                        {
                            f.RepeatV = scalet;
                        }
                        f.TextureID = textures.Count > textureNum ? textures[textureNum] : Primitive.TextureEntry.WHITE_TEXTURE;
                        textureEntry.FaceTextures[face] = f;
                    }
                    pbs.TextureEntry = textureEntry.GetBytes();

                    AssetBase meshAsset = new AssetBase(UUID.Random(), assetName, AssetType.Mesh, m_service.AgentID)
                    {
                        Data = mesh_list[i].AsBinary()
                    };
                    meshAsset.ID = m_assetService.Store(meshAsset);

                    if (meshFolder == null)
                    {
                        m_inventoryService.CreateUserInventory(m_service.AgentID, false);
                        meshFolder = m_inventoryService.GetFolderForType(m_service.AgentID, InventoryType.Mesh,
                                                                         AssetType.Mesh);
                    }

                    InventoryItemBase itemBase = new InventoryItemBase(UUID.Random(), m_service.AgentID)
                    {
                        AssetType           = (sbyte)AssetType.Mesh,
                        AssetID             = meshAsset.ID,
                        CreatorId           = m_service.AgentID.ToString(),
                        Folder              = meshFolder.ID,
                        InvType             = (int)InventoryType.Texture,
                        Name                = "(Mesh) - " + assetName,
                        CurrentPermissions  = (uint)PermissionMask.All,
                        BasePermissions     = (uint)PermissionMask.All,
                        EveryOnePermissions = everyone_mask,
                        GroupPermissions    = group_mask,
                        NextPermissions     = next_owner_mask
                    };
                    //Bad... but whatever
                    m_inventoryService.AddItem(itemBase);

                    pbs.SculptEntry   = true;
                    pbs.SculptTexture = meshAsset.ID;
                    pbs.SculptType    = (byte)SculptType.Mesh;
                    pbs.SculptData    = meshAsset.Data;

                    Vector3    position = inner_instance_list["position"].AsVector3();
                    Vector3    scale    = inner_instance_list["scale"].AsVector3();
                    Quaternion rotation = inner_instance_list["rotation"].AsQuaternion();

                    int physicsShapeType = inner_instance_list["physics_shape_type"].AsInteger();
                    int material         = inner_instance_list["material"].AsInteger();
                    int mesh             = inner_instance_list["mesh"].AsInteger();

                    UUID owner_id = m_service.AgentID;

                    IScene fakeScene = new Scene();
                    fakeScene.AddModuleInterfaces(m_service.Registry.GetInterfaces());

                    SceneObjectPart prim = new SceneObjectPart(owner_id, pbs, position, Quaternion.Identity,
                                                               Vector3.Zero, assetName, fakeScene)
                    {
                        Scale = scale, AbsolutePosition = position
                    };

                    rotations.Add(rotation);
                    positions.Add(position);
                    prim.UUID         = UUID.Random();
                    prim.CreatorID    = owner_id;
                    prim.OwnerID      = owner_id;
                    prim.GroupID      = UUID.Zero;
                    prim.LastOwnerID  = prim.OwnerID;
                    prim.CreationDate = Util.UnixTimeSinceEpoch();
                    prim.Name         = assetName;
                    prim.Description  = "";
                    prim.PhysicsType  = (byte)physicsShapeType;

                    prim.BaseMask      = (uint)PermissionMask.All;
                    prim.EveryoneMask  = everyone_mask;
                    prim.NextOwnerMask = next_owner_mask;
                    prim.GroupMask     = group_mask;
                    prim.OwnerMask     = (uint)PermissionMask.All;

                    if (grp == null)
                    {
                        grp = new SceneObjectGroup(prim, fakeScene);
                    }
                    else
                    {
                        grp.AddChild(prim, i + 1);
                    }
                    grp.RootPart.IsAttachment = false;
                }
                if (grp.ChildrenList.Count > 1) //Fix first link #
                {
                    grp.RootPart.LinkNum++;
                }

                Vector3 rootPos = positions[0];
                grp.SetAbsolutePosition(false, rootPos);
                for (int i = 0; i < positions.Count; i++)
                {
                    Vector3 offset = positions[i] - rootPos;
                    grp.ChildrenList[i].SetOffsetPosition(offset);
                    Vector3 abs        = grp.ChildrenList[i].AbsolutePosition;
                    Vector3 currentPos = positions[i];
                }
                //grp.Rotation = rotations[0];
                for (int i = 0; i < rotations.Count; i++)
                {
                    if (i != 0)
                    {
                        grp.ChildrenList[i].SetRotationOffset(false, rotations[i], false);
                    }
                }
                grp.UpdateGroupRotationR(rotations[0]);
                data = Encoding.ASCII.GetBytes(grp.ToXml2());
            }
            AssetBase asset = new AssetBase(assetID, assetName, (AssetType)assType, m_service.AgentID)
            {
                Data = data
            };
            asset.ID = m_assetService.Store(asset);
            assetID  = asset.ID;

            InventoryItemBase item = new InventoryItemBase
            {
                Owner               = m_service.AgentID,
                CreatorId           = m_service.AgentID.ToString(),
                ID                  = inventoryItem,
                AssetID             = asset.ID,
                Description         = assetDescription,
                Name                = assetName,
                AssetType           = assType,
                InvType             = inType,
                Folder              = parentFolder,
                CurrentPermissions  = (uint)PermissionMask.All,
                BasePermissions     = (uint)PermissionMask.All,
                EveryOnePermissions = everyone_mask,
                NextPermissions     = next_owner_mask,
                GroupPermissions    = group_mask,
                CreationDate        = Util.UnixTimeSinceEpoch()
            };

            m_inventoryService.AddItem(item);

            return(assetID);
        }
        /// <summary>
        /// Parses ad request
        /// </summary>
        /// <param name="request"></param>
        /// <param name="AgentId"></param>
        /// <param name="cap"></param>
        /// <returns></returns>
        public Hashtable ProcessAdd(Hashtable request, UUID AgentId, Caps cap)
        {
            Hashtable responsedata = new Hashtable();

            responsedata["int_response_code"]   = 400; //501; //410; //404;
            responsedata["content_type"]        = "text/plain";
            responsedata["keepalive"]           = false;
            responsedata["str_response_string"] = "Request wasn't what was expected";
            ScenePresence avatar;

            if (!m_scene.TryGetScenePresence(AgentId, out avatar))
            {
                return(responsedata);
            }

            OSDMap r = (OSDMap)OSDParser.Deserialize((string)request["requestbody"]);
            UploadObjectAssetMessage message = new UploadObjectAssetMessage();

            try
            {
                message.Deserialize(r);
            }
            catch (Exception ex)
            {
                m_log.Error("[UPLOAD OBJECT ASSET MODULE]: Error deserializing message " + ex.ToString());
                message = null;
            }

            if (message == null)
            {
                responsedata["int_response_code"]   = 400; //501; //410; //404;
                responsedata["content_type"]        = "text/plain";
                responsedata["keepalive"]           = false;
                responsedata["str_response_string"] =
                    "<llsd><map><key>error</key><string>Error parsing Object</string></map></llsd>";

                return(responsedata);
            }

            Vector3    pos     = avatar.AbsolutePosition + (Vector3.UnitX * avatar.Rotation);
            Quaternion rot     = Quaternion.Identity;
            Vector3    rootpos = Vector3.Zero;
//            Quaternion rootrot = Quaternion.Identity;

            SceneObjectGroup rootGroup = null;

            SceneObjectGroup[] allparts = new SceneObjectGroup[message.Objects.Length];
            for (int i = 0; i < message.Objects.Length; i++)
            {
                UploadObjectAssetMessage.Object obj = message.Objects[i];
                PrimitiveBaseShape pbs = PrimitiveBaseShape.CreateBox();

                if (i == 0)
                {
                    rootpos = obj.Position;
//                    rootrot = obj.Rotation;
                }

                // Combine the extraparams data into it's ugly blob again....
                //int bytelength = 0;
                //for (int extparams = 0; extparams < obj.ExtraParams.Length; extparams++)
                //{
                //    bytelength += obj.ExtraParams[extparams].ExtraParamData.Length;
                //}
                //byte[] extraparams = new byte[bytelength];
                //int position = 0;



                //for (int extparams = 0; extparams < obj.ExtraParams.Length; extparams++)
                //{
                //    Buffer.BlockCopy(obj.ExtraParams[extparams].ExtraParamData, 0, extraparams, position,
                //                     obj.ExtraParams[extparams].ExtraParamData.Length);
                //
                //    position += obj.ExtraParams[extparams].ExtraParamData.Length;
                // }

                //pbs.ExtraParams = extraparams;
                for (int extparams = 0; extparams < obj.ExtraParams.Length; extparams++)
                {
                    UploadObjectAssetMessage.Object.ExtraParam extraParam = obj.ExtraParams[extparams];
                    switch ((ushort)extraParam.Type)
                    {
                    case (ushort)ExtraParamType.Sculpt:
                        Primitive.SculptData sculpt = new Primitive.SculptData(extraParam.ExtraParamData, 0);

                        pbs.SculptEntry = true;

                        pbs.SculptTexture = obj.SculptID;
                        pbs.SculptType    = (byte)sculpt.Type;

                        break;

                    case (ushort)ExtraParamType.Flexible:
                        Primitive.FlexibleData flex = new Primitive.FlexibleData(extraParam.ExtraParamData, 0);
                        pbs.FlexiEntry    = true;
                        pbs.FlexiDrag     = flex.Drag;
                        pbs.FlexiForceX   = flex.Force.X;
                        pbs.FlexiForceY   = flex.Force.Y;
                        pbs.FlexiForceZ   = flex.Force.Z;
                        pbs.FlexiGravity  = flex.Gravity;
                        pbs.FlexiSoftness = flex.Softness;
                        pbs.FlexiTension  = flex.Tension;
                        pbs.FlexiWind     = flex.Wind;
                        break;

                    case (ushort)ExtraParamType.Light:
                        Primitive.LightData light = new Primitive.LightData(extraParam.ExtraParamData, 0);
                        pbs.LightColorA    = light.Color.A;
                        pbs.LightColorB    = light.Color.B;
                        pbs.LightColorG    = light.Color.G;
                        pbs.LightColorR    = light.Color.R;
                        pbs.LightCutoff    = light.Cutoff;
                        pbs.LightEntry     = true;
                        pbs.LightFalloff   = light.Falloff;
                        pbs.LightIntensity = light.Intensity;
                        pbs.LightRadius    = light.Radius;
                        break;

                    case 0x40:
                        pbs.ReadProjectionData(extraParam.ExtraParamData, 0);
                        break;
                    }
                }
                pbs.PathBegin        = (ushort)obj.PathBegin;
                pbs.PathCurve        = (byte)obj.PathCurve;
                pbs.PathEnd          = (ushort)obj.PathEnd;
                pbs.PathRadiusOffset = (sbyte)obj.RadiusOffset;
                pbs.PathRevolutions  = (byte)obj.Revolutions;
                pbs.PathScaleX       = (byte)obj.ScaleX;
                pbs.PathScaleY       = (byte)obj.ScaleY;
                pbs.PathShearX       = (byte)obj.ShearX;
                pbs.PathShearY       = (byte)obj.ShearY;
                pbs.PathSkew         = (sbyte)obj.Skew;
                pbs.PathTaperX       = (sbyte)obj.TaperX;
                pbs.PathTaperY       = (sbyte)obj.TaperY;
                pbs.PathTwist        = (sbyte)obj.Twist;
                pbs.PathTwistBegin   = (sbyte)obj.TwistBegin;
                pbs.HollowShape      = (HollowShape)obj.ProfileHollow;
                pbs.PCode            = (byte)PCode.Prim;
                pbs.ProfileBegin     = (ushort)obj.ProfileBegin;
                pbs.ProfileCurve     = (byte)obj.ProfileCurve;
                pbs.ProfileEnd       = (ushort)obj.ProfileEnd;
                pbs.Scale            = obj.Scale;
                pbs.State            = (byte)0;
                SceneObjectPart prim = new SceneObjectPart();
                prim.UUID         = UUID.Random();
                prim.CreatorID    = AgentId;
                prim.OwnerID      = AgentId;
                prim.GroupID      = obj.GroupID;
                prim.LastOwnerID  = prim.OwnerID;
                prim.CreationDate = Util.UnixTimeSinceEpoch();
                prim.Name         = obj.Name;
                prim.Description  = "";

                prim.PayPrice[0] = -2;
                prim.PayPrice[1] = -2;
                prim.PayPrice[2] = -2;
                prim.PayPrice[3] = -2;
                prim.PayPrice[4] = -2;
                Primitive.TextureEntry tmp =
                    new Primitive.TextureEntry(UUID.Parse("89556747-24cb-43ed-920b-47caed15465f"));

                for (int j = 0; j < obj.Faces.Length; j++)
                {
                    UploadObjectAssetMessage.Object.Face face = obj.Faces[j];

                    Primitive.TextureEntryFace primFace = tmp.CreateFace((uint)j);

                    primFace.Bump       = face.Bump;
                    primFace.RGBA       = face.Color;
                    primFace.Fullbright = face.Fullbright;
                    primFace.Glow       = face.Glow;
                    primFace.TextureID  = face.ImageID;
                    primFace.Rotation   = face.ImageRot;
                    primFace.MediaFlags = ((face.MediaFlags & 1) != 0);

                    primFace.OffsetU    = face.OffsetS;
                    primFace.OffsetV    = face.OffsetT;
                    primFace.RepeatU    = face.ScaleS;
                    primFace.RepeatV    = face.ScaleT;
                    primFace.TexMapType = (MappingType)(face.MediaFlags & 6);
                }
                pbs.TextureEntry = tmp.GetBytes();
                prim.Shape       = pbs;
                prim.Scale       = obj.Scale;


                SceneObjectGroup grp = new SceneObjectGroup();

                grp.SetRootPart(prim);
                prim.ParentID = 0;
                if (i == 0)
                {
                    rootGroup = grp;
                }
                grp.AttachToScene(m_scene);
                grp.AbsolutePosition = obj.Position;
                prim.RotationOffset  = obj.Rotation;

                grp.RootPart.IsAttachment = false;
                // Required for linking
                grp.RootPart.UpdateFlag = 0;

                if (m_scene.Permissions.CanRezObject(1, avatar.UUID, pos))
                {
                    m_scene.AddSceneObject(grp);
                    grp.AbsolutePosition = obj.Position;
                }
                allparts[i] = grp;
            }

            for (int j = 1; j < allparts.Length; j++)
            {
                rootGroup.RootPart.UpdateFlag   = 0;
                allparts[j].RootPart.UpdateFlag = 0;
                rootGroup.LinkToGroup(allparts[j]);
            }

            rootGroup.ScheduleGroupForFullUpdate();
            pos = m_scene.GetNewRezLocation(Vector3.Zero, rootpos, UUID.Zero, rot, (byte)1, 1, true, allparts[0].GroupScale(), false);

            responsedata["int_response_code"]   = 200; //501; //410; //404;
            responsedata["content_type"]        = "text/plain";
            responsedata["keepalive"]           = false;
            responsedata["str_response_string"] = String.Format("<llsd><map><key>local_id</key>{0}</map></llsd>", ConvertUintToBytes(allparts[0].LocalId));

            return(responsedata);
        }
        void DoSierpinski(SceneObjectGroup sog, Vector3 scale)
        {
            //replace the original prim with 5 new prims
            Vector3 newsize = new Vector3(scale.X / 2, scale.Y / 2, scale.Z / 2);
            Vector3 offset  = new Vector3(scale.X / 4, scale.Y / 4, scale.Z / 4);
            Vector3 pos     = sog.AbsolutePosition;
            //Move and resize the existing prim to become the new prim#1
            //This is much faster than creating a new one and deleting the old
            Vector3 newpos = new Vector3(pos.X, pos.Y, pos.Z + offset.Z);

            sog.AbsolutePosition = newpos;
            sog.RootPart.Scale   = newsize;
            sog.ScheduleGroupForFullUpdate();
            m_newprims.Add(sog);
            // Add new prim#2
            PrimitiveBaseShape prim2 = PrimitiveBaseShape.CreateBox();

            prim2.Textures = new Primitive.TextureEntry(new UUID("5748decc-f629-461c-9a36-a35a236fe36f"));
            newpos         = new Vector3(pos.X - offset.X, pos.Y - offset.Y, pos.Z - offset.Z);
            SceneObjectGroup newsog2 = new SceneObjectGroup(UUID.Zero, newpos, prim2);

            newsog2.RootPart.Scale = newsize;
            m_newprims.Add(newsog2);                   //add it to our list of managed objects
            m_scene.AddNewSceneObject(newsog2, false); //add it to the scene (not backed up to the db)
            Primitive.TextureEntry tex = newsog2.RootPart.Shape.Textures;
            tex.DefaultTexture.RGBA = RandomColor();
            newsog2.RootPart.UpdateTexture(tex);
            // Add new prim#3
            PrimitiveBaseShape prim3 = PrimitiveBaseShape.CreateBox();

            prim3.Textures = new Primitive.TextureEntry(new UUID("5748decc-f629-461c-9a36-a35a236fe36f"));
            newpos         = new Vector3(pos.X - offset.X, pos.Y + offset.Y, pos.Z - offset.Z);
            SceneObjectGroup newsog3 = new SceneObjectGroup(UUID.Zero, newpos, prim3);

            newsog3.RootPart.Scale = newsize;
            m_newprims.Add(newsog3);                   //add it to our list of managed objects
            m_scene.AddNewSceneObject(newsog3, false); //add it to the scene (not backed up to the db)
            tex = newsog3.RootPart.Shape.Textures;
            tex.DefaultTexture.RGBA = RandomColor();
            newsog3.RootPart.UpdateTexture(tex);
            // Add new prim#4
            PrimitiveBaseShape prim4 = PrimitiveBaseShape.CreateBox();

            prim4.Textures = new Primitive.TextureEntry(new UUID("5748decc-f629-461c-9a36-a35a236fe36f"));
            newpos         = new Vector3(pos.X + offset.X, pos.Y - offset.Y, pos.Z - offset.Z);
            SceneObjectGroup newsog4 = new SceneObjectGroup(UUID.Zero, newpos, prim4);

            newsog4.RootPart.Scale = newsize;
            m_newprims.Add(newsog4);                   //add it to our list of managed objects
            m_scene.AddNewSceneObject(newsog4, false); //add it to the scene (not backed up to the db)
            tex = newsog4.RootPart.Shape.Textures;
            tex.DefaultTexture.RGBA = RandomColor();
            newsog4.RootPart.UpdateTexture(tex);
            // Add new prim#5
            PrimitiveBaseShape prim5 = PrimitiveBaseShape.CreateBox();

            prim5.Textures = new Primitive.TextureEntry(new UUID("5748decc-f629-461c-9a36-a35a236fe36f"));
            newpos         = new Vector3(pos.X + offset.X, pos.Y + offset.Y, pos.Z - offset.Z);
            SceneObjectGroup newsog5 = new SceneObjectGroup(UUID.Zero, newpos, prim5);

            newsog5.RootPart.Scale = newsize;
            m_newprims.Add(newsog5);                   //add it to our list of managed objects
            m_scene.AddNewSceneObject(newsog5, false); //add it to the scene (not backed up to the db)
            tex = newsog5.RootPart.Shape.Textures;
            tex.DefaultTexture.RGBA = RandomColor();
            newsog5.RootPart.UpdateTexture(tex);
        }
        void ComputeLandingHeights()
        {
            float fromZ     = MaxZ + 10;
            float StepSize  = PathStore.StepSize; //0.2f
            int   MAPSPACE  = PathStore.MAPSPACE;
            int   MAPSPACE1 = MAPSPACE - 1;       // 1279
            bool  needsInit = false;

            float[,] _HeightMap = HeightMap;

            if (LandingHieghts == null)
            {
                if (_HeightMap != null)
                {
                    LandingHieghts = (float[, ])_HeightMap.Clone();
                }
                else
                {
                    LandingHieghts = new float[MAPSPACE, MAPSPACE];
                    needsInit      = true;
                }
            }

            CollisionIndex[,] MeshIndex = PathStore.MeshIndex;
            // FallingPrims = new FallingPrim[MAPSPACE, MAPSPACE];
            float              fy      = 256.1f;
            OdeScene           ps      = PathStore.odeScene;
            PrimitiveBaseShape newcube = PrimitiveBaseShape.CreateBox();
            uint          localId      = 6666666;
            PhysicsVector position     = new PhysicsVector(1, 1, 30);
            OdePrim       oprim        = (OdePrim)ps.AddPrimShape("FallingPrim_" + localId, newcube, position, new PhysicsVector(0.1f, 0.1f, 2f), Quaternion.Identity, true);

            oprim.LocalID = localId + 100000;
            oprim.SubscribeEvents(30000);

            for (int y = MAPSPACE1; y >= 0; y--)
            {
                fy         = fy - StepSize;
                position.Y = fy;
                float fx = 256.1f;
                for (int x = MAPSPACE1; x >= 0; x--)
                {
                    fx         = fx - StepSize;
                    position.X = fx;
                    if (needsInit)
                    {
                        LandingHieghts[x, y] = float.MinValue;
                    }
                    if (MeshIndex[x, y] == null)
                    {
                        continue;
                    }
                    float z           = MinZ;
                    bool  FoundClearZ = false;
                    while (z < MaxZ && !FoundClearZ)
                    {
                        float ClearZ = z;
                        position.Z = z;
                        if (!ps.IsSomethingAt(oprim))
                        {
                            FoundClearZ = true;
                            float CapZ = 2f + z;
                            while (z < CapZ && FoundClearZ)
                            {
                                if (ps.IsSomethingAt(oprim))
                                {
                                    FoundClearZ = false;
                                    break;
                                }
                            }
                            FoundClearZ = true;
                            break;
                        }
                        z += 0.1f;
                    }
                    if (FoundClearZ)
                    {
                        LandingHieghts[x, y] = z;
                    }
                    //FallingPrims[x, y] = new
                }
            }
            _HeightMap = LandingHieghts;
        }