Este blog esta em reforma no momento.

Me sinto muito feliz hoje!

Na verdade isto que lhes conto ocorreu na terça e não nesta quinta.

Mas chegando em casa e lendo minhas mensagens no DeviantArt eis que encontro isto:
De imediato, senti que era um fake, mas olhei a comunidade e o seu co-fundador é Martin Renold, o desenvolvedor do projeto MyPaint!
Entrei na galeria, e meu desenho até que se encontra junto à umas boas obras.
Ele ficou poucos dias aparecendo na capa, mas ja deu pra animar bastante.

Um detalhe sobre naught101 o fundador do grupo, olhando seu blog pessoal eco101 e seus intereses políticos, me lembrou de imediato um grande amigo, o Mateus com seu blog Somos Carbono, os conteúdos muito se parecem.

Galeria do MyPaint.deviantart.com.

Linkagem gratuita a parte, me lembra muito daquela teoria de que mentes com pensamentos similares se atraem, é mais coerente essa ideia doque coincidências. Acho que se eu jogar um mapa mental com o XMind e agrupar os elementos em comum no grafo devo ter uma surpresa.
Curioso como coisas tão despretenciosas acabam chamando atenção.

E no Mundo off-line
Outra coisa de impacto em minhas realizações profissionais, é ter sido aceito em duas firmas este mes, oque me deu a oportunidade de escolher o melhor caminho (assim espero).
Apesar de ter um pouco mais de grana, ja estou sentindo saudades dos companheiros de equipe de onde eu estava trabalhando. Pois foi um lugar que encontrei pessoas muito legais. Eu nem sairia de la, fosse questões salariais.
A galera la ainda vai receber sua homenagem ^_~

Mas vamos ver noque o tempo se transforma...

Mais alguns progressos Aracte e Hell Lizzard

Semana insana e a próxima sera mais ainda, mas....
Hell Lizzard

SIm, eu não sei escrever Lizzard direito, não sei se é com um Z ou dois  (so me toquei desse detalhe depois de upar pro Youtube).
Bom, de qualquer forma ta ai, alguem se lembra do rascunho que começei semanas atraz? Esta manha sentei e puchei mais poligonos. Ficou com 1.200 e pouco.

Aracne SD Ilustração 2
Gente, essa drider ja foi favoritada 5 vezes no DeviantArt, sem fazer qualquer propaganda dela.
Intaum to fazendo outra ilustração caprichada dela.

Caldeirão da Bruxa
Nossa, editando esta imagem me deu un "dejavu" muito estranho.
 Veja online aqui.

To fazendo o oclusion map na unha mesmo.
E descobri uma coisa, o sistema de "path" (trilho) para a camera é beeeem complicado de se acertar. E programacionalmente falando é mais fácil desenvolver usando paths bezier de 3 ou 4 pontos doque nurbs curves. O Away3D usa paths de 3 pontos, oque me da um "puta" trabalho para tirar os dados do Blender que usa paths de 4 pontos (que são os que eu irei usar no meu sistema de camera do jogo).
Mini tuto de Path na Away3D
import away3d.animators.PathAnimator;
import away3d.animators.data.Path;

private var camPath:Path;
private var camPathAnimator:PathAnimator;
private var time:Number = 0;

var aPath:Array = [
 new Number3D(-433.7,315.5,-109.0),
 new Number3D(-266.1,225.2,-416.4),
 new Number3D( 467.9,071.0,-226.6),
 
 new Number3D(467.9,071.0,-226.6),
 new Number3D(582.3,170.2,-178.0),
 new Number3D(426.6,145.4,388.6)
];
   
camPath = new Path(aPath);
  
var init:Object = { duration:1000,
  lookat:null,
  aligntopath:true,
  targetobject:null,
  offset:new Number3D(0,0,0),
  rotations:null,
  fps:24,
  easein:false ,
  easeout:false
};
camPathAnimator = new PathAnimator(camPath, view.camera, init);

