Archive for February, 2007

FURB: R$ 77,90 reais a hora

Publicado por Marcos Dell Antonio em 28/02/2007 | Cotidiano

Estou no último semestre do curso de Ciências da Computação da Universidade Regional de Blumenau - FURB. Isso que está escrito no tópico é a minha realidade: estou pagando R$ 77,90 reais por hora de aula e orientação.

Veja as contas:

- Pago R$ 454,44 reais por mês (20 créditos) para cursar a disciplina chamada TCC II, que é a última do curso. Multiplicando isso por seis, tem-se R$ 2.726,64 por semestre;

- Entre final fevereiro e junho terei 35 horas de aula e orientação (repare que paguei janeiro e praticamente fevereiro completo para não ter aula, mas isso acontece em todo lugar, então é “normal”);

- Dividindo o total gasto num semestre pelo total de horas que vou ter, chego no valor R$ 77,90 por hora.

Esse valor pode aumentar ainda mais quando considerarmos que essas 35 horas não serão cheias, ou seja, às vezes teremos menos aulas durante a semana, ou aulas específicas conforme os alunos selecionados. No entanto, já que pretendo ficar mais tempo com o meu orientador do que o planejado, as 35h acabam se tornando válidas para uma média do quanto gasto por hora.

Agora vamos aos fatos: se eu trabalhasse 8 horas por dia recebendo R$ 77,90 reais por cada hora, no fim do mês ganharia R$ 12.464,00. Este valor absurdo é equivalente ao tão desejado salário de um Senador: R$ 12.700,00.

Será que um dia chego lá? Apesar de ser uma comparação estúpida, não se esqueça de que esse dinheiro que eu pago está indo para algum lugar juntamente com o dos outros colegas (aproximadamente 50 na mesma situação que eu…).

O que você acha disso?

Até +.

2 comentários - clique aqui para fazer o seu

GMail: decretado "o início do fim" dos clientes de e-mail desktop

Publicado por Marcos Dell Antonio em 28/02/2007 | Cotidiano

Não é de hoje que o Google está revolucionando a era digital. Também não é de hoje que ler e-mails através de um software rodando no desktop é um pé no saco. No entanto, só hoje, digo, há alguns dias, é que apareceu uma alternativa para bater de frente com esse tipo de aplicação: GMail + Mail Fetcher.

Se você não conhece, eu garanto: é uma ótima solução para esquecer de vez o Outlook e o Thunderbird (relembrando: esse é um blog, portanto tudo o que digo está embasado nas minhas experiências).

Pronto. Chega de sensacionalismo e vamos ao que interessa.

Recentemente o GMail lançou um recurso chamado Mail Fetcher. Com ele é possível descarregar até 5 e-mails diferentes na sua conta de e-mail do Google. É óbvio que o provedor deve disponibilizar o acesso POP3.

Como eu tenho duas contas no GMail e para entrar em uma preciso sair da outra, isso é um recurso que vai me poupar alguns login/logout. Fiz alguns testes com ele essa tarde e tenho algumas observações sobre o serviço:

1. Para acessar uma conta do próprio GMail através de outra, precisei utilizar o servidor pop.googlemail.com, pois o pop.gmail.com sugerido pelo sistema não funcionou;

2. Além de usar o servidor comentado acima, foi preciso habilitar na segunda conta a opção “Enable POP only for mail that arrives from now on“. Se você for meio maluco e quiser descarregar todas as suas mensagens recebidas até hoje, pode escolher “Enable POP for all mail“. Como eu tenho centenas de mensagens, isso não fou muito agradável, pois quando abri a conta acessa as duas, simplesmente minha caixa de entrada começou a crescer, crescer. crescer… até que escolhi a primeira opção e reiniciei o navegador;

3. As labels da outra conta não são copiadas para a destino. Tudo bem que ter esse comportamento padrão é um tanto quanto estranho, mas acho que poderia ter uma opção para copiar ou não as labels de uma conta para a outra;

