Este blog esta em reforma no momento.

Primeiro walk-cicle, mais problemas e café

Bom, calor do verão gerando um stresse na hora de trabalhar, exportação sem recursos, problemas no rig, sistema dando pau ao usar recursos avançados (monitor em clone, wine com tablet, memoria indo pro saco...) em resumo "tudo normal para um ambiente de produção".
Até o presente momento, comparado a minha experiência em agências, não estou sentindo nenhuma diferênça em relação ao "ruwindows". A não ser é claro os softwares mais bombados, como o After Effects para mecher com video eo Flash para animação.

Comecei a animação de Aracne, gente, como esse bichu dá trabalho! Fiz por enquanto um walk-cicle simples, o proxímo passo é ela correr.
Considerei um frame-rate de 30fps para a animação. Alguns bugs no wheight-paint ainda ocorrem e umas deformações estrenas nas pontas dos dedos ocorrem no Blender. Vamos ver o resultado quando exportar para o OGRE.
Os braços acho que ainda estão meio durões, não sei se deixo ela mais solta, Aracne deve aparecer um pouco mais durona, ja que é meio amaldiçoada.

Como dito no post anterior, o exporter n salvou a multi-textura, eis aqui o resultado dentro do engine
Comecei a caçar (finalmemte) tutos de GLSL, e consegui meu primeiro Hellow World GLSL!
void main ()
{
vec4 modelVM0 = gl_ModelViewMatrix[0];
gl_FragColor = vec4( modelVM0[0], modelVM0[1], modelVM0[2], 1.0);
}
esse script faz a cor de desenho corrente mudar em relação ao ângulo da camera.
Bom, uma outra alternativa, vou baixar o código fonte do Blender, lá deve ter os arquivos glsl responsáveis pela multi-textura, vai ser uma boa base.
Esse blog também parece ser interesante http://blenderecia.orgfree.com/index.php/blender/2d-filters-glsl-e-custom-textures/

Bom, infelismente para os amantes de Windows, eu me concentrarei no GLSL, o OGRE tem suporte à HLSL para o DirectX, mas por motivos de tempo vou fazer tudo primeiro para a OpenGL, depois esturadei a transição de código.

PS.: http://linux.softpedia.com/get/Multimedia/Audio/Ogv-to-Flv-Converter-41863.shtml
Este script é uma mão na roda, pra quem não tem a menor paciência de ficar digitando e lembrando comando de console. Tem umas falhas, quanto as resoluções serem pra monitor quadradão, mas nada que uma mechida no código não resolva.

Os problemas hardcore começaram

Pois é minha gente, domingo de carnaval, minhas buscas pelo Orkut, bate-papo UOL e afins, n renderam nenhuma menina com parafilia por lobsomens cabeludos, meus amigos ou estão espalhados pelo mundo, ou se preocupando com suas respectivas "donas maria", então aqui estou eu frente ao possante onde as mulheres tem orelhas grandes e em alguns casos presas.
Bom, enquanto recuperava minhas forças no sabado, antes de começar a animar Aracne, comecei o cenário da primeira cena.
Fiquei realmente impressionado com o novo sistema de texturas e materiais da GE do Blender, usando massivamente GLSL as coisas ficaram realmente brutas! A ferramenta "Texture Paint" consegue pintar mesmo com normalmaps ativos e o suporte a multi-textura esta realmente ótimo.A multi-textura esta me rendendo uma aparênia mais real do ambiente. Essa textura de pedra realmente ficou um lixo, mas a grama esta boa, como podem ver abaixo.Só preciso tirar uma ou duas dessas florzinhas vermelhas, elas denunciaram o "padrão" da textura.
Outros elementos como arvores, pedras e arbustos, darão o acabamento final. Talvez eu subdivida essa malha para mais algus detalhes e separar outros materiais.

A desgraça começa!
Infelizmente para minha desagradavel surpresa, o filtro do OGRE ainda n se adaptou as novas features do Blender ~_~
material terreno
{
receive_shadows on
technique
{
pass
{
ambient 0.500000 0.500000 0.500000 1.000000
diffuse 0.640000 0.640000 0.640000 1.000000
specular 0.068839 0.068839 0.068839 1.000000 12.500000
emissive 0.000000 0.000000 0.000000 1.000000
texture_unit
{
texture grama_mesclagem.png
tex_address_mode wrap
filtering trilinear
colour_op alpha_blend
}
}
}
}
material agua
{
receive_shadows off
technique
{
pass
{
ambient 0.500000 0.500000 0.500000 1.000000
diffuse 0.640000 0.640000 0.640000 1.000000
specular 0.500000 0.500000 0.500000 1.000000 12.500000
emissive 0.000000 0.000000 0.000000 1.000000
}
}
}
Nesse arquivo de parâmetos pode-se ver que é passado apenas a textura usada no mapeamento UV. Oque me deixou cabreiro pois lembro que nos testes anteriores obtive uma exportação melhor. No entanto ainda não estava usando a multi-textura tão massivamente.
Foram 3 texturas de 512x512 e mais duas de 1024x1024 para o mapeamento stencil.
Em ultimo caso, terei que mecher no sistema interno da OGRE, posso talvez dispensar o sistema de rendering de geometria dele para implementar o meu propŕio, afinal ja tenho alguma coisa pronta.
This is Sparta!!!