//No enter frame
time = (time +0.01>1)? 0 : time+0.01;
camPathAnimator.update(time);
Baseado no tutorial da Away3D

Flex PixelBender Zend RPG MD2 Away3D Correria Café Cerveja TUDO JUNTO AGORA


Essa semana foi atipica, não parei, corri de um lado pra outro, fui pra São Paulo e voltei correndo, levei trabalho pra casa, to no meu hobby, relembrei Flex, aprendi Pixel Bender, levei a Clarice pra vacinar e aqui estou postando e também preparando meu post de amanha na RPG Vale.

Como devem ter notado na imagem acima estou fazendo umas coisinhas um pouco mais nervosas com flash. Pensei em montar um hotsite em 3D dessa vez, por issu este modele com cara de Budy Pocket... alias confesso que ficou bem podrão mesmo. Talvez se eu organizar o esqueleto direito consiga usar ele para os testes de colizão no terreno do jogo.

Irei inserir mais frames nesta animação, o arquivo MD2 ficou com incríveis 36Kb com 12 frames! Então acho que irei arriscar uns 30.
Uma dica excelente que achei na internet, é a respeito da lista de animações do MD2, você pode criar um arquivo separado definindo os quadro chaves. O formato pede que a primeira linha identifique o arquivo, o resto é uma string e o numero total de frames da animação.
Fica itegralmente assim:

# MD2 Frame Name List
stand 11
run 0
attack 0
pain0 0
pain2 0
pain3 0
jump 0
flip 0
salute 0
taunt 0
wave 0
point 0
crstnd 0
crwalk 0
crattack 0
crpain 0
crdeath 0
death0 0
death2 0
death3 0

Eu tentei mudar o nome das animações, mas começou a dar pau com o Blender 2.49a. Então larguei mão e só zerei a quantidade de quadros. Deu certinho.

Away3D suporta animação por bones dentro do Collada, mas os tutoriais de MD2 etão mais à mão, mas é bom saber que ela tem esse recurso muito mais avançado.
Este foi um dos motivos da escolha da Away3D, ela incorpora muitos recursos que a Papervision3D demora para incorporar. Apesar das ultimas informações que tive dela ela consumir o dobro de RAM que a Papervision, mas isso faz bastante tempo, qualquer duvida procurem alguma analize mais atual.

A pintura foi toda feita no inkscape, achei mais pratico usar um software vetoria, pois um espaço pequeno de 256x256 pixels é complicado de trabalhar.

Uma coisa interesante durante o processo, o png com transparência foi renderizado perfeitamente na away3d. Deu até uma ideia de fazer uma mágia de invisibilidade pra deixar Cibele assim, com os olinhos aparecendo pra dar aparência daquele desenho do PacMan que quando ele comia o fantasma so saiam os olinhos flutuando em bora.

Outra coisa legal é o Pixel Blender, esse recurso é fabuloso. Rodar shaders apartir do player do flash é um recurso extupidamente poderoso. Tem gente estudando o recurso inclusive para manipulação de dados!
Eu tirei este shader lindo de raios de luz deste site (kode80.com), e pretendo usar esse mesmo shader de light-scatering na faze inicial do jogo. A luz atravessando as arvores vai dar uma visão chocante. E é um shader bem simples, me expantei ao analiza-lo.
Pena que rodando no flashplayer o pixelbender, so trabalha na fase processo pixel, o pre-calculo de vertice e matrizes é todo via AS3, mas mesmo assim o resultado é rápido (veja o site dos caras)!!!

Pra quem não conhece pixelbender é o novo recurso adicionado ao player do flash, onde o swf carrega um código pré-compilado em linguagem de maquina, que roda direto no processador da placa de video. O PixelBender é baseado na GLSL que o torna bastante compativel e portavel.