4. Muitas mensagens recebidas normalmente na conta antiga estão sendo consideradas como SPAM na nova. Acredito que isso deixará de existir com o tempo, pois o GMail aprenderá o que é SPAM ou não. Novamente, acho que deveria ter uma opção para importar também as “regras” de SPAM;

Fora isso não tenho nada para reclamar. Acho que com o tempo os recursos que comentei estarão disponíveis.

No Google Operating System tem um ótimo post mostrando várias imagens de como funciona o novo recurso.

Ps: eu realmente nunca usei muitos recursos do Outlook ou do Thunderbird. O máximo que faço é configurar algumas pastas (labels), ler um e-mail e arquivá-lo, etc. Portanto, no meu ponto de vista essa nova solução do GMail é uma garantia de que não preciso mais destes softwares para desktop.

É isso ae. Até +.

2 comentários - clique aqui para fazer o seu

Bolsa de Valores: Investir hoje para gastar amanhã

Publicado por Marcos Dell Antonio em 27/02/2007 | Cotidiano

Desde o início deste ano eu e outro amigo estamos discutindo onde investir dinheiro para poder passar as férias do fim de ano sem contar com o salário, décimo terceiro e as próprias férias pagas pela empresa.

Através de um colega deste meu amigo conhecemos a Gera Futuro. Esta, por sua vez, é uma corretora de valores, ou seja, uma empresa que negocia títulos na BOVESPA. Em outras palavras, investe em ações.

Geração Futuro - Corretora de Valores
Conheça a Geração Futuro - Corretora de Valores

Funciona mais ou menos assim: você envia seu dinheiro à corretora de valores e ela investe pra você na BOVESPA. Claro que não fazem isso de graça. A taxa de administração cobrada é de 4% ao ano. Além deste valor, é preciso descontar 15% de Imposto de Renda pago ao honesto governo (este é só sobre o lucro).

Pelo que estou acompanhando desde dezembro do ano passado, os grupos de investimentos da Gera Futuro estão rendendo uma ótima grana. Alguns deles chegam a 10% ao mês.

Sobre a empresa, parece ser muito séria e competente. Já entrei em contato com a Vania de São Paulo/SP e também com o Fernando de Porto Alegre/RS. Ambos me atenderam muito bem e explicaram tudo o que eu precisava saber para investir.

O cadastro também é muito simples. Basta preencher um formulário com informações pessoais e enviar para eles juntamente com uma cópia do CPF, RG e comprovante de residência. Após isso, os investimentos podem ser feitos via pagamento de boleto bancário (emitido através do site com o valor desejado) ou transferência eletrônica.

O próprio site da Gera Futuro é uma ótima fonte de referências sobre a empresa. Tem várias matérias publicadas por aí a fora.

É isso aí. O espírito capitalista é importante em algumas situações.

Seja o primeiro a comentar este post

MD3DM: Como desenhar um quadrado usando a classe Mesh

Publicado por Marcos Dell Antonio em 27/02/2007 | .NET, Direct3D, Mobilidade

Em todos os posts apresentados até agora (1, 2, 3) utilizei um array de vértices para desenhar algo na tela.

Neste post vou mostrar como desenhar um objeto pré-definido pelo Managed Direct3D Mobile: a caixa (ou quadrado, como diz o título do tópico. Em inglês é Box, mas interprete da forma que desejar).

Para este exemplo não será necessário nenhum tipo de buffer de vértices, somente um objeto Mesh.

