Pergunta

Estou querendo colocar um destaque visual (caixa de seleção, na verdade) em um dos muitos TGLPlane que possuem muitas texturas diferentes atribuídas a eles.Como eu aplicaria uma segunda textura de decalque nesse plano usando GLScene?

Alguns antecedentes.As diversas texturas diferentes aplicadas aos planos são todas armazenadas em uma MaterialLibrary e atribuídas aos respectivos planos Material.MaterialLibrary e Material.LibMaterialName.Esta é a reutilização adequada e eficiente de texturas, pois elas são carregadas apenas uma vez, independentemente de quantas vezes são usadas.

O que aparentemente você não pode fazer é usar qualquer uma das propriedades do TGLPlane porque elas são ignoradas quando você aplica uma textura MaterialLibrary a ele.

Os métodos que posso encontrar para fazer isso parecem exigir que eu altere o LibMaterial que, é claro, se aplica a todos os outros planos que compartilham aquela textura específica, então isso é impossível.

Outro método que descobri em Código do Google (damas) resolve o problema criando um segundo plano que tem sua própria textura de 'destaque' parcialmente transparente aplicada, que é então colocada ligeiramente acima do objeto original (um cubo, por acaso).Parece um truque para contornar isso e espero evitar isso, se possível.

Se não for um recurso integrado para GLScene, existe um método para interceptar a renderização quando ela chega a esse plano específico e, em seguida, usar algumas primitivas OpenGL para aplicar a textura do decalque após a aplicação da textura MaterialLibrary?

Foi útil?

Solução

Aqui está um método, sem aplicar uma segunda textura, mas mesmo assim criando um marcador visível.

Ao carregar as texturas, crie um segundo TGLLibMaterial sem textura, mas com quaisquer modificações de 'destaque' que você deseja fazer em sua textura 'selecionada', e chame-o da mesma forma, exceto com '-selected' anexado ao nome.

fMatLib.AddTextureMaterial('empty','empty.bmp', False);

with TGLLibMaterial.Create(fMatLib.Materials) do begin
  Material.MaterialLibrary := fMatLib;
  Texture2Name := 'empty';
  Name := 'empty-selected';
  Material.FrontProperties.Emission.Color := clrRed;
  Material.Texture.ImageBrightness := 1.5;
end;

Isso não consome memória de textura porque você não está recarregando a textura.

Em seguida, em seu código, identifique o objeto que deseja destacar e faça algo assim.

fPickedMaterial := fPickedObject.Material.LibMaterialName;
fPickedObject.Material.LibMaterialName :=
  fPickedObject.Material.LibMaterialName + '-selected';

fPickedMaterial salva o nome original do material para que eu possa restaurá-lo mais tarde.

Não é perfeitamente o que eu quero, mas funciona.Chame isso de solução alternativa por enquanto.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top