Um blog singelo sobre Blender e 3D

Warp Mesh Generator 1.1 para Blender Game Engine - Dome

17 de Agosto de 2009 Dalai Felinto
Português

Para quem acompanha este blog não é novidade que venho estudando e pesquisando soluções para integrar domos imersivos com o Blender.

Minha atual principal motivação agora é a construção de um domo imersivo com um espelho esférico para a minha universidade (UFF). Quero fazer isto até sexta-feira (quando apresento meu trabalho de graduação). Depois eu digo se deu certo :)

Uma das etapas mais enigmáticas e importantes para se utilizar um espelho esférico com um domo é a produção de uma malha de deformação para compensar o efeito produzido pelo espelho.

English

I’m studying/working/getting tired of immersive domes. and all sort of related issues My current goal and motivation is to build an immersive dome for my university (Universidade Federal Fluminense - Niterói).

My deadline is this Friday (4 days from now). That’s when I’m going to present my graduation project (Immersive domes for architecture) and I’m really excited about showcasing it in a real dome.

So on, one of the key elements while using spherical mirrors for immersive domes is the warping mesh. This mesh is used to reverse the mirror deformation in the projected image.

test image

Read the rest of this entry »

Aventures à l’aeroport de Montréal, Dome e outras histórias

12 de Fevereiro de 2009 Dalai Felinto

Desta vez não vou falar muito em português não. Se puder se aventurar pelo idioma preferido dos seriados e enlatados americanos divirta-se :)

Caso contrário curta os vídeos e as fotos. Foram feitos em Montreal durante minha estadia por lá para conhecer de perto o projeto do domo deles.

This week I went to Montreal for three days to test the SAT dome first hand and get know the Dome team.

It couldn’t have been better. Louis-Philippe St-Arnault is doing a great job coordinating this part of their project. Then we have Dominic (a very nice film director) co-coordinating it, Gabriel Morin (XSI talented artist) producing 3D content and Jean Guillemette (a Blender artist and instructor from Montage Studio - who recently wrote a way too flattery post in his blog about this project) working as a Blender consultant and Blender instructor. For the occasion we had also the company and assistency of Martin “teeth” Poirer (a great Blender developer who I had the pleasure to meet before in the Blender Conference).

As a result of the tests I did some videos that I hope you like it. There is also another nice thing. In May the LGM - Library Graphic Meeting  is going to happen in Montreal. Also some activities may happens in the SAT using the dome. I think it will depend if the developers/artists at LGM are interested. For example. it would be nice to have some assistance of a gimp coder to help developing a dome/fisheye gimp plugin (to input 4/5 images and have a fisheye output).

Read the rest of this entry »

Dome II … getting close

31 de Janeiro de 2009 Dalai Felinto
Português

Hoje foi dia de despedida.

Vou ficar um bom tempo sem voltar à UBC, onde eu aprendi muito, trabalhei muito, e o mais importante: me diverti horrores :D

Para celebrar o fim desta etapa de trabalho (novidades em breve, terminamos um vídeo que ficou bem bacana) resolvemos tirar parte do expediente pra testar o domo que tem aqui.

Nem tudo deu certo, por exemplo o domo aqui é do tipo truncated, então tenho que refazer parte do código pra suportar este tipo de domo também.

Mas enfim, foi bem divertido.

Inglês

Today was time to say bye to UBC again. Sunday I’m heading to Toronto, and then going back to Brazil in the end of February.

As a nice farewell work day, we took part of it to run some tests in the Dome they have at UBC.

Unfortunately their Dome is a trucated one. Since so far I coded only the regular fisheye camera in Blender, the distortion isn’t the same.

After some hacky changes in the code (and quick recompilations thanks to scons) we had some nice result though.

Português

Ainda tem algumas coisas que tenho que ajeitar no código.

Eu estava tentando usar FBO pra facilitar minha vida e ganhar em performance. Mas por alguma razão o resultado ficou bem pior.

Devo estar fazendo alguma coisa errada :/

Enfim, novidades em breve.

Abraços,
Dalai

Inglês

The nice thing about the tests it’s that I did realize there are changes I need to do.

For example it will be handy to have a controller to adjust the size of the projection. A kind of a scale property.

Another thing it’s that I was concerned about the seams, but in the end you get so dizzy you can’t notice them :p

Well let’s see how does it end :)