Novo header

Bom, como essa ultima semana fiquei dodoi, peguei um freela e tinha uma montagem de foto p fazer, n produzi nada pro game diretamente.
Mas ai no tempo vago, resolvi instalar de vez o suporte a Flash no Linux. Infelizmente a melhor IDE depois do FlashDevelop é o Eclipse com ASDT que infelizmente é pra ActionScript 2.
Me recomendaram o VIM, mas não estou "pegando bem" com ele não. Ainda não achei onde tem a complementação de código e outras coisas importantes. Mas usei ele para gerar um html colorindo o código descentemente (claro, tirei muitos
e do resultado).

O novo header é feito 100% em Flash OpenSource, a única coisa que ele acrescenta é um efeito especial bobo mas muito simpático que desenvolvi nas horas vagas enquanto estudava o código do efeito "lake".
Ele se aplica melhor escondendo o fundo, como podem ver aqui com a menina de Final Fantasy, mas dá um bom acabamento do geito que esta no blog.
Para os céticos que não acreditam na existência de Flash fora do Windows, aqui vai um mini-tutorial:
1) Baixe o Flex SDK 3 ou superios (no link acima tem o endereço);
2) Use um editor descente, se for usar AS2 o do tutorial do link acima é perfeito. Usei o VIM aqui;
3) Aqui esta o código usado no filme principal e no botão com a logo da Creative Commons:

package
{
import flash.display.Sprite;
import flash.text.TextField;
import flash.text.TextFieldAutoSize;
import flash.events.Event;
import flash.display.BlendMode;
import flash.filters.DropShadowFilter;
import Effect02;

/**
* class Main
* @author Marcos A. Bitetti ( marcosbitetti@gmail.com )
*/

[SWF(width='700', height='378', backgroundColor='#aaaaff', frameRate='16')]

public class Main extends Sprite
{

// Insere imagem da capa
[Embed(source="../../capa_01.jpg")]
private var Capa:Class;

public function Main():void
{
if (stage) init();
else addEventListener(Event.ADDED_TO_STAGE, init);
}

private function init(e:Event = null):void
{
removeEventListener(Event.ADDED_TO_STAGE, init);
// entry point

addChild( new Capa() );

// Insere link do Creative Commons
addChild( new CC() );

//título do blog com sombra
var txt:TextField = new TextField();
txt.selectable = false;
txt.autoSize = TextFieldAutoSize.LEFT;
txt.htmlText = '<font size="78" color="#f2984c">Wild Witch Project</font>';
txt.filters = [ new DropShadowFilter(4,45, 0x000000, .8, 4,4, 1, 2, false, false ) ];
addChild( txt );

//aplica efeito especial
var efeito:Effect02;
addChild( efeito = new Effect02(.4) );
efeito.blendMode = BlendMode.SCREEN;

}

}

}

Umas diferenças importantes, aqui nós configuramos diretrizes de compilação usando [ ] no código:
[SWF(width='700', height='378', backgroundColor='#aaaaff', frameRate='16')]
(sim, uso 16 frames por segundo, poderia usar 20 mas achei mais garantido 16 para rodar em qualquer maquina. Nunca uso framerate acima dos 30, é pura idiotice pois ao contrário doque um monte de desavisado por ai pensa você não ganha qualidade na animação, apenas perde processamento inutilmente - seu monitor so exibe 30~34 fps e NADA mais)

[Embed(source="../../capa_01.jpg"), mimeType="image/jpeg"]
aqui é a biblioteca, posso apontar qualquer tipo de arquivo, basta informar o tipo mime dele: application/octet-stream, image/gif, image/jpeg, image/png, text/plain, text/xml, etc