A única alteração que deve ser feita tomando como base os exemplos anteriores, é no método Render():

 1 private void Render()
 2 {
 3     _device.Clear(ClearFlags.Target,
 4                   Color.Bisque,
 5                   1.0f,
 6                   0);
 7 
 8     _device.BeginScene();
 9 
10     _mesh = Mesh.Box(_device, 0.5f, 0.5f, 0);
11 
12     _device.Transform.World =
13         Matrix.Translation(0, 0, 0);
14     _mesh.DrawSubset(0);
15 
16     _device.Transform.World =
17         Matrix.Translation(-0.75f, 0, 0);
18     _mesh.DrawSubset(0);
19 
20     _device.Transform.World =
21         Matrix.Translation(0.75f, 0, 0);
22     _mesh.DrawSubset(0);
23 
24     _device.Transform.World =
25         Matrix.Translation(0, 0.75f, 0);
26     _mesh.DrawSubset(0);
27 
28     _device.Transform.World =
29         Matrix.Translation(0, -0.75f, 0);
30     _mesh.DrawSubset(0);
31 
32     _device.Transform.World =
33         Matrix.Translation(-0.75f, 0.75f, 0);
34     _mesh.DrawSubset(0);
35 
36     _device.Transform.World =
37         Matrix.Translation(-0.75f, -0.75f, 0);
38     _mesh.DrawSubset(0);
39 
40     _device.Transform.World =
41         Matrix.Translation(0.75f, 0.75f, 0);
42     _mesh.DrawSubset(0);
43 
44     _device.Transform.World =
45         Matrix.Translation(0.75f, -0.75f, 0);
46 
47     _mesh.DrawSubset(0);
48 
49     _device.EndScene();
50     _device.Present();
51 }

Mas o que isso tudo faz? Pois bem, vamos por partes. Além de limpar o device e iniciar o desenho da cena, é criado um Mesh (modelo). Este mesh representa o quadrado que será desenhado na tela.

Já que eu quero desenhar nove quadrados, foi preciso fazer uma translação sobre o eixo X, desenhar o primeiro quadrado, transladar novamente, desenhar o próximo quadrado e assim sucessivamente. Repare que em determinadas situações foi preciso transladar o eixo Y também, pois são três quadrados por linha.

O resultado final é este:

É isso ae. Nada muito difícil ou demorado. Daqui pra frente o bicho pega, pois vou começar a estudar Index Buffer e a especificação dos arquivos OBJ.

Até +.

Seja o primeiro a comentar este post

Como eu NÃO arrumaria os equipamentos na minha escrivaninha

Publicado por Marcos Dell Antonio em 26/02/2007 | Cotidiano

Recentemente li no Efetividade.net um post sobre como organizar os equipamentos na escrivaninha. Há uns quatro anos, quando me mudei para Blumenau, eu diria que a forma apresentada é a solução para todos os problemas.

 
Solução apresentada no Efetividade.net: tudo embaixo da escrivaninha

Hoje, depois de passar quatro anos com um modem ADSL e um HUB embaixo da bancada que temos na sala, a única vontade que tenho é de abrir um buraco para conseguir colocar e tirar os cabos com mais facilidade.

Felizmente essa vontade foi suprida com a mudança de posição dos equipamentos. Todos eles deixaram de ficar embaixo da bancada para ficar em cima, afinal tem espaço de sobra.

No caso da imagem apresentada no Efetividade, realmente aquilo tudo em cima de uma escrivaninha não seria muito agradável. No entanto, a recomendação do Silveira Neto, em um dos comentários do post, parece ser a mais viável.


Solução apresentada pelo Silveira Neto: tudo ao alcance das mãos

Por que? No meu ponto de vista, equipamentos eletrônicos são que nem carro velho: mais dia, menos dia um problema aparece. Aqui em casa vai e vem precisamos reiniciar o modem ADSL, dar um tapa no HUB ou coisa do tipo. Imagina fazer isso tudo com esses equipamentos embaixo da bancada. Era um saco.

Tudo bem que o pai do Silveira exagerou um pouquinho ao colocar tudo na parede (inclusive o computador e a impressora), mas se eu fosse fazer algo novo aqui em casa, seria nesse estilo, e não no apresentado no Efetividade.net.

É isso aí. Até +.

Ps: contenha as baixarias, isso é só uma opinião do autor com base na sua experiência. ;)

2 comentários - clique aqui para fazer o seu

"Ele lê o que eu escrevo e não o que ele quis ler, o que ele imaginou que leu."

Publicado por Marcos Dell Antonio em 26/02/2007 | Cotidiano