O modelo foi criado com um numero extreamente reduzido de poligos, mesmo porque irei caprichar no cenário. Por sorte o shader não se atrapalha com a transparência.
Outra coisa que irei fazer é adicionar uma segunda layer de render para renderizar o chão com sombras e o horizonte.
Depois irei usar o recurso de paths da Away3D para fazer a camera acompanhar um caminho fixo ao mover o mouse pela cena, oque dara uma visão de angulos muito superior. Esse processo sera usado no game final também.
Irei jogar um pequeno sistema de particulas para fazer a fumaça, tentei fazer com pixelbender, usando outro código da net, mas não mesclou corretamente.
Bom, o objetivo é copiar uma cena como esta:
Creio que vocês não devem ter reparado no background... mas ele esta ali, é so olhar pra esquerda e direita da figura centra. Sei que é dificil :P
Bom, uma vegetação como essa deve ficar excelente na cena.

Os links irão estar flutuando no ar ao longo do path.

Parte 2
Bom, pra não dizer que aproveitem bem meu tempo... inventei de aprimorar o software de visualização 3d dos personagens. Dando um acabamento profissional.

Infelizmente issu acaba implicando em atenção a inumeros e inumeros detalhes que agente nunca repara de inicio. Oque deveria durar uma manhã, comeu o sabado inteiro e parte da manhã de domingo.

Mas ficou legal. Agora você pode inserir comentários, e há uma conexão com o Gravatar, um serviço universal de avatar. Basta digitar ser e-mail e ter um cadastro simples no Gravatar e pronto.
Poderia ter usado o OpenId, pois o Zend tem essas facilidades, mas fiquei com preguiça.
Estou satisfeito com o Zend, apesar de seu vasto tamanho, ele tem recursos na proporção dos seus Megabytes.
Este código no controller transforma a saída em RSS 2.0, simples, e padronizado. Assim além de poder usar ele na aplicação eu posso aproveitar os dados em qualquer outro lugar, inclusive agregadores de feed ^_~
public function indexAction()
    {
 $page = $this->getRequest()->getParam('page',false);//'www.8arte.net/wwpvisualizador';
        $this->view->rss = $this->formatRSS( $page );
    }
    
    protected function formatRSS($dt,$title=false)
    {
     $config = Zend_Registry::get('config');
     $base = $config->rss->base;
     if(!$title) $title = $config->rss->title;
     
     $ens = array();
     $pageNome = 'www.8arte.net';
  foreach( $this->comentarios->listComments($dt) as $com )
        {
         array_push( $ens,
    array(
     'title'   => 'Comentário de '.$com['nome'],
     'author'  => $com['nome'],
     'link'   => 'http://'.$com['pagina_nome'].'/',
     'description' => $com['coment']//$this->formatDescription($com['nome'],$com['web'],$com['coment'])
    )
         );
         $pageNome = $com['pagina_nome'];
  }
  $rss = array(
   'title'  => $pageNome,
   'link'  => "http://$pageNome/",
   'charset' => 'UTF-8',
   'entries' => $ens,
   'author' => 'Marcos Augusto Bitetti (marcosbitetti@gmail.com)',
   'category' => "Comentários",
   'image'  => 'http://www.8arte.net/media/img/rss/rss_wild.jpg'
  );
     
  $feed = Zend_Feed::importArray($rss, 'rss');
  
  return  $feed->saveXML();
    }