Related Post:

Fisheye em aplicações interativas, jogos e planetários com Blender

Fisheye em aplicações interativas, jogos e planetários com Blender

13 de Janeiro de 2009 Dalai Felinto
Portuguese

Nossa faz tanto tempo que não escrevo, que fico até acanhado :) Então antes de mais nada, feliz 2009 !!!! e para não enferrujar de todo vou aproveitar aqui para compartilhar o meu mais recente trabalho.

Estou programando uma opção de câmera tipo olho de peixe (FishEye) para a Blender Game Engine.

Inglês

Hello all! This is the first post of 2009, and I hope you like it.

I still wanna talk about my plans for this year, and bla, bla, bla. Not today though.

For today I will talk about Fisheye cameras in Blender Game Engine. (cool!)

Fish Eye option in Blender

Português

O trabalho é para a Société des arts Technologiques de Montreal, Canada. Eles tem um desses domos, como se fosse um planetário, e querem usá-lo para apresentações arquitetônicas interativas.

O legal é que isso me aproxima de mais uma de minhas paixões que é a astronomia. Eu amo céus estrelados, de roça e de cidadezinhas de interior.

Por conta disso, sou fã de carteirinha do Planetário do Rio. Se você tiver a oportunidade não perca a chance de fazer uma visita lá. Eles oferecem cursos a preços bem acessíveis. Eu recomendo, especialmente o de identificação de estrelas e o de astrofotografia, nota dez.

Imagina se um dia o planetário resolve usar o Blender pra mostrar apresentações interativas? sonhar não custa nada :)

Enfim para quem quiser ler mais sobre a parte técnica do assunto, eu recomendo o excelente site do professor australiano Paul Bourke. Ele tem um extensivo trabalho nesta área de projeção em domos, e está me dando uma super força nesta parte do código.

E se você tiver usando o windows, eu botei uns arquivos online que você pode dar uma olhada:

English

I’m doing this work for the Société des arts Technologiques of Montreal, Canada. They have a dome (an horizontal hemisphere) and they want to use it to display interactive Architecture Visualization.

This is the same technology used in Planetariums.Therefore this is a very special opportunity for me. I always loved stars, planets, nebulas. Indeed I even have a favorite nebula, the M43 in the Orion Constelation.

I can even say I have a good background on that. In the planetarium of Rio de Janeiro, they offer some very-accessible courses related to the stars. I’m glad I did the Identification of Stars and Constellations and AstroPhotography.

Well, all of this just to say that I would love to implement or see implemented this solution in a planetarium :)

So on, if you want to have a deep read in the technicall aspects of generating these images, prepare your bookmark. Paul Bourke a very nice Australian professor, has an extensive material online explaining his techniques and classicall methods. He is helping me a lot to understand his code, math and methods.

If you wanna try the current work in progress I made a build for windows:

Links:

- Fisheye.zip [15MB] - o blender alterado versão pra windows
- ProjHabPop.blend [4MB] - arquivo antigo (de 2007 :p) - para mudar a câmera aperte X ou Z
- Matrix.blend [18MB] - outra cena de teste (generosamente cedida por Mike Pan).

Atualmente estou reescrevendo o código responsável pelo render dos frames. Com isto quero consertar o seguinte: I’m currently rewriting my whole renderpipeline. So there are some know non-supported features:
  • Multiple scenes (overlay, …)
  • Lighting and shadow
  • Multiple Viewport
  • non-fullscreen mode
  • World/sky color
E algumas outras funções que ainda quero implementar: And some features I still want to implement:
  • offset fisheye (globe 360º)
  • panquake mode 180º
  • panquake mode 360º
  • truncated fisheye
  • wrapped fisheye

Bônus

Tests ss15 gui Yo Frankie

É isso, não quis começar o ano com nenhum post muito técnico não, mas nada me impede de mais tarde voltar a escrever sobre este assunto.

Aproveitando a ocasião eu gostaria de deixar um obrigado especial para Amora, Camila e Michele. Por alguma mística razão, o Google mantém meu blog entre os primeiros quando se busca desenhos de moda.

Como eu gosto de vários assuntos (por mais que estilismo não seja um deles :p) eu fico mais do que contente de receber visitas tão diversas, e comentários tão carinhosos e construtivos como os que inesperadamente recebi delas.

Abraço a todos e a todas,

Dalai