Essa é a melhor frase que li desde que o ano começou. O autor é o Alex Castro do blog 3L (Liberal - Libertário - Libertino) e a frase está publicada em um de seus posts.

Levando esta frase a outros contextos e situações, percebi que realmente as pessoas agem da forma como querem, e não como esperamos. Dá pra contar nos dedos quantos são capazes de tentar compreender o que falamos antes de criticar.

É por essas e outras que eu questiono muito para obter todos os detalhes de alguém que tenta me contar alguma coisa. Às vezes chego a ser chato com tantas perguntas e o outro fica irritado, pois acha que estou debochando. No entanto, sem esclarecer exatamente a mensagem que está sendo transmitida, é difícil tomar uma posição.

É isso aí. Até +.

Seja o primeiro a comentar este post

Delphi: TScrollBox não tem eventos para tratamento de Scroll, e agora?

Publicado por Marcos Dell Antonio em 26/02/2007 | Delphi

Dias atrás precisei de um componente no estilo do TPanel mas que tivesse as barras de rolagem na vertical e horizontal. A princípio achei que o próprio TPanel teria isso, porém não encontrei nada.

Foi então que ao acaso descobri o componente TScrollBox. Ele é exatamente isto: um TPanel + TScrollBar (horizontal e vertical).

Com o componente em mãos, fiz alguns testes e já parti pra produção. No meio do caminho, após enviar uma demo ao supervisor do que estava sendo feito, recebi uma solicitação para que o cabeçalho (alguns botões) deste componente ficasse fixo.

Encontrei duas soluções para o problema:

1. Remover os botões do cabeçalho e colocá-los logo acima do TScrollBox. Desta forma, quando ele rolasse para baixo ou para cima, o cabeçalho permaneceria no mesmo lugar.

2. Manter os botões no topo do TScrollBox e tratar dinamicamente o Top deles (conforme o scroll) para que ficassem sempre no topo.

A primeira solução foi descartada, pois naquela situação teria que alterar várias outras coisas. Logo, parti para a segunda.

Quando fui procurar o evento que tratava a rolagem das barras (OnScroll ou algo do tipo), simplesmente descobri que não existia. Foi então que parti pro Google

Através do quarto site encontrado na pesquisa realizada acima, cheguei novamente à fonte de milagres para qualquer programador Delphi: Torry’s Delphi.

Com base no exemplo dele, elaborei a seguinte rotina usando a mensagem WM_VSCROOL:

1 procedure TfrmMeuForm.WMVScroll(var Msg: TMessage); 2 begin 3 FOldWindowProc(Msg); 4 5 if (Msg.Msg = WM_VSCROLL) then 6 button.Top := scrollBox.VertScrollBar.Position; 7 end;

Neste exemplo tratei o Top apenas de um botão para facilitar o entendimento.

Com esse método declarado e implementado, bastou fazer o seguinte:

- Declarar uma variável private do tipo TWndMethod:

1 private 2 FOldWindowProc: TWndMethod;

- Definir a propriedade WindowProc da TScrollBox para o método de tratamento e armazenar uma cópia de onde está o método atual:

1 FOldWindowProc := scrollBox.WindowProc; 2 scrollBox.WindowProc := WMVScroll;

Pronto. Desta forma, quando o método WMVScroll for executado, ele tratará todas as mensagens que tratava antes e também a WMV_SCROLL, só que agora de uma forma específica.

É isso ae. Espero que ajude.

Até + 

1 comentário - clique aqui para fazer o seu

MD3DM: Como desenhar um triângulo usando o Smartphone Emulator - Parte 2

Publicado por Marcos Dell Antonio em 22/02/2007 | .NET, Direct3D, Mobilidade

Num post anterior descrevi como desenhar um triângulo no Smartphone Emulator usando o Managed Mobile Direct3D.

A técnica usada naquele exemplo foi a mais simples possível: três vértices do tipo TransformedColored.

Por que a mais simples? Ora pois… É a mais simples porque usa coordenadas já transformadas, ou seja, todas as posições (x, y, z) dos vértices são dadas de acordo com o espaço da tela (scree space, para os íntimos).