O Adobe Flex é muito rápido pra produzir aplicativo... infelizmente pra mim, não ajuda muito, eu acabo perdendo tempo incrementando mais recursos. Mas vale a pena.
private function addComents():void {
    coment_list.removeAllChildren();

    var ld:URLLoader = new URLLoader();
    ld.addEventListener( Event.COMPLETE, addCommentsData);
    ld.load( new URLRequest("http://www.8arte.net/comments/wwpvisualizador") );
   }

   private function addCommentsData( e:Event ):void {
    var ld:URLLoader = e.target as URLLoader;

    var com:Array = new Array();
    //adiciona comentario principal
    var t:TextArea = new TextArea();
    t.percentWidth = 100;
    t.height = 85;
    t.wordWrap = true;
    t.editable = false;
    t.htmlText = '<img align="left" alt="gravatar" height="80" hspace="2" src="http://www.gravatar.com/avatar/aa6003be4294547ab18571dfca3e4522.png" vspace="0" width="80" />Bitetti (autor) Implementação de visualização de personagens do jogo Wild Witch Project.'+
       'Utilizando Adobe Flex 4.0, Zend Framework e Flash Develop.'+
       'Modelos 3D produzidos no Blender, texturas no Gimp, Inkscape e ArtRage2 (licenciado).'+
       'Wild Witch Project sob licenca Creative Commons 3.0 - uso não comercial, atribuição e não derivação.';
    coment_list.addChild(t);
    
    //parse RSS
    var feed:RSS20 = new RSS20();
    feed.parse( ld.data as String );
    ld = null;
    System.gc();
    
    for each( var i:Item20 in feed.items) {
     t = new TextArea();
     t.percentWidth = 100;
     t.height = 85;
     t.wordWrap = true;
     t.editable = false;
     t.htmlText = i.description;
     coment_list.addChild(t);
    }
   }
Este código lê o RSS gerado no Zend e insere os elementos TextArea para cada entrada. Tudo simples, usando as xml syndication lib disponível no google code.
Foi uma boa relembrada de Flex.

Bom, vou voutar à minha correria

Cibele vs Pedobear, uma batalha trash

Nada como não pensar em programação numa manhã de domingo.
Quem quizer comparar com o traço inicial é so ir neste post.

Flickr www.flickr.com/photos/bitetti/4413075605/
DeviantArt http://bit.ly/cWVyTf

Saldo de 2009 - Projeto em baixa

 Triste constatar, mas o progresso esta lento.

Arquivos mestres (blender, png, xcf, svg, audio...)
2672 arquivos - 5.5GB

Total de todos os arquivos sem discriminação (incluindo screenshots, suporte, libs, marketing, docs e lixo)
5288 arquivos - 6.0GB

Média de 400MB por personagem (sculpt com res 5 acima para normalmap)

Código da primeira versão (study):
C++ 2729 linhas (incluindo comentários* e arquivos de cabeçalho)
Lua 1037 linhas (incluindo comentários*)
* eu comento pra caramba!


Periodo de permanencia num contexto (paro um pouco, mecho em outro, depois volto...)
1 semana


progresso dos personagens (%)
CharConceptMalhaAnimaçãoTexturaScript*Audio
Cibele10000000
Aracne1001001000-
Coisa Ruim1000000-
Fada Lime100100300-
Loira do Banheiro900000-
Harpia00000-
Trolls900000-
Gil Gasaper600000-
Velhão500000-
Preto Velho Tarado800000-
Neaderstalore600000-
Monstro do Armário100100000-
Nesgóico100100000-
Crendeuspaldo1000000-
Firefox10010000
(normalmap)
0-
Nerd das Montanhas1000


-
Winderfall10010001000-
Mortos-vivos100100000-
Guarda-chuva100100000-
* - Lua script

Constatação
O cronograma ter explodido até que não foi surpresa, este projeto tomou altas expectativas tanto minhas quanto de quem acompanha.
No começo eu mantive a cota de uma malha por semana. Mas aí vierão os problemas, stress, mulherada enrolada (muito mais stress), desafios no trabalho (stress pra kraio) e por fim meu ritmo de sono que nunca foi constante pirou de vez (hora de ir pro clube da tarja preta). Hoje mesmo enquanto escreve estou sob uma forte dor de cabeça, à espera do efeito do analgésico.

 Concluindo
Mas olhando bem e refletindo ainda tem um porém de esperança: isto foi o start e todo projeto intelectual curva exponencial como a natureza do próprio conhecimento.Enquanto o tempo passa e eu desenvolvo material solido a tecnologia fica cada vez melhor. E ja tenho por exemplo, um esquema de rig pronto pra todos os personagens.