(translation to that part: ‘Good bye, and thanks for all the fishes‘:)

2D Filters, GLSL e Custom Textures II - get it while it’s fresh

12 de Dezembro de 2008 Dalai Felinto
English

I had some more Blender coding late night hours and I decided that the custom texture patch was stable enough for tests and feedbacks. I still have to adjust part of the code, but I don’t want to spend so much time in that if this is not going to be implemented in Blender (in one way or another).

Therefore I compiled this patched “home-made” version of Blender and will need some positive return regarding how usefull this is. Can you see a good use for that? Can you produce some nice shaders with that which you couldn’t do before?

If the awnser is yes, please share your artwork and opinion and we can find the better way to do this. Technical code-wise comments are very-welcome as well.

Brasilês

Se você leu meu último post sabe o que ando tentando implementar ultimamente. Acontece que hoje eu terminei uma animação que estamos fazendo no serviço e resolvi comemorar dedicando um tempinho pra finalizar o Custom Textures para os filtros 2D.

Se você quiser testar é só abaixar a versão compilada abaixo e se divertir. Se você gostaria de ver isto implementado nas versões oficiais do Blender tem uma coisa muito simples que pode ajudar bastante. Eu preciso saber se mais acha isto útil, e se possível saber em que shaders seria interessante usar este recurso. Pode enviar imagens, idéias ou simplesmente dizer se acha isso relevante ou não.

Sempre às ordens e aproveite :)

Splash Screen 2dFilters patch

Links:

How to use it:

* Select your image using Actuator->2DFilter->Uniform Texture (temporarily the texture most be applied to any object in your scene - the object don’t need to be in a visible layer though)

* Choice the name you want to use in your shader (remember: you can’t use names starting with gl_)

* Enable your custom filter as usual - Actuator->2DFiter->Custom Filter

* In your shader, acess your texture using sampler2d your_texture_name;

Tip: If can use the built-in VideoTexture to change your initial texture and it will be updated in your shader as well.

Thanks for the Blender developers that patiently have been helping in my coder-to-be journey :)
(Campbell, Jester, Benoit, thank you dudes !)

Como usar:

* Selecione sua imagem através de Actuator->2DFilter->Uniform Texture (por enquanto a imagem selecionada tem que já estar na cena aplicada em algum objeto - mas se quiser pode botar o objeto num layer invisível)

* Escolha o nome que você quer usar no seu filtro (lembrando: não é possível usar nomes que comecem com gl_)

* Ative seu Custom Filter como de costume - Actuator->2DFiter->Custom Filter

* E dentro do código do seu shader acesse sua textura usando uniform sampler2D nome_da_sua_textura;

É isso. Espero que vocês abusem e usem C&A :)

Até breve …

Dalai Felinto

Blender Conference 2008, here I go

20 de Outubro de 2008 Dalai Felinto
Português
A Blender Conference não é o Rock’n Rio mas EU VOU :D

E o mais legal é que estou indo apresentar o trabalho que desenvolvemos em Vancouver.
Se você quiser acompanhar a minha apresentação será 25/10 9:30 da manhã.

Ainda não sei qual será o link para as transmissões das palestras, workshops e apresentações, mas no mais tardar na sexta eu posto aqui o endereço.

Quem quiser ver a programação completa pode conferir no site da Blender Fundation.

Vou tentar fazer uma cobertura do evento aqui no Blog. Se eu não conseguir atualizar diariamente, vou tentar pelo menos escrever nas semanas seguintes à conferência.

Portanto aguarde fotos, fatos e files :)

Grande abraço,
Dalai

PS.: Esta é a terceira tentativa para achar o melhor formato de post bi-língüe. No fundo acho que sempre vai depender do conteúdo do post. Mas se estiver ficando ruim de ler, please let me know ;)

English
Amsterdam rocks !

It’s funny that when i decided to travel this year, Netherlands was my first option.I though it would be easier to find a Blender related internship in its hometown.

However I changed my mind after realize a few things: they don’t speak English as a first language in Netherlands, living in Euro is way too expensive and they don’t have so many studios working with Blender over there.

In the end I come to Canada, where I got a summer intern job with Blender at UBC (Vancouver).

Go big or go home

Ironically, the job in Vancouver was the one that opened a door for me to go to Europe.

In the end of the summer we submitted a presentation proposal to the Blender Conference.
And as you can see in the incredible schedule, we are in :)