Para os leigos, o que isso significa? Simples: a tela do seu emulador mede 150 x 150 (suponhamos). Então você manda desenhar um ponto (x, y, z) em (75, 75, 0) e o que teremos será um ponto exatamente no meio da tela. Capiche? Estas são as coordenadas da tela do próprio emulador, ou como dito anteriormente, screen space.

Esta técnica, sem dúvida, só serve para demonstrações, pois na prática é muito limitada. O que vou mostrar hoje é como desenhar um triângulo utilizando o conceito de world space, ou seja, coordenadas de mundo.

Para ficar mais claro, veja um trecho do livro Managed DirectX 9 Kick Start: Graphics and Game Programming que descreve o que é o world space:

You can think of world space as an infinite three-dimensional Cartesian space. You can place your objects anywhere in this “world” you want to.

Tradução: você pode imaginar o world space como um plano cartesiano 3D infinito. Você pode posicionar seus objetos em qualquer lugar deste mundo.

Uma complementação de minha autoria:

Depois de posicionados, você verá os objetos que quiser, como se fosse uma câmera apontada para frente, para o lado, para cima ou para baixo. Somente vemos o que está naquele local, mas existem vários outros objetos ao nosso redor.

E então, qual a diferença entre screen space e world space? No screen space você vê tudo o que existe. No world space você pode ver tudo o que existe ou somente uma parte, dependendo da posição que você está olhando (a tal da câmera que falei acima).

Chega de papo furado e vamos ao exemplo.

Para trabalhar no world space usaremos os vértices do tipo PositionColored. Veja abaixo o que muda em relação ao post anterior.

- Inicialização

Anteriormente era criado um buffer de vértices que suportava objetos do tipo TransformedColored. A única coisa que muda é o tipo suportado por este buffer. Agora será PositionColored. Assim:

 1 private void InitializeGraphics()
 2 {
 3     try
 4     {
 5         PresentParameters presentParams = new
 6             PresentParameters();
 7 
 8         presentParams.Windowed = true;
 9         presentParams.SwapEffect =
10             SwapEffect.Discard;
11 
12         _device = new Device(0,
13                              DeviceType.Default,
14                              this,
15                              CreateFlags.None,
16                              presentParams);
17 
18         _device.RenderState.Lighting = false;
19 
20         _vertexBuffer = new VertexBuffer(
21             typeof(CustomVertex.PositionColored),
22             3,
23             device,
24             0,
25             CustomVertex.PositionColored.Format,
26             Pool.SystemMemory);
27 
28         _vertexBuffer.Created +=
29             new EventHandler(OnVertexBufferCreate);
30 
31         OnVertexBufferCreate(_vertexBuffer, null);
32     }
33     catch (Exception ex)
34     {
35         MessageBox.Show("Erro na inicialização: " +
36             ex.Message);
37     }
38 }

Como mencionado anteriormente, a única alteração está na criação do VertexBuffer, que agora suporta vértices do tipo PositionColored.

- Carregando o buffer

A principal alteração fica por conta deste método. No exemplo anterior era usado um array de vértices do tipo TransformedColored e cada item desse array era posicionado conforme o screen space (veja que o código anterior usa o Width e o Height da tela para calcular as coordenadas).

O que deve ser feito é o seguinte:

 1 private void OnVertexBufferCreate(object sender, EventArgs e)
 2 {
 3     VertexBuffer buffer = (VertexBuffer)sender;
 4 
 5     CustomVertex.PositionColored[] verts =
 6         new CustomVertex.PositionColored[3];
 7 
 8     verts[0] = new CustomVertex.PositionColored(
 9         0.0f,
10         0.5f,
11         -0.0f,
12         Color.Red.ToArgb());
13 
14     verts[1] = new CustomVertex.PositionColored(
15         0.5f,
16         -0.5f,
17         -0.0f,
18         Color.Red.ToArgb());
19 
20     verts[2] = new CustomVertex.PositionColored(
21         -0.5f,
22         -0.5f,
23         -0.0f,
24         Color.Red.ToArgb());
25 
26     buffer.SetData(verts, 0, LockFlags.None);
27 }

