public bool Create(ref RenderableInfo ri, ref bool m_hasMesh, float priority, int retries)
        {
            // collect mesh info
            // collect morph data
            // Ogr.CreateAvatarBF()

            string     entitySceneNodeName;
            string     parentSceneNodeName;
            EntityName entMeshName;

            if (RendererOgre.GetSceneNodeName(m_ent) == null)
            {
                entitySceneNodeName = EntityNameOgre.ConvertToOgreSceneNodeName(m_ent.Name);
                parentSceneNodeName = EntityNameOgre.ConvertToOgreSceneNodeName(m_ent.RegionContext.Name);

                IWorldRenderConv wrc;
                if (m_ent.TryGet <IWorldRenderConv>(out wrc))
                {
                    entMeshName = EntityNameOgre.ConvertToOgreMeshName(m_ent.Name);
                    if (!wrc.CreateAvatarMeshResource(0f, m_ent, entMeshName.Name, m_ent.Name))
                    {
                        // something about this avatar can't be created yet. Try again later.
                        return(false);
                    }
                }
                else
                {
                    entMeshName = EntityNameOgre.ConvertToOgreMeshName(new EntityName(m_defaultAvatarMesh));
                }

                IEntityAvatar av;
                if (m_ent.TryGet <IEntityAvatar>(out av))
                {
                    // Create the scene node for this entity
                    // and add the definition for the object on to the scene node
                    // This will cause the load function to be called and create all
                    //   the callbacks that will actually create the object
                    m_renderer.m_log.Log(LogLevel.DRENDERDETAIL, "RenderAvatar.Create: mesh={0}, prio={1}",
                                         entMeshName.Name, priority);
                    if (!m_renderer.m_sceneMgr.CreateMeshSceneNodeBF(priority,
                                                                     parentSceneNodeName,
                                                                     m_ent,
                                                                     entMeshName.Name,
                                                                     false, true,
                                                                     av.RegionPosition.X, av.RegionPosition.Y, av.RegionPosition.Z,
                                                                     1f, 1f, 1f,
                                                                     av.Heading.W, av.Heading.X, av.Heading.Y, av.Heading.Z))
                    {
                        // m_log.Log(LogLevel.DRENDERDETAIL, "Delaying avatar rendering. {0} waiting for parent {1}",
                        //     m_ent.Name.Name, (parentSceneNodeName == null ? "NULL" : parentSceneNodeName));
                        return(false); // if I must have parent, requeue if no parent
                    }
                    m_ent.SetAddition(RendererOgre.AddSceneNodeName, entitySceneNodeName);
                }
                else
                {
                    // shouldn't be creating an avatar with no avatar info
                }
            }
            return(true);
        }
        public bool Create(ref RenderableInfo ri, ref bool m_hasMesh, float priority, int retries)
        {
            string entitySceneNodeName = EntityNameOgre.ConvertToOgreSceneNodeName(m_ent.Name);

            lock (m_ent) {
                // create the rendering info if not created yet
                if (ri == null)
                {
                    IWorldRenderConv conver;
                    if (m_ent.TryGet <IWorldRenderConv>(out conver))
                    {
                        ri = conver.RenderingInfo(priority, m_renderer.m_sceneMgr, m_ent, retries);
                        if (ri == null)
                        {
                            // The rendering info couldn't be built now. This is usually because
                            // the parent of this object is not available so we don't know where to put it
                            // m_renderer.m_log.Log(LogLevel.DRENDERDETAIL,
                            //     "Delaying rendering. RenderingInfo not built for {0}", m_ent.Name.Name);
                            return(false);
                        }
                    }
                    else
                    {
                        m_renderer.m_log.Log(LogLevel.DBADERROR, "DoRenderLater: NO WORLDRENDERCONV FOR PRIM {0}",
                                             m_ent.Name.Name);
                        // this probably creates infinite retries but other things are clearly broken
                        return(false);
                    }
                }

                // Check to see if something of this mesh shape already exists. Use it if so.
                EntityName entMeshName = (EntityName)ri.basicObject;
                if (m_shouldShareMeshes && (ri.shapeHash != RenderableInfo.NO_HASH_SHARE))
                {
                    lock (prebuiltMeshes) {
                        if (prebuiltMeshes.TryGetValue(ri.shapeHash, out entMeshName))
                        {
                            m_hasMesh = true; // presume someone else created it
                            // m_log.Log(LogLevel.DRENDERDETAIL, "DorRenderLater: using prebuilt {0}", entMeshName);
                            // m_statShareInstances.Event();
                        }
                        else
                        {
                            // re-get mesh name since TryGet defaults it if not found
                            entMeshName = (EntityName)ri.basicObject;
                            // this is a new mesh. Remember that it has been built
                            prebuiltMeshes.Add(ri.shapeHash, entMeshName);
                        }
                    }
                }

                // see if this scene node has already been created
                if (RendererOgre.GetSceneNodeName(m_ent) == null)
                {
                    try {
                        // m_log.Log(LogLevel.DRENDERDETAIL, "Adding SceneNode to new entity " + m_ent.Name);

                        // Find a handle to the parent for this node
                        string parentSceneNodeName = null;
                        if (ri.parentEntity != null)
                        {
                            // this entity has a parent entity. create scene node off his
                            IEntity parentEnt = ri.parentEntity;
                            parentSceneNodeName = EntityNameOgre.ConvertToOgreSceneNodeName(parentEnt.Name);
                        }
                        else
                        {
                            // if no parent, add it at the top level of the region
                            parentSceneNodeName = EntityNameOgre.ConvertToOgreSceneNodeName(m_ent.RegionContext.Name);
                        }

                        // Create the mesh if prebilding. The mesh can be either built later on demand or now if
                        // we're forcing the build.
                        if ((m_shouldPrebuildMesh || m_shouldForceMeshRebuild) && !m_hasMesh)
                        {
                            // way kludgy... but we see if the cached mesh file exists and, if so, we don't need to rebuild
                            if (!m_shouldForceMeshRebuild && m_ent.AssetContext.CheckIfCached(entMeshName))
                            {
                                // if we just want the mesh built, if the file exists that's enough prebuilding
                                m_renderer.m_log.Log(LogLevel.DRENDERDETAIL, "RendererOgre.DorRenderLater: mesh file exists: {0}",
                                                     m_ent.Name.CacheFilename);
                                m_hasMesh = true;
                            }
                            if (!m_hasMesh)
                            {
                                // TODO: figure out how to do this without queuing -- do it now
                                //2 RequestMesh(m_ent.Name, entMeshName.Name);
                                //1 Object[] meshLaterParams = { entMeshName.Name, entMeshName };
                                //1 bool worked = RequestMeshLater(qInstance, meshLaterParams);
                                //1 // if we can't get the mesh now, we'll have to wait until all the pieces are here
                                //1 if (!worked) return false;
                                IWorldRenderConv conver;
                                m_ent.TryGet <IWorldRenderConv>(out conver);
                                if (!conver.CreateMeshResource(priority, m_ent, entMeshName.Name, entMeshName))
                                {
                                    // we need to wait until some resource exists before we can complete this creation
                                    return(false); // note that m_hasMesh is still false so we'll do this routine again
                                }
                                m_renderer.m_log.Log(LogLevel.DRENDERDETAIL, "RendererOgre.DorRenderLater: prebuild/forced mesh build for {0}",
                                                     entMeshName.Name);
                                // The mesh was crreated into the queued item so if a 'false' is returned
                                // later, we don't create the mesh again.
                                m_hasMesh = true;
                            }
                        }

                        // Create the scene node for this entity
                        // and add the definition for the object on to the scene node
                        // This will cause the load function to be called and create all
                        //   the callbacks that will actually create the object
                        m_renderer.m_log.Log(LogLevel.DRENDERDETAIL, "RenderPrim: ent={0}, mesh={1}", m_ent.Name, entMeshName.Name);
                        if (!m_renderer.m_sceneMgr.CreateMeshSceneNodeBF(priority,
                                                                         parentSceneNodeName,
                                                                         m_ent,
                                                                         entMeshName.Name,
                                                                         false, true,
                                                                         ri.position.X, ri.position.Y, ri.position.Z,
                                                                         ri.scale.X, ri.scale.Y, ri.scale.Z,
                                                                         ri.rotation.W, ri.rotation.X, ri.rotation.Y, ri.rotation.Z))
                        {
                            // m_log.Log(LogLevel.DRENDERDETAIL, "Delaying rendering. {0} waiting for parent {1}",
                            //     m_ent.Name.Name, (parentSceneNodeName == null ? "NULL" : parentSceneNodeName));
                            return(false); // if I must have parent, requeue if no parent
                        }

                        // Add the name of the created scene node name so we know it's created and
                        // we can find it later.
                        m_ent.SetAddition(RendererOgre.AddSceneNodeName, entitySceneNodeName);
                    }
                    catch (Exception e) {
                        m_renderer.m_log.Log(LogLevel.DBADERROR, "Render: Failed conversion of {0}: {1}", m_ent.Name.Name, e.ToString());
                    }
                }
                else
                {
                    // the entity already has a scene node. We're just forcing the rebuild of the prim
                    m_renderer.m_log.Log(LogLevel.DRENDERDETAIL, "DoRenderLater: entity has scenenode. Rebuilding mesh: {0}", entMeshName);
                    m_renderer.RequestMesh(m_ent.Name, entMeshName.Name);
                }
                return(true);
            }
        }
        public bool Create(ref RenderableInfo ri, ref bool m_hasMesh, float priority, int retries)
        {
            lock (m_ent) {
                if (RendererOgre.GetSceneNodeName(m_ent) == null)
                {
                    IAttachment atch;
                    if (m_ent.TryGet <IAttachment>(out atch))
                    {
                        // an attachment is almost a prim, use prim code to get details
                        if (ri == null)
                        {
                            IWorldRenderConv conver;
                            if (m_ent.TryGet <IWorldRenderConv>(out conver))
                            {
                                ri = conver.RenderingInfo(priority, m_renderer.m_sceneMgr, m_ent, retries);
                                if (ri == null)
                                {
                                    // The rendering info couldn't be built now. This is usually because
                                    // the parent of this object is not available so we don't know where to put it
                                    // m_renderer.m_log.Log(LogLevel.DRENDERDETAIL,
                                    //     "Delaying rendering. RenderingInfo not built for {0}", m_ent.Name.Name);
                                    return(false);
                                }
                            }
                            else
                            {
                                m_renderer.m_log.Log(LogLevel.DBADERROR, "DoRenderLater: NO WORLDRENDERCONV FOR PRIM {0}",
                                                     m_ent.Name.Name);
                                // this probably creates infinite retries but other things are clearly broken
                                return(false);
                            }
                        }

                        string     entitySceneNodeName = EntityNameOgre.ConvertToOgreSceneNodeName(m_ent.Name);
                        EntityName entMeshName         = (EntityName)ri.basicObject;

                        // resolve the name of the parent scene node
                        string parentSceneNodeName = null;
                        if (ri.parentEntity != null)
                        {
                            // this entity has a parent entity. create scene node off his
                            IEntity parentEnt = ri.parentEntity;
                            parentSceneNodeName = EntityNameOgre.ConvertToOgreSceneNodeName(parentEnt.Name);
                        }
                        else
                        {
                            // if no parent, add it at the top level of the region
                            parentSceneNodeName = EntityNameOgre.ConvertToOgreSceneNodeName(m_ent.RegionContext.Name);
                        }

                        if (!m_renderer.m_sceneMgr.CreateMeshSceneNodeBF(priority,
                                                                         parentSceneNodeName,
                                                                         m_ent,
                                                                         entMeshName.Name,
                                                                         false, true,
                                                                         ri.position.X, ri.position.Y, ri.position.Z,
                                                                         ri.scale.X, ri.scale.Y, ri.scale.Z,
                                                                         ri.rotation.W, ri.rotation.X, ri.rotation.Y, ri.rotation.Z))
                        {
                            // m_log.Log(LogLevel.DRENDERDETAIL, "Delaying rendering. {0} waiting for parent {1}",
                            //     m_ent.Name.Name, (parentSceneNodeName == null ? "NULL" : parentSceneNodeName));
                            return(false); // if I must have parent, requeue if no parent
                        }

                        // Add the name of the created scene node name so we know it's created and
                        // we can find it later.
                        m_ent.SetAddition(RendererOgre.AddSceneNodeName, entitySceneNodeName);
                    }
                }
            }

            return(true);
        }
예제 #4
0
 public bool Create(ref RenderableInfo ri, ref bool m_hasMesh, float priority, int retries)
 {
     m_renderer.m_log.Log(LogLevel.DRENDERDETAIL, "RenderFoliage: Create");
     return(true);
 }