I will try to document the conference as much as I can.

Cheers,
Dalai

BlenderConference

De Waag, foto por Pablo Vazquez (venomGFX)

Eu fiz alguma besteira que perdi o post. Bom estou botando no ar de novo :)

A apresentação acabou a pouco e foi super bacana. Tivemos um problema que eu explico depois :) Mas no final acho que deu tudo certo.

Blender Workshop @UBC - step-by-step

12 de Outubro de 2008 Dalai Felinto

/* versão em português */
What do you need to organize a workshop?

Well, last August we had one at UBC, and this is what this post is about.
The main idea was to use it as a conclusion activity to our summer tasks. It also would be a good opportunity to give something back to the community since we have received so much from them.

Mike Pan and I did a general call to Blender users of the west coast of North America (ok, Vancouver and Seattle). The meeting was intended to be a friendly talk about Blender, Blender Game Engine, and the project itself.

SCHEDULE OF EVENTS:

09:30 - 10:00 Reception
10:00 - 10:30 Discovering Blender: An Introduction to Blender
10:30 - 11:00 Blender as a visualization tool for Fisheries Center
11:00 - 12:30 Lab: Your first game
12:30 - 01:00 Lunch
01:00 - 03:00 Lab: Materials and lighting in games
03:00 - 04:30 Lab: Physics, Python and Shaders
04:30 - 05:00 Basic optimization for realtime application
05:00 - 05:30 Closing

More then twenty people showed up. If you take a look at the schedule you can see that we tried to use the whole time. However, as the most import thing is the people being together, we had a few breaks to intended socialization.


Read the rest of this entry »

Blender Workshop @UBC - passo-a-passo

8 de Outubro de 2008 Dalai Felinto

/* English version */

O que que se precisa para se organizar um seminário?

Bom, em agosto organizamos um workshop na UBC.
A idéia era que isto servisse com um desfecho de nossas atividades de verão e uma forma do projeto retribuir o tanto que tem recebido da comunidade de Blender.

Eu disse verão? Pois é meus amigos, minhas aventuras pelo hemisfério norte continuam. E por mais que esteja devendo um artigo completo sobre o que que rolou em Vancouver, acredito que de post em post vai ficando mais claro.

Eu e Mike encaramos o desafio de chamar os usuários de Blender nas cercanias, para falarmos de Blender, Blender Game Engine e falar sobre o projeto.

PROGRAMAÇÃO DO EVENTO:

09:30 - 10:00 Recepção
10:00 - 10:30 Descobrindo Blender: Uma Introdução ao Blender
10:30 - 11:00 Blender como uma ferramenta de visualizão para o Fisheries Center
11:00 - 12:30 Lab: O seu primeiro jogo
12:30 - 01:00 Almoço
01:00 - 03:00 Lab: Materiais e iluminação para jogos
03:00 - 04:30 Lab: Física, Python e Shaders
04:30 - 05:00 Otimizações básicas para aplicações em tempo-real
05:00 - 05:30 Encerramento

Mais de vinte pessoas compareceram, e pela programação acima dá pra ver que tentamos aproveitar o tempo ao máximo. Sendo este o primeiro evento da costa oeste canadense, fizemos questão também de reservar um bom espaço para as pessoas se conhecerem.

Descobrindo Blender: Uma Introdução ao Blender

Bom, o dia começou com uma exibição do Big Buck Bunny. Para quem não conhece este é um curta realizado por uma equipe de nove artistas e desenvolvedores para promover o uso do programa 3D Blender e aprimorar algumas de suas ferramentas diante de demandas provenientes de uma produção real.

Big Buck Bunny

Além disso compilamos uma série de vídeos mostrando do que a Game Engine do Blender é capaz. Para isso procuramos enfatizar usos outros que a produção de jogos em sim.

Para quem quiser uma lista do material lá vai:
Boom Demo(Endi), Club Silo(Luma Labs), DukDuk!(Glenn Melenhorst), Yo Frankie! (Apricot team), Jogo da Coleta (Diego Rangel), Passeio Arquitetônico (Cícero Moraes). Além dos demos que o Mike disponibiliza no site dele, e o meu antigo Passeio Virtual Urbano.