package
{

import flash.display.Sprite;
import flash.display.DisplayObject;
import flash.text.TextField;
import flash.display.Graphics;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.net.URLRequest;
import flash.net.navigateToURL;

/**
* class CC (Creative Commons)
* @author Marcos A. Bitetti ( marcosbitetti@gmai.com )
*/
public class CC extends Sprite
{

// Insere imagem da CC
[Embed(source="../../88x31.png")]
private var _CC:Class;

public function CC():void
{
if (stage) init();
else addEventListener(Event.ADDED_TO_STAGE, init);
}

private function init(e:Event = null):void
{
removeEventListener(Event.ADDED_TO_STAGE, init);
// entry point
var cc:DisplayObject;
addChild( cc = new _CC() );
cc.x = 200;
cc.y = 2;

//desenha retângulo de fundo
var g:Graphics = this.graphics;
g.clear();
g.beginFill( 0x000000, .5 );
g.lineStyle( 1,0xffffff,.4);
g.drawRect( 0,0, cc.x+cc.width+2, cc.height+4);
g.endFill();

//Texto Informativo
var tx:TextField = new TextField();
tx.selectable = false;
tx.multiline = tx.wordWrap = true;
tx.htmlText = '<font size="14" color="#ffffff"><b>Projeto de game estilo mangá</b></font>';//tosco usar font, + é mais repido dq criar um object Steele Sheet
tx.width = 198;
tx.height = cc.height+2;
addChild( tx );

//Põe em cache como imagem para n ser renderizada de novo
cacheAsBitmap = true;

//monitora redimensionamento
stage.addEventListener( Event.RESIZE, resize );
resize( null );

//deixa como botão
useHandCursor = true;
buttonMode = true;
addEventListener( MouseEvent.CLICK, licenca );
}

private function resize( e:Event ):void {
x = stage.stageWidth - width - 4;
y = stage.stageHeight - height - 4;
}

//abre link da CC
private function licenca( e:MouseEvent ):void {
navigateToURL( new URLRequest( "http://creativecommons.org/licenses/by-nc-sa/2.5/br/" ), "_blank" );
}

}

}

4) Por fim, dentro do Flex temos o arquivo mxmlc que seria um compilador para os arquivos mxml do Flex, no entanto ele pode ser apontado para um arquivo AS bruto! Resultando em um swf sem o framework do Flex!
Assim criei o arquivo make.sh com o conteudo:
/usr/share/flex/bin/mxmlc -compiler.optimize -compiler.source-path=/home/bitetti/programacao/flash/efeitos/effect02/src/ -target-player=10 -output=./bin/header.swf ./src/Main.as
Detalhes importantes:
-compiler.source-path -> aponta para uma pasta de biblioteca de código qualquer
e...
-target-player -> seta a versão de player para qual o swf se destina. O default é 9, no entanto forcei para a versão 10, pois esta versão tem maior integração ao hardware grafico, alem do 3D, suporte a texto em colunas e pode-se escrever coisas como: var inimigos:Vector.<Inimigo> = new Vector.<Inimigo>(40); //crio um vetor de 40 inimigos! Muito mais elegante que um mero Array.

Enjoy! ^_^

O ultimo passo foi inserir no blogspot, comentei o trecho insano q insere o header do default e inseri meu código logo abaixo. Uma coisa que tive que fazer foi setar o parametro wmode para transparent para poder usar com o pequeno soft que exibe os personagens. Pensei que issu iria custar muito na performance, + testei no pc do trabalho, que é um humilde P4 e o desempenho saio-se dentro dos limites toleráveis.

P.S.: Quem quizer usar o mesmo sistema de exibição de código deste blog: (sem framework de novo, sou mesmo revoltado)