Ao invés de criarmos três vértices do tipo TransformedColored foram criados três do tipo PositionColored. Veja que suas coordenadas são baseadas no world space, que por enquanto possui os limites -1 até 1 para os três eixos (x, y, z). Essa é a definição default do MD3DM e tem relação com a câmera comentada anteriormente.

- Resultado final

É isso ae! Por hoje é só. Apesar de estar longe de alcançar a meta proposta para o TCC, isso já é um bom começo.

Até +.

Seja o primeiro a comentar este post

Windows Mobile 6 SDK: disponível somente a partir de março

Publicado por Marcos Dell Antonio em 22/02/2007 | .NET, Direct3D, Mobilidade

Muita gente anunciou o que a Microsoft realmente publicou: o Windows Mobile 6 SDK está disponível para download.

Calma! Não é bem assim. Parece que houve um equívoco e os SDKs foram liberados antes do tempo.

O lançamento oficial está marcado para o dia 01/03/2007, ou seja, daqui uma semana.

Pelo que andei lendo sobre essa nova versão do Windows Mobile (review do site Mobile-Review e anúncio oficial da Microsoft), não houve nenhuma evolução no que diz respeito ao Managed Mobile Direct3D (que muito me interessa). Portanto, até o final desse semestre provavelmente ficarei somente com o SDK da versão 5, pois não quero correr o risco de gerar algum conflito e/ou problema entre ambos, afinal o TCC está no meio do caminho. ;)

Até +.

Seja o primeiro a comentar este post

MD3DM: Como desenhar um triângulo usando o Smartphone Emulator

Publicado por Marcos Dell Antonio em 14/02/2007 | .NET, Direct3D, Mobilidade

Ps: este post é um complemento do anterior intitulado .NET: Helloworld usando o Managed Direct3D Mobile.

Já estava quase chutando balde quando descobri a solução para o meu problema. Vamos por partes.

O problema

Depois do hello world apresentado no post anterior, nada mais comum do que ir em frente. Logo, como naquele exemplo o foco era o DirectX para Desktop, neste foi para dispositivos móveis, em particular para os Smartphones.

Com base naquele código, tentei desenhar um triangulo usando o Managed Direct3D Mobile. As coisas não foram fáceis, pois para um leigo como eu no assunto, qualquer probleminha leva horas para ser resolvido.

Ta, mas e o problema? É o seguinte: depois que reescrevi parte do código com o intuito de desenhar um triângulo no Smartphone, percebi que nada acontecia. O resultado era exatamente o apresentado no post de ontem: uma tela com o fundo vermelho.

Ué, mas por quê? Se eu estou enviando comandos para que o dispositivo desenhe um maldito triangulo na tela, por que ele não o faz?

A solução

Depois de prostituir a mãe de uns dez funcionários da Microsoft, resolvi reler mais uma vez o capítulo 3 do livro Managed DirectX 9 Kick Start: Graphics and Game Programming. Lá estava claro o erro que cometi. Veja:

Even this simple demonstration of drawing a triangle with a vertex buffer shows approximately a 10% increase in performance based on frame rate. We will get into measuring performance and frame rates in later chapters. However, there is still a problem with this application that makes itself readily apparent when you attempt to resize your window. The triangle simply disappears as soon as your window is resized.

There are a few things going on here that are causing this behavior, and two of them have been mentioned briefly already. Remembering back to the previous chapter, we know that when our window is resized, our device is automatically reset. However, when a resource is created in the default memory pool (such as our vertex buffer), it is automatically disposed when the device is reset. So while our window is being resized, our device is being reset, and our vertex buffer disposed. One of the nifty features of Managed DirectX is that it will automatically re-create your vertex buffer for you after the device has been reset. However, there will be no data in the buffer, so the next time it’s time to draw, nothing is shown.

Fiz questão de colar o texto na integra para que você mesmo tire suas conclusões.