A nossa idéia era mostrar o amplo leque de possibilidades que o Blender nos oferece. Não só como uma ferramenta para jogos e filmes, mas para qualquer tipo de visualização que precise do computador (em especial visualizações interativas, que era o foco do nosso encontro).

Mike Pan

Blender como uma ferramenta de visualização para o Fisheries Center

Este projeto começou no início de 2007 como uma parceria entre o Fisheries Center da University of British Columbia e o Masters of Digital Media Program. O objetivo do projeto é aliar informação científica de qualidade com tecnologia de ponta.

O Fisheries Center desenvolve um software chamado EcoSim. Simplicando bastante, este é um programa que te permite prever a quantidade de peixes e outras formas de vida marinha de acordo com a informação que é passada para ele. No caso, a entrada de dados corresponde a políticas do setor pesqueiro, e informações da região.

Com isso, o EcoSim é uma ferramenta de suporte à políticos e representantes do setor. Sem muitas dificuldades você altera alguma informação importante (a temporada de pesca do salmão, por exemplo) e consegue ter uma estimativa das possíveis consequências.

Para produzir um resultado mais fácil de ser apreciado, o Blender está sendo utilizado para produzir visualizações em tempo-real, de como ficaria determinada parte do oceano. O que vale é o efeito comparativo, então para cada região temos um cenário correspondente a bacia, populado com as espécies proporcionalmente de acordo com a informação passada pelo EcoSim.

O EcoPath roda como um servidor de dados, se comunicando com o Blender através de um cliente .NET .
O Blender se valendo de scripts em Python, recebe os dados do servidor e produz a visualização.

Simples não :D

Enfim, mostramos os arquivos, os scripts, explicamos como tudo isso funciona junto, e como era nosso método de trabalho.
Mostramos também o arquivo rodando dentro do Blender e um vídeo mostrando uma espécie de making-off (caso o arquivo desse errado :p).

Dentro dos tópicos mais avançados falamos de:

- GLSL shaders para animação dos peixes (com uma performance 10x superior do que por armaduras tradicionais). [1].[2]

- AI: inteligência artificial com python (boundary, flock behavior, predatorial). [1].[2].[3]

- UI: Criação de uma interface (menus) e interação com o usuário. [1].[2]

Lab: Materiais e iluminação para jogos e Lab: Física, Python e Shaders

Para esta sessão, resolvemos fazer uma atividade prática. Queriamos demonstrar o uso de interações física na Game Engine, e explicar algumas configurações gerais.

Acabou que o workshop foi um dia depois do lançamento do Blender 2.47. Te confesso que me senti um pouco culpado depois de fazer mais de 20 downloads do site oficial, mas enfim, estávamos todos equipados com o que de melhor o Blender tinha a nos oferecer.

Quem quiser dar uma conferida no arquivo que utilizamos como base para o jogo está aqui:
Boliche.blend

É um jogo simples de boliche. Como o tempo que dispunhamos não era tão generoso, ficamos trabalhando em cima deste arquivo, configurando, alterando, explorando, personalizando.

No final atendendo a pedidos entramos um pouco em programação de scripts para a Game Engine.

Otimizações básicas para aplicações em tempo-real

Por fim, depois de amacear a carne chegamos no último ponto do workshop.

Falamos de algumas técnicas básicas para produção de jogos, ilustrando elas com slides e relacionando elas ao projeto.

Alguns dos tópicos abordados foram:

- display list: aumento de performance em placas de vídeo atuais.
- textures power of 2: texturas múltiplas de potências de 2 (256, 512, 1024, …)
- low-poly modelling: redução / otimização do número de polígonos dos objetos
- baking - utilizando texturas para simular sombras e detalhes
- debugging and bottlenecks: como identificar e solucionar problemas com o Blender e a Game Engine

Encerramento:

Chegamos no final do dia cansados, mas completamente realizados. A participação dos presentes, e o grau de entuasiasmo de todos fez com que não tivessemos dúvida da importância deste tipo de evento para empolgar e conectar as pessoas.

Se trabalhar com o Blender já é bom, saber que tem gente por perto no mesmo caminho que você é melhor ainda.

Eu quero que mais e mais encontros como este venham a se realizar. Se é no Canadá, no Brasil ou na Holanda, para mim tanto faz. Contanto que eu esteja por perto está valendo.

Claro que não é das tarefas mais simples organizar este tipo de evento. Mas espero que estas palavras estimulem e auxiliem quem delas se valher ;)