Um retorno à arte


Depois de uma semana me preocupando com threads fico no fim de semana com a parte artística do negocio XP
Mais alguns elementos. Esta render vai ser usada na intro do game, onde ela vai aparecer desenhada no spell book de Cibele (este post).

Acompanhem o making of
O primeiro passo é gerar um shader apartir do algoritmo Toon existente no Blender.
Depois criar Render Layers separando alguns elementos. O principal separa a cor specular, a difussa e o alpha map da cena e um segundo com as edges (linhas). Os Render Layers também podem conter geometrias distintas.
Agora é a dor de cabeça, o Node Editor é uma excelente ferramente, pesar de pouco intuitiva, pra aprender tive que observar muito totorial e exemplos.
Basicamente ela dá um controle do pipeline do render final, aplicando filtros em elementos separadamente, fazendo assim a parte de pos-produção.
Na verdade transformo toda a luz em máscaras!
O truque agora é montar uma textura para cada elemento de cor, assim ao invéz de colorir normalmente utilizo um padráo de reticula.
Detalhe que também apliquei nodes ao traço (edge) para dar-lhe alguns borrões.
Eu sei que o sistema de nodes aplicado no material deveria se encarregar disso tao bem ou até melhor doque a forma que estou fazendo, mas sinceramente, ele é bem amplo também e quero ver algum resultado ainda este sabado.

Depois com ajuda do Blender mesmo criei uns padrões de hachuras, todo o desenho é manual pra passar essa impressão depois no render.

Criei uma cena simples pra teste, usando o script Curves to Mesh do Blender, pra gerar troncos bem orgânios, depois ao ivéz de usar malha comum usei meta-balls para fazer as copas das arvores, assim tenho uma geometria dinâmica e que para favorecer o efeito cartoon ao se aproximarem gerarão um bloco único.

Fadinha e Robo dos Anos 80

Mais uma madrugada de insonia.
Confesso, eu adorava esse robozinho também. Esteticamente ele é muito bem elaborado.
Os pés dele é que são "meia-boca" na hora de modelar o bicho terei que fazer algo diferente do modelo.
Pintado vai ficar muito legal o desenho.
Agora o sono voutou e espero pela manha ter pique para retornar no sistema de threading do jogo, pois resolvi dar uma redesenhada nele.

Infância 80 ataca novamente

 
Limpando o quarto me deparo com algumas peças raras, de décadas imemoriais e calidas.
Este robo era bem louco, com o peito cheio de luzes coloridas. Talvez tenha sobrevivido pelo fato das pilhas quase sempre durarem pouco, ai eu ficava olhando pra cara do robo parado no canto e saia pra brincar com outra coisa. Com certeza ele foi ligado poucas vezes até as lampadas queimarem, ai ficou de estatua mesmo.
Eu não queria usar uma sobrecarga de normal-maps neste modelo, mas terei quer usar. Como o normalmap não funciona sem o smooth das normais a malha tera que ter muito split, pra deixar algumas arestas bem nitidas.

Outras vitimas que selecionei:
Bambô, éh! Este sobreviveu com poucos arranhoes, e talvez eu não ache mais a antena ~_~
Este era bem louco, andava de um lado pro outro parava e lia um mapinha que carregava. Acho que oque eu mais gostava dele era o fato de ter garras que serviam pra algo mais doque decoração.

Voltando um pouco pro técnico

A ideia é simples, seguindo a linha de updates on-line, o jogo ao conectar verifica se há alguma atualização e da a opção de rodar este aplicativo.
Claro, tanto posso usa-lo ou não, a vantagem é que uma aplicação menor não atrapalha o usuário e em alguns casos pode ser melhor para sobrescrever arquivos (se eu estiver com o ambiente da OGRE rodando pode não ser possivel fazer o update de uma dll por exemplo).

