Pregunta

Estoy deseando poner un resaltado visual (caja de selección realmente) en uno de los muchos tgllane que tienen muchas texturas diferentes asignadas a ellos. ¿Cómo aplicaría una segunda textura de la calcomanía a ese plano usando GLSCENE?

algunos antecedentes. Las diversas texturas diferentes aplicadas a los planos se almacenan en un elemento de material y asignado al material de los planos respectivos. MaterialLibrary y Material.LibmaterialName. Esta es la reutilización eficiente de las texturas, ya que se cargan solo una vez, independientemente de cuántas veces se usan.

Lo que no puede aparentemente no puede hacerlo es usar cualquiera de las propiedades en el TGLPLANE porque se ignoran una vez que aplique una textura de Library.

Los métodos que puedo encontrar por hacerlo parece que me exige que modifique el libmaterial, que, por supuesto, entonces se aplica a todos los demás planos que comparten esa textura en particular, así que eso es un no-go.

Otro método que vi a código de Google (damas) resuelve el problema creando un Segundo plano que tiene su propia textura parcialmente transparente 'resaltada' aplicada, que luego se coloca ligeramente por encima del objeto original (un cubo tal como sucede). Esto parece un truco para moverlo y espero evitar eso si es posible.

Si no es una capacidad incorporada para GLSCENE, entonces hay un método para interceptar la representación cuando llega a ese plano en particular y luego use algunos primitivos de OpenGL para aplicar la textura de la calcomanía después de que se aplique la textura de Material Library.

¿Fue útil?

Solución

Aquí hay un método, sin aplicar una segunda textura, pero sin embargo, haciendo un marcador visible.

Al cargar las texturas, cree un segundo tgllibmaterial sin una textura, pero con las modificaciones de "resalte" que desea realizar en su textura "seleccionada", y llámelo lo mismo, excepto con '-selected' adjunto al nombre.

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;

Esto no consume la memoria de la textura porque no está recargando la textura.

Luego, en su código, identifique el objeto que desea resaltar, y haga algo así.

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

FPICKEDMaterial Guarda el nombre del material original para que pueda restaurarlo más tarde.

No perfectamente lo que quiero, pero funciona.Llámalo un trabajo por ahora.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top