Um grande abraço,
Dalai

Links relacionados:

http://www.blendernation.com/2008/08/20/blender-workshop-in-vancouver-bc-august-24/
http://www.blendernation.com/2008/08/28/blender-vancouver-workshop-photos/

Caranguejo não é peixe

19 de Julho de 2008 Dalai Felinto

caranguejo peixe é,
caranguejo só é peixe lá no fundo da maré.

Pois é meus amigos existe mais sabedoria nesta antiga cantiga de ninar do que a gente imagina.
Eu digo isso porque passei boa parte da última semana pesquisando vídeos de caranguejo no YouTube e preparando algumas animações para o trabalho.

Você sabia que além de andar de lado, o caranguejo é super veloz embaixo d’água?

Bom, parte da graça de se animar um caranguejo é fazê-lo acompanhar as deformações do terreno, de modo que pareça que ele realmente está caminhando sobre a areia.

Está com pressa? Quer ver o resultado logo? Então dá uma olhada:


Holy Crab from Dalai Felinto on Vimeo.

Como o projeto vai ser animado dentro da GameEngine do Blender, a melhor maneira de se controlar a posição do caranguejo é com a novíssima função obj.alignAxisToVect().Esta função foi implementada no Blender em Junho, aprimorada em Julho e atualmente só está presente nas versões de desenvolvimento do Blender.

Agora só precisamos de um sensor do tipo Ray ligado ao nosso caranguejo, e com este sensor vamos ativar o nosso código:

import GameLogic as G
cont = G.getCurrentController()
own = cont.getOwner()
loc = own.getPosition()
ray = cont.getSensors()[0]

hitLoc = ray.getHitPosition()
hitNorm = ray.getHitNormal()

loc[2] = hitLoc[2] + 0.01
own.setPosition(loc)

try: # pra evitar conflito com versões antigas do Blender
own.alignAxisToVect(hitNorm, 2, 0.5)

except:
pass

Se você já está se familiarizando com Python, vai ver que o script não tem nada de mais. Se você não entendeu o script mas conseguiu fazê-lo funcionar, parabéns :). Se você não entendeu nada e não sabe o que está fazendo nesta página, reclame com quem te trouxe aqui :D

Acho que é isso que tinha pra falar.
Espero que tenham gostado (eu gostei ;) )

Um grande abraço,
Dalai Felinto (dfelinto)

Algumas pérolas do YouTube no quesito caranguejo:

Um é bom, dois é demais

9 de Julho de 2008 Dalai Felinto

Rapaz, não é que estou gostando dessa história de mexer no código do Blender :)

Isso me lembra os tempos do Civilization I, quando eu ficava alterando a história que aparecia no início do jogo junto com meu irmão. Na época os arquivos com a história eram arquivos comuns de texto, e bastava um pouco de curiosidade pra fuçar os arquivos e um tanto de criatividade para se divertir.

Hoje em dia o mais próximo que eu vejo deste tipo de personalização são definitivamente os programas de código aberto. O Blender é um deles, e por conta disso todo o seu código fonte se encontra disponível na internet para se estudar, modificar e redistribuir.

Eu já ouvi que na prática isto não é tão vantajoso, pois afinal não são tantas as pessoas que tem conhecimento suficiente pra lidar com programação. Eu particulamente não acredito nisso. Algumas vezes mesmo se você não tiver condições de resolver o problema, dar uma espiada no código ajuda ao menos a elucidá-lo.

Quer um exemplo?

Hoje na UBC, estávamos tentando mais uma vez solucionar um problema no projeto. Parte da dinâmica da visualização do fundo do mar está no nado dos cardumes. É muito rico visualmente ver os peixes se aglomerando e nadando em harmonia.

Para fazer isso em Blender, precisávamos de um peixe líder, e para fazer o cardume seguir o líder, o Mike escreveu um script bem bacana para controlar o que chamamos de AI (inteligência artificial). Para simplificar o processo, resolvemos que seria melhor se usássemos um recurso do Blender chamado TrackTo (Actuator->Edit Object->TrackTo).Pois bem, tudo parecia estar funcionando perfeitamente, mas reparamos que quando os peixes alcançavam o líder, eles começavam a nadar rumo ao infinito azul formando uma linda parede de peixes.

wall of fish

Puxa vida e agora ? ? ?

Read the rest of this entry »