| TWiki . Javadesktop . ProyectoWonderlandArquitectura |
ManagedObjects) y tiene un API para sincronizar la actualización del estado de estos objetos en respuesta a eventos desde múltiples clientes. Las actualizaciones a los ManagedObjects son transaccionales (el cambio de estado de los objetos debido a las actualizaciones puede suceder a través de una serie de objetos o pueden no ocurrir nunca. Todos los objetos dentro de un mundo virtual están representados por ManagedObjects en el servidor, por ejemplo, las habitaciones, los jugadores, las herramientas, armas, o cualquier otro objeto).
Más información sobre Proyecto Darkstar puede ser encontrada en: http://www.projectdarkstar.com.
El cliente es una aplicación Java de escritorio (J2SE) y está basada en dos tecnologías de renderizado 3D: Java 3D y Looking Glass 3D (lg3d). Java 3D, es una extensión estándar de Java SE, renderiza un conjunto de objetos 3D en tiempo real, si es posible usa aceleración de hardware. Más información sobre el proyecto java 3D: https://java3d.dev.java.net/.
El proyecto lg3d (Looking Glass) es un escritorio 3D y tiene un conjunto de API's para desarrollar aplicaciones 3D. Más información sobre este proyecto se puede encontrar en: https://lg3d-core.dev.java.net/.
bootstrapping para inicializar el “juego”, (lo cual remplaza al metodo main()).
La clase: org.jdesktop.lg3d.wonderland.darkstar.server.WonderlandBoot
Tiene este próposito por implementar el interface Darkstar AppListener. La implementación de su metodo initialize() realiza alguna tareas básicas las cuales inician la creación del mundo Wonderland. Estás son:
org.jdesktop.lg3d.wonderland.darkstar.server.UserManager la cual gestiona la lista de usuarios que conectan al servidor.
org.jdesktop.lg3d.wonderland.darkstar.server.cell.MasterCellCacheGLO la cual mantiene la lista de clases que manejan la cache de celdas visibles al usuario.
org.jdesktop.lg3d.wonderland.darkstar.server.ChecksumManagerGLO la cual gestiona una serie de “checksums” para las clases que representan activos en el mundo.
ChannelInfo.USER_CHANGE el cual comunica cambios de estado de los clientes.
WonderlandBoot.loggedIn() es invocado, el cual simplemente crea una nueva instancia de la clase org.jdesktop.lg3d.wonderland.darkstar.server.WonderlandSessionListener.
Esta es la clase que maneja futuros cambios en el estado del cliente, y en particular crea el Avatar con el usuario autenticado (vease WonderlandSessionListener.processAvatarSetupMessage()).
org.jdesktop.lg3d.wonderland.darkstar.server.cell.CellGLO
(El sufijo “GLO” es de una anterior versión del Darkstart donde los “managed objets” eran llamados “Game Logic Objects” o GLOs).
Hay dos tipos de celdas en Wonderland: celdas estáticas y celdas dinámicas. Las celdas estáticas representan regiones que no se mueven, mientras las dinámicas representan gráficos que se pueden mover. Los Avatares son el mejor ejemplo ( y tal vez el único) de celdas dinámicas. Todas las clases de celdas estáticas heredan (“extend”) de la clase: org.jdesktop.lg3d.wonderland.darkstar.server.cell.StationaryCellGLO
y todas las dinámicas de la clase:
org.jdesktop.lg3d.wonderland.darkstar.server.cell.MoveableCellGLO
Varias clases se usan para definir celdas estáticas en la Arquitectura del Wonderland.
La más básica es la celda “world root”, es la clase org.jdesktop.lg3d.wonderland.darkstar.server.cell.WorldRootCellGLO
la cual es la raíz de todas las celdas del mundo y es responsable de la creación del mundo. Actualmente, la WorldRootCellGLO crea su estructura de celdas mediante líneas de código.
Véase por ejemplo, WorldRootCellGLO.buildFullWorld(). En el futuro, se planea tener una arquitectura más flexible para la creación de mundos.
Actualmente, las siguientes clases estáticas existen para representar lo siguiente:
en el paquete org.jdesktop.lg3d.wonderland.darkstar.server.cell:
terrenos simples (SimpleTerrainCellGLO), presentación de diapositivas (SlideShowCellGLO), visores del modelo (ModelViewerCellGLO), animación (AnimatedCellGLO), audio (AudioCellGLO), y compartir aplicaciones (SharedApp2DCellGLO).
La única celda dinámica que existe es la celda Avatar (AvatarCellGLO).
CellGLO que proporciona la mayoría de los servicios que necesitan las celdas. Cada celda tiene un único “id”, generado por una utilidad central (véase org.jdesktop.lg3d.wonderland.darkstar.server.CellIDGenerator) y también un único nombre formado por “CELL_” más ID. (véase los métodos CellGLO.getCellID() y CellGLO.getGLOName()).
El ID de una celda es simplemente un número encapsulado por una instancia de la clase org.jdesktop.lg3d.wonderland.darkstar.common.CellID
CellGLO.getOrigin() devuelve el origen de celda, en forma de una instancia de la clase Matrix4d.
Una celda también tiene unos límites, representados por los límites de java 3d, que describe su extensión física. Las subclases de CellGLO gestiona los limites de las celdas, mediante el método CellGLO.getBounds().
CellGLO.addParentCell() y CellGLO.removeParentCell() respectivamente. El método CellGLO.getParentCellIDs() devuelve un array de las instancias de la clase CellID, cada posición identifica una celda padre. Los métodos CellGLO.addChildCell() y CellGLO.removeChildCell() añade y borra los hijos de una celda. El método CellGLO.getChildren() devuelve una lista de los hijos de la celda.
Al mismo tiempo , algunas celdas hijo pueden ser invisibles, que están condicionadas al cumplimiento de algunos límites visibles. El método CellGLO.getVisibleCells() devuelve una lista de celdas hijo que son visibles dado un cierto límite. Normalmente los límites visibles dependen de la visualización del frustum (El Frustum es el volumen de visualización de una cámara en un punto determinado, el cual está generado a partir de una matriz de proyección en perspectiva. Tiene forma de pirámide con la punta recortada) del avatar.
CellGLO.openCellChannel(). El método CellGLO.getCellChannel() devuelve el canal de la celda. Los clientes son añadidos como escuchantes del canal mediante le método CellGLO.addUserToCellChannel() y borrados con el método CellGLO.removeUserFromCellChannel(). Cada uno de los métodos anteriores necesita un identificador único de la sesión del cliente como argumento. (Véase la sección 6 para más información de la arquitectura de comunicación en el proyecto WonderLand).
CellGLO en el servidor se corresponde con una clase org.jdesktop.lg3d.wonderland.darkstar.client.cell.Cell en el cliente, el cuál es responsable de renderizar la celda. El nombre de la “cell class” del cliente es definida por cada una de las subclases individualmente por los clientes mediante el método CellGLO.getClientCellClassName().
En el lado del servidor CellGLO comunica su contenido visual y otros datos de configuración mediante una instancia de una clase que implementa la interface org.jdesktop.lg3d.wonderland.darkstar.common.CellSetup.
Esto es devuelto desde el método CellGLO.getSetupData() y está implementado, por cada una de las subclases CellGLO del cliente.
La interface CellSetup es simplemente una interface vacía, la cual extiende (hereda) la interface java.io.Serializable con el fin de poder ser enviado mediante serialización. En el lado del servidor cada clase CellGLO define su propia clase “setup” que implementa la interface CellSetup.
Existen ejemplos, en el paquete: org.jdesktop.lg3d.wonderland.darkstar.common.setup incluye AnimatedCellSetup, AvatarCellSetup, ModelViewerCellSetup, SharedApp2DCellSetup, SimpleCellSetup y SlideShowCellSetup.
Por ejemplo,la clase org.jdesktop.lg3d.wonderland.darkstar.common.SimpleCellSetup es utilizada, por una celda terreno simple y tiene métodos que devuelven el nombre de los archivos almacenados en el disco de la escena.
org.jdesktop.lg3d.wonderland.darkstar.server.cell.UserCellCacheGLO existe una instancia de esta clase por cada usuario ( que es equivalente a decir “cliente”) y es creada cuando el usuario se registra en el sistema. Todas las instancias de UserCellCacheGLO son gestionadas por la instancia la clase MasterCellCacheGLO que fue creada por WonderlandBoot (vease sección 4.1). Son objetos gestionados dentro de la infraestructura del proyecto Darkstar.
En la parte del servidor las clases cacheadas soportan varios cambios de estado a las CellGLOs. Ellos son: celda creada, celda root creada, celda movida, celda borrada y añadir padre a la celda.
Actualmente, el método UserCellCacheGLO.revalidate() tiene en cuenta a los CellGLOs que se encuentran actualmente visibles y añade los CellGLOs que son nuevos y borra de la memoria del cliente los que hace tiempo que no son visibles. Los cambios de estado de los CellGLOs son comunicados mediante un canal dedicado (llamado CELL_CACHE) asociado con la instancia la clase UserCellCacheGLO.
Actualmente, los mensajes que son emitidos por este canal son instancias serializadas de la clase org.jdesktop.lg3d.wonderland.darkstar.common.messages.CellHierarchyMessage
Las celdas visibles son determinadas por la posición del avatar. Su ángulo de visión está determinado por una instancia de la clase org.jdesktop.lg3d.wonderland.darkstar.common.AvatarBoundsManager mediante su método getProximityBounds(). Este método define el área de visibilidad como una esfera con un radio específico (AvatarBoundsManager.PROXIMITY_SIZE = 200.0) desde el centro del avatar.
org.jdesktop.lg3d.wonderland.Main, como su nombre indica, implementa el método main() que arranca el cliente. Él inicializa el interface de usuario y lee las opciones de configuración desde un fichero externo, en formato XML.
La inicialización de la conexión con el servidor es mediante la clase interna StartupListener, que implementa la interface Lg3dStartupListener, desde el proyecto Looking Glass este método listener's startupComplete(), es invocado cuando la inicialización de los gráficos se termina. A su vez, la implementación del método startupComplete(), muestra una ventana de registro (véase clase org.jdesktop.lg3d.wonderland.LoginDialog) que acepta información de registro desde el usuario. Él inicializa una conexión al servidor WonderLand e invoca el método Main.enableMainWindow() para activar el cliente WonderLand, es decir, la interface de usuario.
Toda la comunicación con el servidor WonderLand, basado en Darkstar, es gestionado por una instancia de la clase org.jdesktop.lg3d.wonderland.darkstar.client.ChannelController (esto parece engañoso ya que parece decir que no se tiene control sobre los canales, sino que provee de un mecanismo directo cliente servidor?). Una nueva conexión al servidor es iniciada con el método ChannelController.initCommunications(). Véase la sección 6 para más detalles de la clase ChannelController.
org.jdesktop.lg3d.wonderland.scenemanager.WonderlandUniverseFactory, crea el java.awt.Canvas principal e inicializa algunos parámetros básicos de visualización.
Está instancia es creada por una instancia de la clase org.jdesktop.lg3d.wonderland.scenemanager.WonderlandPlatformConfig, que a su vez, está especificada por la propiedad lg.platformConfigClass.
WonderLand define su propio gestor de escena, el equivalente a un gestor de ventanas del sistema X Window en el proyecto Looking Glass.
La clase org.jdesktop.lg3d.wonderland.scenemanager.WonderlandSceneManager extiende la clase LG3D SceneManagerBase, una clase abstracta que implementa la interface LG3D SceneManager. La clase LG3D SceneManagerBase maneja la comunicación con el servidor de visualización LG3D (el equivalente al Servidor X Windows) a través de su implementación de la interface LG3D DisplayServerManagerInterface.
El método WonderlandSceneManager.initialize() contiene la mayor parte de la funcionalidad de esta clase.
El crea una instancia de la clase org.jdesktop.lg3d.wonderland.scenemanager.WorldController y una instancia de la clase Java 3D BranchGroup a la que el WorldController enlaza la totalidad de los contenidos visuales. Asimismo, agrega a la clase Java 3D BranchGroup como un hijo del servidor raíz de visualización LG3D.
La instancia de WonderlandSceneManager también crea una instancia de una clase LG3D la StandardAppContainer, usando el gestor de layout null-style. La implementación de los métodos SceneManager.addFrame3D() y SceneManager.removeFrame3D() añade y borra el frame de la instancia de la clases StandardAppContainer. La utilidad esta poco clara actualmente?.
La instancia de la clase WonderlandSceneManger está instalada de acuerdo a la especificación LG3D siguiente:
El método createSceneManager() org.jdesktop.lg3d.wonderland.scenemanager.WonderlandConfigControl devuelve una instancia de la clase WonderlandSceneManager. La clase Main establece la propiedad "lg.configclass" a "org.jdesktop.lg3d.wonderland.scenemanager.WonderlandConfigControl".
Información adicional de configuración para el gestor de escena también es manejada por la clase WonderlandConfigControl, la cual lee fichero XML de opciones de configuración, por defecto: "/org/jdesktop/lg3d/wonderland/scenemanager/resources/wonderland.lgcfg"
WorldController maneja todo el el contenido visible en el mundo de Wonderland. Como miembros de la clase, ella mantiene instancias de 2 importantes clases del lado del cliente: org.jdesktop.lg3d.wonderland.scenemanager.UserCellCache and ChannelController. La WorldController toma como argumento de la BranchGroup Java 3D el que añade la iluminación: una de luz de ambiente de color RGB = {0.7, 0.7, 0.7}, y dos luces direcionales. Una luz direcional es blanca y es hacía abajo a la izquierda. La segunda luz direcional es RGB = {0.2, 0.2, 0.3} y está arriba a la izquierda.
UserCellCache. La carga/descarga de celdas y los cambios de su estado es controlado en su totalidad por el servidor a través del envío de mensajes desde el servidor al cliente, formateado como instancias de la clase CellHierarchyMessage. El método UserCellCache.handleMessage() maneja estos eventos del servidor, envía sobre un canal de comunicación gestionado por la infraestructura del Proyecto Darkstar y manjeado por una instancias de la clase org.jdesktop.lg3d.wonderland.darkstar.client.UserCellCacheChannelListener
Una operación común, particularmente asignada al arranque del cliente, es la solicitud de crear nuevas celdas en el lado del cliente mediante un mensaje del tipo CellHierarchyMessage.LOAD_CELL.Usando la información de configuración incluida en el CellHiearchyMessage, una instancia de la clase celda del lado del cliente se crea al inicializar. La nueva celda es añadida a la cache HashMap de las celdas, y el hilo (una instancia de la clase interna CellUpdateThread dentro de la clase UserCellCache es registrado para actualizar el conjunto de celdas visibles para renderizar (la variable UserCellCache.visibleCells).
La instancia de la clase UserCellCache también gestiona la lista de celdas en las que el avatar esta actualmente posicionado mediante la variable UserCellCache.avatarInCells (un HashSet). Este conjunto es actualizado con el hilo CellUpdateThread. Los eventos de entrada y salida de celda son generados - representados por las clases CellEnterEvent y CellExitEvent (en el paquete org.jdesktop.lg3d.wonderland.scenemanager.events), respectivamente-y enviados.
La clase UserCellCache actualmente solo implementa un subconjunto de estados de celda: VISIBLE e INACTIVE. Los demás estados de celda no son manejados y son: ACTIVE, DISK y BOUNDS.
La clase UserCellCache también implementa la interface org.jdesktop.lg3d.wonderland.scenemanager.UserMotionListener que recibe notificación cuando el avatar se mueve (mediante el metodo userMoved()). La implementacion del método UserCellCache.userMoved() actualmente es básico: el simplemente actualiza el estado visible de las celdas y genera mensajes de entrada/salida usando la posición actualizada del avatar.
WonderLand y el servidor, y entre los clientes.
Cada cliente esta representado en el servidor por un número de objetos. Los objetos son: UserGLO – Información básica del usuario, como nombre y color preferido
AvatarCellGLO – La celda donde el avatar del usuario esta renderizado
UserCellCacheGLO – Las celdas que son visibles a un determinado usuario.
UserCellCacheGLO y comprueba si el cliente ya esta cargado en todas las celdas cercanas. Si el servidor encuentra una celda que el cliente no ha mirado aún, él le envía un mensaje, indicando al cliente la carga de la nueva celda.
WonderlandBoot.loggedIn()).
org.jdesktop.lg3d.wonderland.darkstar.common.messages.ErrorMessage (ídem, y también en WonderlandSessionListener.processFileTransferMessage().
org.jdesktop.lg3d.wonderland.darkstar.common.messages.NativeApplicationMessage como los mensajes de respuesta al mensaje "create application cell" (en WonderlandSessionListener.processNativeApplicationMessage()).
org.jdesktop.lg3d.wonderland.darkstar.common.messages.SoftphoneMessage (en los métodos callStatusChanged() y processSoftphoneMessage() del WonderlandSessionListener.
ChannelController.handleMessage().
NativeApplicationMessage son manejados por el método receivedMessage() de la clase interna MessageListener de la clase org.jdesktop.lg3d.wonderland.appshare.ServerApp2DCell.
SoftphoneMessage son también manejados por el ChannelController.handleMessage().
NativeApplicationMessage. Estás son enviadas por el constructor de la clase. Esto son enviados por el constructor de la clase ServerApp2DCell y el método sendMessage() del ChannelController.
org.jdesktop.lg3d.wonderland.darkstar.common.messages.SoftphoneMessage. Estos son enviados por los métodos connectSoftphone() y disconnectSoftphone() del ChannelController.
org.jdesktop.lg3d.wonderland.darkstar.common.messages.AvatarSetupMessage inicializada por el método loggedIn() en la clase ChannelController.
org.jdesktop.lg3d.wonderland.darkstar.common.messages.CellMessage. Actualmente parece que no hay ninguna.
NativeApplicationMessage. Estos son manejados por el método receivedMessage() de org.jdesktop.lg3d.wonderland.darkstar.server.WonderlandBaseSessionListener, y posteriormente por su método processNativeApplicationMessage().
SoftphoneMessage. Estos son manejados por el método receivedMessage() de WonderlandSessionListener.
org.jdesktop.lg3d.wonderland.darkstar.common.messages.AvatarSetupMessage. Estos son también manejados por el método receivedMessage() de WonderlandSessionListener.
org.jdesktop.lg3d.wonderland.darkstar.common.messages.CellMessage, enviados a las instancias de la clase org.jdesktop.lg3d.wonderland.darkstar.server.CellMessageListener.
WonderLand también crea canales de comunicación de publicar/suscribir, que incluye: USER_CHANGE, CELL_CACHE, AVATAR_P2P, AVATAR_CELL y SERVER_MANAGER_CHANNEL. Un canal proporciona un mecanismo de comunicación entre clientes y también entre un cliente y su servidor.
WonderlandBoot en su método initialize(), y todos los nuevos clientes son añadidos automáticamente a él. Se usa exclusivamente para la comunicación servidor->cliente.
Sobre este canal, el servidor transmite a los clientes los mensajes siguientes: org.jdesktop.lg3d.wonderland.darkstar.common.messages.UserChangedMessage cuando los usuarios son añadidos (USER_ADD, en el método processAvatarSetupMessage() de la clase WonderlandSessionListener) o cuando los usuarios lo dejan (USER_LEFT, en el método disconnected() de la clase WonderlandSessionListener).
receivedMessage() de la clase org.jdesktop.lg3d.wonderland.darkstar.client.UserChannelListener.
UserCellCacheGLO que corresponde al cliente (en su constructor). Cada nuevo cliente es automáticamente añadido a uno de estos canales.
Cada instancias de la clase UserCellCacheGLO tiene un canal CELL_CACHE. Sólo un cliente /usuario (la caché del usuario)está suscrito al canal CELL_CACHE. La suscripción es gestionada en el método login() de la clase UserCellCacheGLO. Este canal es usado exclusivamente para la comunicación del servidor->cliente.
El servidor transmite, sobre este canal, al cliente los mensajes siguientes. Los mensajes son enviados por la instancia de UserCellCacheGLO.
CellHiearchyMessage, que puden ser del tipo: LOAD_CELL, MOVE_CELL, CELL_INACTIVE, ADD_PARENT, REMOVE_PARENT, SET_WORLD_ROOT, y DELETE_CELL.
receivedMessage() una instancia de la clase org.jdesktop.lg3d.wonderland.darkstar.client.UserCellCacheChannelListener.
AvatarCellGLO durante su construcción y por tanto gestionada por la instancia del AvatarCellGLO. Otro cliente puede solicitar unirse a clientes con canal P2P mediante el envío de mensajes AvatarCellMessage(JOIN_P2P) en el canal AVATAR_CELL (mirar lo siguiente).
Cada avatar envía su actualización de movimientos sobre el canal AVATAR_P2P de los clientes, de modo que cualquier cliente se preocupa de esas actualizaciones (generalmente cualquier otro cliente en el area de visualización del avatar) subscribiendose a las mismas.
El servidor transmite al cliente, sobre este canal, los mensajes siguientes:
receivedMessage() de la clase AvatarCellGLO en respuesta a un mensaje AvatarCellMessage(JOIN_P2P).
callStatusChanged() y rocessAvatarCellMessage() de la clase WonderlandSessionListener y el método setSpeakingStatus() de la AvatarCellGLO.
receivedMessage() que es de una instancia de la clase org.jdesktop.lg3d.wonderland.darkstar.client.AvatarP2PChannelListener.
Un cliente transmite instancias de la clase AvatarP2PMessage sobre este canal, aunque solo del tipo de mensajes MOVE and CHAT: userMoved() de la clase org.jdesktop.lg3d.wonderland.scenemanager.avatar.Avatar en respuesta a una interacción del usuario.
sendChatMessage() de la clase Avatar.
handleMessage() que pertenece a una instancia de la clase org.jdesktop.lg3d.wonderland.darkstar.serverAvatarP2PChannelListenerGLO. (El método sólo es usado para propositos autenticación).
De esta manera, este canal es usado para intercomunicación con el cliente (para AvatarP2PMessages del tipo MOVE y CHAT), y para la comunicación servidor->cliente (para AvatarP2PMessages del tipo SETUP y SPEAKING).
AvatarCellGLO durante su construcción. El nombre de el canal tiene el formato: user + AVATAR_CELL donde 'usuario' es el nombre del usuario.
El servidor transmite al cliente, sobre este canal, los mensajes siguientes:
AvatarCellMessage, que tiene un tipo básico: SETUP. Esto es enviado cuando un avatar se hace visible en una celda (por ejemplo: AvatarCellGLO)
CellGLO's y añade el cliente al canal CellGLO's si el canal existe. Actualmente, solamente el avatar CellGLO crea un canal por si mismo. En ese momente, un mensaje SETUP es enviado al cliente, que guarda una referencia al canal para la comunicación futura.
El servidor transmite al cliente, sobre este canal, los mensajes siguientes:
AvatarCellMessage. El maneja estos mensajes mediante el método receivedMessage() de una instancia de la clase AvatarCellGLO (para mensajes que son de tipo CELL_MOVE, CELL_ENTER, y CELL_EXIT) y también con el método receivedMessage() de una de instancia del WonderlandSessionListener (para mensajes que son del tipo AVATAR_MOVE, AVATAR_MUTE y JOIN_P2P).
AvatarCellMessage (vease org.jdesktop.lg3d.wonderland.darkstar.client.cell.AvatarCell.)
El cliente recibe mensajes a través de este canal. Son manejados mediante el método receivedMessage() de una instancia de la clase org.jdesktop.lg3d.wonderland.darkstar.client.cell.AvatarCellChannelListener.
org.jdesktop.lg3d.wonderland.darkstar.server.ServerManagerGLO, es usado para la gestión de la comunicación del servidor al cliente. Actualmente, el servidor propiamente dicho y un cliente especial (codificado con el nombre “ServerManager”) son añadidos a este canal.
El servidor transmite y recibe instancias de la clase org.jdesktop.lg3d.wonderland.darkstar.common.messages.ServerManagerMessage del cliente sobre este canal, que pueden ser de cuatro tipos STATUS, FULL_STATUS, CHANGE_UPDATE_INTERVAL, y SET_USER_LIMIT.
El único cliente del canal de comunicación SERVER_MANAGER_CHANNEL es proporcionado por una instancia de la clase org.jdesktop.lg3d.wonderland.management.ManagerUI que se abre al ejecutar la etiqueta del Ant “Ant run-manager”.
CellGLO en el servidor. Un ejemplo puede ser cuando un usuario pulsa sobre algo.
CellGLO en el servidor
CellGLO
CellGLO actualiza su estado
El flujo de control de arriba difiere del Modelo Vista Controlador (MVC) convencional en las siguientes características:
CellGLO determina su Cell ( lo que equivale a decir que el modelo determina su vista). Esto significa que no es posible usar la misma clase CellGLO para renderizar múltiples clases Cell. Por ejemplo, una clase CellGLO representando una posible muerte no tiene dos clases Cell que provean de diferentes renderizados de una muerte.
WonderLand para el uso de los mensajes del canal propio de una Cell.
WonderLand. Por ejemplo, si WonderLand usará MVC, el flujo de control podría ser:
CellGLO en el servidor.
CellGLO
CellGLO actualiza su estado
CellGLO.
La razón de esta diferencia es por el rendimiento. Es importante que el usuario sea notificado de un cambio de apariencia tan rápido como sea posible (por ejemplo, antes de notificar el servidor).
WonderLand: uno, cuando un cliente inicia la conexión y dos, cuando un avatar se mueve o cambia su punto de vista.
LG3D Lg3dConnector a la ventana principal. Esto, a su vez, arranca el visor servidor LG3D. Tras la inicialización, el visor servidor L3GD inicializa el universo, sistema de ventanas, vistas, crea la escena gráfica raíz (scene graph-vease java3D) y inicializa el gestor de escena.
WorldController, el cuál crea una nuevas instancias de las clases ChannelController y UserCellCache.
LG3D, el método StartupListener.startupComplete() es invocado lo que provoca la ventana de autenticación del WonderLand.
WonderlandClientListener.loggedIn().
AvatarSetupMessage al servidor Darkstar mediante su mecanismo de comunicación cliente-servidor con información sobre el avatar, tal como su modelo visual.
WonderLand es activada.
WonderLandBoot.initialize() crea nuevas instancias de las clases ServerManagerGLO, UserManager, MasterCellCacheGLO y ChecksumManagerGLO. Un canal Publicar/suscribir también se crea y se llama USER_CHANGE.
MasterCellCacheGLO crea una nueva instancia de la clase WorldRootCellGLO. A su vez esta invoca al método WorldRootCellGLO.buildWorld() que crea todas las celdas del mundo.
WonderlandSessionListener recibe un mensaje AvatarSetupMenssage desde el cliente. El crea una nueva instancia de la clase UserGLO.
UserGLO crea una nueva instancia AvatarCellGLO, que a su vez crea una nueva instancia UserCellCacheGLO.
UserCellCacheGLO crea un canal publicar/suscribir llamado user+CELL_CACHE, donde 'user' es el nombre del usuario.
AvatarCellGLO entonces abre un canal publicar/suscribir llamado AVATAR_P2P y un canal llamado user+AVATAR_TILE, donde 'user' es el nombre del usuario.
WonderlandSessionListener entonces enlaza el cliente al canal USER_CHANGE y envía un mensaje UserChangedMessage (USER_ADDED) al cliente. Él entonces llama al método login() de la instancia UserGLO.
UserGLO.login() añade una referencia del usuario al mapa hash (map hash) relacionando los ID's de los objetos de usuario. Invoca al AvatarCellGLO.login().
AvatarCellGLO.login() añade la instancia recibida del AvatarCellGLO a la instancia MasterCellCacheGLO. El entonces llama al UserCellCacheGLO.login() que une el cliente al usuario al canal user+CELL_CACHE , añade a sí mismo (el UserCellCacheGLO) a la instancia del MasterCellCacheGLO, y envía un mensaje CellHiearchyMessage (LOAD_CELL) al canal llamado “user+CELL_CACHE”, y entonces envía un mensaje CellHierarchyMessage (SET_WORLD_ROOT) al canal llamado “user+CELL_CACHE”.
UserGLO.login() entonces llama al método UserCellCacheGLO.avatarCellMoved, que procesa la lista de celdas visibles y envía el mensaje CellHierarchyMessage (LOAD_CELL) a todas las celdas visibles en el canal llamado “user+CELL_CACHE”. También envía mensajes CellHierarchyMessage (DELETE_CELL o CELL_INACTIVE) para las celdas no visibles en el canal “user+CELL_CACHE”.
WonderlandSessionListener envía los mensajes UserChangedMessage a cada cliente a través del canal USER_CHANGE para notificarles el nuevo cliente.
AvatarControlBehavior.processStimulus() despierta y llama al método WalkBehavior.updateState() que actualiza la posición del avatar.
UserMotionListener son notificadas de la nueva posición del avatar mediante el método userMoved(). Un ejemplo de una implementación de la clase UserMotionListener es la clase UserCellCache, cuyo método userMoved() llama al método UserCellCache.updateCells(). (Otro ejemplo de implementación del interface es la clase AvatarCell).
updateCells() procesa las celdas visibles basándose en la vista de “frustum” del usuario. Actualiza el estado de cada celda y la lista de celdas visibles. Para todas las celdas visibles, actualiza la lista de celdas del avatar que están actualmente en pie. Causa eventos del tipo CellEnterEvent y CellExitEvent para enviarse a las apropiadas celdas (dentro de los eventos del marco de trabajo del LG3D). (Al mismo tiempo el AvatarCellMessage escribe CELL_ENTER y CELL_EXIT no se envían al servidor, ni el servidor toma ninguna acción al recibir estos eventos).
AvatarCell.userMoved() envía un AvatarCellMessage (AVATAR_MOVE y CELLMOVE) al servidor mediante el canal AVATAR_TILE. La posición del avatar es actualizada en el servidor y la UserCellCacheGLO se pregunta a si misma (lista de celdas visibles y invisibles, actualiza su estado e informa al cliente) .
Wonderland. Es destacable la ausencia de documentación de Avatares, su configuración y comportamiento, compartición de aplicaciones y el audio.
----- Revision r5 - 25 Jun 2008 - 16:42:37 - Main.nicer94
|