INF 1366 – Computação Gráfica Interativa X3D – Event Utilities e Scripting Alberto B. Raposo [email protected] http://www.tecgraf.puc-rio.br/~abraposo/INF1366 Alberto Raposo – PUC-Rio Event Utilities • Há muitos tipos de nós que podem gerar muitos tipos de eventos • ROUTE pode ser usado para conectar diretamente 2 eventos do mesmo tipo – Ex. não se pode conectar um SFFloat de um nó a um inteiro de outro nó; timestamp não pode se conectar direto com booleano, etc. • Event utility nodes facilitam a conversão Alberto Raposo – PUC-Rio Event Utility Nodes • • • • • • • • BooleanFilter BooleanToggle BooleanSequencer IntegerSequencer BooleanTrigger IntegerTrigger TimeTrigger Script Alberto Raposo – PUC-Rio Sequencer Nodes Alberto Raposo – PUC-Rio Exemplo Alberto Raposo – PUC-Rio Exemplo Alberto Raposo – PUC-Rio BooleanFilter, Toggle e Trigger • BooleanFilter – Normalmente usado para negar um valor booleano recebido (sem alternar) • BooleanToggle – Ao receber o set_boolean, alterna entre True e False • BooleanTrigger – Conecta eventos de tempo a booleanos (gera um “true” sempre que receber um evento de tempo Exemplos: 11_IntegerSequencer, 11_BooleanFilter, 11_BooleanToggle e 11_BooleanTrigger Alberto Raposo – PUC-Rio Outros Triggers • IntegerTrigger – Converte eventos booleanos de entrada em um valor inteiro • Ver 11_IntegerTrigger • TimeTrigger – Convert eventos booleanos de entrada em em eventos SFTime (timestamp) Alberto Raposo – PUC-Rio ScriptNode • Permite embutir programas em X3D – ECMAScript (JavaScript) – Java • Define conjunto de campos que serão usados para enviar e receber eventos • Quando recebe um evento, chama um método correspondente a esse evento no programa para tratar o evento e, possivelmente, gerar um evento de saída. Alberto Raposo – PUC-Rio ScriptNode Alberto Raposo – PUC-Rio URL vs CDATA • url – Indica arquivo externo onde está o script (.js ou .class ou .jar) • No caso de script embutido no xml (.x3d), é melhor usar o bloco CDATA do XML, que não fica sujeito às interpretações do XML (por exemplo, “<“ e “>” ). Alberto Raposo – PUC-Rio ScriptNode com CDATA Alberto Raposo – PUC-Rio Outros campos do Script • directOutput – Indica se Script pode acessar e alterar outros nós da cena sem usar o ROUTE • Serve de “alerta” para o browser no que diz respeito à renderização • mustEvaluate – Se falso, indica ao browser que ele pode esperar para mandar eventos para o Script até que outputs sejam necessários. Alberto Raposo – PUC-Rio Métodos do Script • initialize( ) – Chamado automaticamente quando o Script é carregado – Usado para “setup” do código e de conexões remotas, inicialização de variáveis, etc • shutdown( ) – Chamado automaticamente quando a cena é fechada ou quando o nó Script é retirado da cena (ou substituído por um outro) Alberto Raposo – PUC-Rio Métodos do Script • prepareEvents( ) – Opcional – Chamado uma vez antes de executar qualquer ROUTE na cena – Usos: ler buffers da rede, checar listeners externos, etc • eventsProcessed( ) – Opcional – Chamado depois que o nó Script recebe todos os eventos de input – Pode representar ganho de eficiência, se um output precisa ser calculado a partir de vários inputs (ao invés de chamar uma funcao específica para cada input event recebido). Alberto Raposo – PUC-Rio Modelo de execução • A cada quadro gerado (i.e., pixels desenhados), o browser pára para a passagem de eventos e atualizações de estado. Alberto Raposo – PUC-Rio Ciclo de eventos 1. Atualizar posição de câmera 2. Avaliar input dos sensores e de outros geradores de eventos, colocando esses eventos pilha para envio 3. Rotear eventos para seus destinos, atualizando os campos do nós 4. Se novos eventos forem gerados e roteados nos passos 2 e 3, voltar ao passo 2, até que não haja mais eventos pendentes Alberto Raposo – PUC-Rio Ciclo de renderização do quadro 5. O próximo quadro é gerado (desenhado, pixel a pixel) e buferizado até que esteja completo 6. Sistemas com double buffer fazem o swap do buffer recém criado com o anterior 7. Atualiza clock do browser 8. Retorna ao ciclo de eventos (passo 1) Alberto Raposo – PUC-Rio Para evitar loops infinitos no ciclo de eventos • Só permite uma passagem por um ROUTE a cada quadro – Evita ciclos no roteamento de eventos Alberto Raposo – PUC-Rio Ciclo do Script Node Alberto Raposo – PUC-Rio Classe Browser • Disponível em Java e ECMAScript • Provê uma série de funções úteis Alberto Raposo – PUC-Rio Classe Browser Alberto Raposo – PUC-Rio Exemplos de Script Event Passing, directOutpu e SAI Alberto Raposo – PUC-Rio Mais exemplos • http://www.web3d.org/x3d/content/example s/Basic/ • http://www.web3d.org/community/models/ Alberto Raposo – PUC-Rio SAI – Scene Access Interface • Interface de programação usada para fazer comunicação entre X3D e Java Alberto Raposo – PUC-Rio SAI – exemplos e tutoriais • • • http://www.sal.ipg.pt/user/estg/martins/x3 d.htm http://www.xj3d.org/tutorials/general_sai. html http://www.web3d.org/x3d/specifications/I SO-IEC-19775X3DAbstractSpecification/ Alberto Raposo – PUC-Rio