Outra utilidade do teste é que agora posso obter leitura de qualquer endereço de internet que precisar. Muito pratico.

Nossa, fazia tempo que eu não mechia com certos elementos de C++, estava muito concentrado no problema das threads e na produção de media.
Peguei uma tarde  uma madrugada e uma manha pra relembrar certas coisas.

Descobri que a velha FLTK agora esta na versão 2!


Eu estava verificando alternativas de comunicação com servidores, e me sugeriram umas bibliotecas de Sockets, que eu não descartei, mas para o fim que esse teste se destina usei o CURL. Muito boa e simples.
Eu usei bastante a FLTK no ambiente Windows, espero conseguir usar ela de boa, pois na época o DevCpp era uma praticidade em pessoa pra instalar as coisas.
Eu sei que ainda vou ralar, mas aprendi a duras e duras penas a configurar o Eclipse pra funcionar direito. O proximo passo agora é fazer ele funcionar direito no Vista... e no futuro Leopard (ou eu virtualizo esse sistema do mau direito ou arisco a comprar um macbook, já q o iPad é um lixão)

Issu que dá não ter onde ir no Carnaval

Eu até hoje não postei como fica meu ambiente de trabalho durante o "fervo".
Bom, ta ai, são 6 áreas de trabalho, separo elas por tema e já nem uso mais o cubo.

Loira do Banheiro - caracter design 02

Loira do Banheiro - Blond Ghost - Sketch 02 - Wild Witch Project
Acho que assim melhorou bastante des-de a primeira ves que apresentei a personagem.
O estilite me veio a cabeça esses dias, eu já tinha a ideia de usar um estilete, é uma das armas que mais me deixa nervoso: compacta, ocultavel e corta pra cassete!!!
Mas quando vi este desenho da Geninha feito por um fã que não pude identificar resolvi brincar com as escalas:
Isto também me lembra a cena da luta final de Asuka em The End of Evangelion, onde ela pega uma lança parecida com issu e sai regaçando numa das cenas mais animais dos animes dos anos 90!
Curiosidade: The End of Evangelion foi um dos ultimos filmes que foi usado o software Lightwave na criação de efeitos e ambientes. Hoje ele praticamente foi subistituido pelo Blender.

Madrugada de tablet

Cibele vs Pedobear
Um pouco de insonia.

Referências, esboços, café, coisas and coisas

Quase meio dia, uma crise mortal de rinite e eu ainda nem começei a passar o aspirador de pó na bancada ou jogar água-sanitária na cozinha... preciso de uma diarista ~_~
To com um post no GDocs quase pronto sobre a nova estratégia de marketíngue mas vamos começar o dia bunitinho.
Referências:
Esses são caras são o regaço do panteão olimpico dos filmes de ação, humilha até as cenas de ação do Avatar:

Eu tenho que por esta camiseta no iventário! Tenho tenho tenho
Rascunhos (sketches)
Bom, segue-se um rascunho que fiz esta manha.
As sacerdotisas da Lua são um potêncial inimigo, Cibele tem que invadir o templo e recuperar um artefato.
Não dispenso as sainhas, todas são homenagem discarada ao anime Sailor Moon.
Referências:
Nem todos os insetos são dotados de beleza, mas todos são realmente muito legais!
Categoria Nada a Ver com o Game :P
Juliete, minha ramster, ja esta comigo a 2 anos. Sim esta aqui des-de que o projeto começou, é uma hilander!
 
Clarice me chegou aqui miando numa noite dessas. Falei pra ela, se quizer entrar tu entra. Fiz um café e deilhe um pouco d'água. No dia seguinte ela ainda não tinha partido, ai fui no supermercado compra comida pra gato.
Eu sempre preferi mil vezes os cachorros, mas chegada assim do nada, não contrario certas coisas do destino.
Ha! Clarice é a razão pra'quele grilo estar com uma antena quebrada.