O que o autor diz é o seguinte: o triângulo desaparecerá quando você redimensionar a janela. Isso ocorre, pois quando ela muda de tamanho o dispositivo é reiniciado e o VertexBuffer é desalocado. A solução para isto é fazer uso do recurso que recria o buffer assim que o dispositivo é reiniciado. No entanto, depois de criado, ele estará vazio, então deve-se carregá-lo.

Em outras palavras, crie o seguinte método:

 1 private void OnVertexBufferCreate(object sender, EventArgs e)
 2 {
 3     VertexBuffer buffer = (VertexBuffer)sender;
 4 
 5     CustomVertex.TransformedColored[] verts = new
 6         CustomVertex.TransformedColored[3];
 7 
 8     verts[0] = new CustomVertex.TransformedColored(
 9         this.Width / 2,
10         this.Height / 4,
11         0.5F,
12         1,
13         Color.Blue.ToArgb());
14 
15     verts[1] = new CustomVertex.TransformedColored(
16         this.Width * 3 / 4,
17         this.Height * 3 / 4,
18         0.5F,
19         1,
20         Color.Green.ToArgb());
21 
22     verts[2] = new CustomVertex.TransformedColored(
23         this.Width / 4,
24         this.Height * 3 / 4,
25         0.5F,
26         1,
27         Color.Red.ToArgb());
28 
29     buffer.SetData(verts, 0, LockFlags.None);
30 }

Neste método é que o VertexBuffer será carregado para ser desenhado posteriormente. Com isso, é garantido que toda vez que for preciso redesenhar o buffer ele estará lá. Para que isso entre em funcionamento, a criação do VertexBuffer deve ficar assim:

 1 private void InitializeGraphics()
 2 {
 3     try
 4     {
 5         PresentParameters presentParams =
 6             new PresentParameters();
 7 
 8         presentParams.Windowed = true;
 9         presentParams.SwapEffect =
10             SwapEffect.Discard;
11 
12         _device = new Device(0,
13                              DeviceType.Default,
14                              this,
15                              CreateFlags.None,
16                              presentParams);
17 
18         // Create the vertex buffer
19         _vertexBuffer = new VertexBuffer(
20             typeof(CustomVertex.TransformedColored),
21             3,
22             _device,
23             0,
24             CustomVertex.TransformedColored.Format,
25             Pool.SystemMemory);
26 
27         _vertexBuffer.Created +=
28             new EventHandler(OnVertexBufferCreate);
29 
30         OnVertexBufferCreate(_vertexBuffer, null);
31     }
32     catch (Exception ex)
33     {
34         MessageBox.Show("Erro na inicialização: " +
35            ex.Message);
36     }
37 }

Após a criação do Device é que deve ser criado o VertexBuffer, pois o segundo depende do primeiro. Quando o buffer é criado, é atribuído a ele o evento Created. Este evento é que será executado sempre que for preciso recarregar o conteúdo do buffer.

Na hora de desenhar esse buffer, faça o seguinte:

 1 private void Render()
 2 {
 3     // Clear the device
 4     _device.Clear(ClearFlags.Target, Color.Bisque, 1.0f, 0);
 5 
 6     // Render de scene
 7     _device.BeginScene();
 8 
 9     _device.SetStreamSource(0, _vertexBuffer, 0);
10     _device.DrawPrimitives(PrimitiveType.TriangleList, 0, 1);
11 
12     _device.EndScene();
13     _device.Present();
14 }

Claro, não esqueça de criar a variável privada _vertexBuffer do tipo VertexBuffer.

O resultado

Veja:

Portanto, só para sintetizar a idéia: não desenhe seus objetos em qualquer parte do código pois eles podem desaparecer a qualquer momento. Utilize a “técnica” apresentada acima para renderizar, pois segundo o livro que estou seguindo é uma solução excelente e o autor dele sabe o que fala.

É isso ae. Até +. :-)

Seja o primeiro a comentar este post

Anúncios

Anúncio provido pelo BuscaPé