<style type="text/css">.code_hide_style { width: 100%; height: 150px; overflow: scroll; background: #ffffff; border: 1px solid #000000; } .code_show_style { width: 100%; overflow: visible; background: #ffffff; border: 1px solid #000000; } .code_control_header { width: 100%; background: #5050ff; color: #ffffff; }</style>
<div class="code_control_header"><a href="javascript:var ____j=document.getElementById('NOME_DA_DIV_A_SER_CONTROLADA');____j.className = (____j.className.indexOf('hide')==-1) ? 'code_hide_style':'code_show_style'; void(0);" class="code_control_header">Expandir código [on/off]</a></div>
<div id="NOME_DA_DIV_A_SER_CONTROLADA" class="code_hide_style"><pre>
conteudo aqui
</pre></div>

Segundo filho

Bom, ainda não falei do primeiro, pois deixei um pouco a programação de lado, pelomenos até agora.
Foi uma linda ideia, olhando o site do Z-Brush, de fazer igual com meus modelos. No entanto a única coisa ruim é o meio-ambiente inospito da HTML no Blogger. Muita tranqueira!
De inicio usei um framework JQuery, no entanto veio a ideia de tornar isso um projeto maior, ai veio a complicação. Jogando o framework de lado acabei ganhando em economia de tamanho! 2Kb de acrescimo em código contra os 50Kb do JQuery. Mas tive muuuuuita dor de cabeça.
Inicialmente a porra loka do Internet Explorer nas versões acima do 6 aceitavam a propriedade de posicionamento..... agora as abaixo do 7 ~_~
Com muita ralação e duplicidade de código, resolvi o problema, de uma forma não muito elegante, + resolvi.
Todas as tentativas de uso de CSS externo, e "hacks" css foram frustadas, por simplesmente não funcionar!
Por tanto o CSS de estilo é in-line, e todo o controle é via JavaScript, optei pelo método mais avançado de gerenciamento de eventos: addEventListener e attachEvent (um p F.F./Safari/Opera e outro pro I.E. do mau)
Ainda faltam uns detalhes para ele ficar realmente "usável" por qualquer pessoa, mas ai esta, em licença Free:
browser3dmodelview.googlepages.com/home

Os guarda-chuvas

São animais peçonhentos, geralmente da cor preta, com habitos diurnos, que habitam o topo de cavernas e saem para caçar em bandos.
Possuem um ferrão cujo veneno pode ser letal em crianças e adultos debilitados. No entanto os guarda-chuvas vermelhos possuem uma toxina extremamente letal, necrosa a carne e coagula o sangue, paraliza o sistema motor e acelera os batimentos cardiacos, se o antidoto não for ingerido em 15 seg. a vitima morre.
Tem uma boa habilidade no ar, já em terra são limitados e desengonçados.
Sua dieta é composta por pequenos insetos, avez ou mesmo mamiferos.
Até hoje não foi possivel classificar os guarda-chuvas em nenhum reino animal devido a suas caracteristicas peculiares:
Apenas um orgão faz o papel do aparelho digestivo, respiratorio, excretor e circulatório;
Igualemnte um único orgão é responsável pelo pelo sistema nervoso central e percepção do ambiente, são capazes de perceber cores, e campos elétricos dos seres;
Sistema motor é composto por anéis musculares;
Não se sabe ao certo onde estão os orgãos sexuais, só sabemos que eles "tem que ter" esses orgãos, uma vez que não são organizados como abelhas ou formigas, devem ter uma forma de reprodução por individuo. Uma teoria diz que na época do acasalemento os orgãos genitores aparecem como espinhas. Mas seu comportamente reprodutivo é um mistério, um animal muito tímido nem aomenos se alimenta se um observador estiver perto.
Raramente são domesticaveis devido a sua selvageria, os poucos casos confirmado de exito, relatam que eles são um excelente meio de transporte aéreo.
A população esta em risco de extinção, em alguns paises proximos, as pessoas os empalham e usão os guarda-chuvas como adornos, ou num ato mais desrespeitoso a vida selvagem, abrem-lhe e usam apenas como aparato para se guardar das chuvas e do sol.

Eu tive essa ideia de inimigo não lendo algum texto lírico ou coisa parecida, mas sim quando correndo pra chegar no trabalho abro o guarda-chuva e "nhack", a trava me corta o dedo. O médico me deu poucas esperanças, mas consegui sobreviver ao ferimento e a hemorragia e estou aqui publicando ^_~

+500xp em skill com sculpt

Trabalheira! Mas esta valendo a pena.
Tive que refazer o esquema 3 vezes até acertar uma divisão adequada. Por fim, seguindo uns conselhos, dividi em vários arquivos. Sendo que em média cada um tem 150MB de pura malha!
Por sorte esta é a única personagem que usa uma camuflagem como esta, os sapos-guerrilheiros usam uniforme do exercito mesmo. Mesmo assim foi bom para eu começar a ter um aprendizado descente na ferramenta de sculpt.
Com certeza eu vou evitar fazer o mesmo tipo de trabalho em outros personagens.
Mas confesso que peguei um bom amor por esta aqui, esta realmente ficando bom, apesar das perebices, talvez num futuro eu recrie-a do zero para contornar as falhas.
É uma vantagem da gente estabelecer um cronograma, vc se força a não ficar muito preso em detalhes e se concentra no andamento do projeto.
O arquivo travou o servidor X 3 vezes, sendo uma de forma BRUTAL! Tive que reduzir o numero de "undos" e passar a fechar e abrir o arquivo a cada grande alteração pra evitar qualquer fragmentação de memoria.

Outra caracteristica é que estou descobrindo mais e mais da ferramenta sculpt. Abaixo os "brushes" que usei nas imagens até agora. Espero conseguir pintar descentemente depois.
A plantinha à direita, não sei o nome, mas é outra das que consegui com uma catação de referências numa tarde de domingo. Espero logo comprar uma camera mais descente e tirar algumas fotos em macro, assim terei melhores texturas para trabalhar.
Ps.: Não sei o nome dessa plantinha, se alguem souber me avise ^_^