300 likes | 408 Views
Go3D! A 3D Graphics Engine. Carlos Tosin. Divisão. Estrutura dividida em 4 componentes Core (46 classes) Áudio (4 classes) Script (4 classes) Renderer (37 classes). Componente - Core. Implementação de serviços básicos da engine Engine Environment Gerenciamento de memória
E N D
Go3D!A 3D Graphics Engine Carlos Tosin
Divisão • Estrutura dividida em 4 componentes • Core (46 classes) • Áudio (4 classes) • Script (4 classes) • Renderer (37 classes)
Componente - Core • Implementação de serviços básicos da engine • Engine Environment • Gerenciamento de memória • Gerenciamento de mensagens • Mecanismo de log • Gerenciamento de janela e eventos • RTTI – Runtime Type Information • Serialização de objetos • Streaming • Utilitários • Estruturas de Dados
Componente – CoreEngine Environment • Ambiente de execução da engine • Ponto de entrada para a engine • Fornece acesso aos componentes da engine • É único durante toda a execução • Suporte à arquivo de configuração
Componente – CoreGerenciamento de Memória • Smart Pointers • Ponteiros Inteligentes • Previnem memory leaks • Controlam as referências a determinado objeto e fazem sua destruição de forma automática • Macros para substituir operadores “new” e “delete” • As macros gravam a linha e o arquivo onde a memória foi alocada: NEW() e DESTROY() • Exibição de informações sobre memória alocada
Componente – CoreGerenciamento de Mensagens • Fila de mensagens • Mensagens padrão + Mensagens de Usuário
Componente – CoreMecanismo de Log • Suporta logs de informações e erros • Dispositivos de logs • Console • Arquivo
Componente – CoreGerenciamento de Janela e Eventos • Suporte à criação de janelas • Suporte à eventos de mouse e teclado • Utiliza a Win32 API
Componente – CoreRTTI – Runtime Type Information • Informações sobre tipos de objetos em tempo de execução • Criação de objetos através de strings representando o seu nome
Componente – CoreSerialização de Objetos • Suporte à serialização de objetos em arquivo • Os objetos podem ser salvos em disco e recuperados posteriormente em memória, da maneira como estavam dispostos na época da gravação
Componente – CoreStreaming • Suporte a streaming em arquivo (leitura e gravação)
Componente – CoreUtilitários • Biblioteca matemática • Contador de FPS • Parser de linha de comando • Medição de tempo
Componente – CoreEstruturas de dados • Array (dinâmico) • Implementação própria • Lista • Lista encadeada, implementação própria • Map (chave, valor) • Adapter para o Map do STL • Fila • Utiliza a lista • Pilha • Utiliza a lista • String • Adapter para a String do STL
Componente – Áudio • Suporte a sons wave • Implementação da camada de áudio em OpenAL (www.openal.org)
Componente – Script • Suporte a leitura de arquivos de script • Implementação da camada de scripts em Lua (www.lua.org)
Componente – Renderer • Implementação da camada gráfica da engine, feita em OpenGL (www.opengl.org) • Modelos 3D • Texturas • Bounding Volumes • Texto • Viewport, Projeção e Câmera • Primitivas gráficas básicas • Iluminação • Conceitos específicos da Go3D! Engine • Global States • Hierarquia de representação de cena
Componente – RendererModelos 3D • Suporte ao carregamento de modelos MD2 com textura • O programador não precisa conhecer a estrutura do formato MD2 • A malha de triângulos é convertida para as estruturas da engine
Componente – RendererTexturas • Suporte a texturas em formato BMP • O carregamento de imagens é feito através da biblioteca utilitária do OpenGL para plataforma Win32 • Atribuição de diversos parâmetros para texturas
Componente – RendererBounding Volumes • Suporte à bounding box • É possível adicionar o bounding box na cena como forma de auxílio no debug
Componente – RendererTexto • Escrita de textos 2D na tela • Suporta fontes instaladas no Windows • Parâmetros: cor, posição, negrito, itálico, sublinhado, riscado • Implementação utilizando Win32 API + OpenGL
Componente – RendererViewport, Projeção e Câmera • Viewport • Criação de uma viewport na janela da aplicação • Projeção • Ortogonal • Perspectiva • Câmera • Representação de câmera em mundo 3D
Componente - RendererPrimitivas Gráficas Básicas • Tipos de primitivas • Pontos • Tamanho • Suavização • Linhas • Aberta / Fechada • Contínua / Descontínua • Espessura • Padrão da linha
Componente - RendererPrimitivas Gráficas Básicas • Malha de triângulos • Para desenho de objetos mais complexos • Os vértices possuem cor, posição, normal e coordenadas de textura • Utilitário para geração de objetos básicos (um box, por exemplo)
Componente - RendererIluminação • Suporte à luz ambiente • Os objetos da cena podem ter materiais associados, informando como reagem à luz • Cálculo das normais
Componente - RendererGlobal States • Informações que alteram a renderização final, mas que são independentes dos vértices que formam os objetos • 4 tipos • Shading • Material • Wireframe • Culling
Componente - RendererHierarquia de Representação de Cena • Uma cena é representada através de uma árvore • As geometrias são nós-folha das árvores • Os outros nós podem conter geometrias ou outros nós • A varredura na árvore ocorre de cima para baixo (atualizando as transformações) e de baixo para cima (atualizando os bounding volumes) • Global states podem ser associados aos nós • A geometria possui toda a informação final de renderização
Detalhes da Implementação • Foi desenvolvido um SDK da engine • Arquivo LIB para ser linkado com o projeto que vai fazer uso da engine • Arquivos de cabeçalho (.h) necessários • DLLs necessárias para a execução • Exemplos de utilização das funcionalidades da engine • Documentação (toda a API da engine está documentada) • Códigos-fonte
Detalhes da Implementação • Aplicações que usam a engine • Instalação do SDK • Go3D.h • Go3D.lib • DLLs (Go3D.dll + …) • Em nenhum momento o programador utiliza chamadas específicas de OpenGL, Win32 API, Lua, OpenAL ou STL • O programador pode extender qualquer funcionalidade da engine • Funciona para aplicações Win32 ou Console
Detalhes da Implementação • Design Patterns utilizados (GoF) • Behavioral Patterns • Observer • Template Method • Creational Patterns • Factory Method • Prototype • Structural Patterns • Adapter • Composite
Considerações Finais • Altamente desafiador • Evoluí em programação C++ • Conheci APIs, ferramentas e técnicas novas • Uma engine completa tem muito mais recursos, mas acredito que consegui cumprir o objetivo que eu tinha com esse trabalho