Question

Je veux mettre un point de vue visuel (boîte de sélection vraiment) sur l'un des nombreux TGLPLANE qui ont de nombreuses textures différentes qui leur sont attribuées. Comment appliquer une deuxième texture de décalque dans cet avion à l'aide de GLSCENE?

du fond. Les différentes textures différentes appliquées aux plans sont toutes stockées dans un matérialLibrary et attribuée au matériau des plans respectifs.MatérialLibrary et de matériau.LibMaterialName. Il s'agit de la bonne réutilisation efficace des textures car elles ne sont chargées qu'une fois, peu importe le nombre de fois qu'ils sont utilisés.

Ce que vous ne pouvez pas apparaître, utilisez aucune des propriétés sur le TGLPLANE car elles sont ignorées une fois que vous appliquez une texture matérielleLibrary.

Les méthodes que je peux trouver pour cela semblent avoir besoin de me demander de modifier la libmatinale qui s'applique bien sûr à tous les autres avions qui partagent cette texture particulière, c'est donc un non-go.

Une autre méthode que j'ai repérée à Code Google (Checkers) résout le problème en créant un Deuxième avion qui a sa propre "Met-en surbrillance" Texture partiellement transparente appliquée, qui est ensuite placé légèrement au-dessus de l'objet d'origine (un cube tel qu'il se trouve être). Cela semble être un hack pour le contourner et j'espère éviter cela si possible.

Si ce n'est pas une capacité intégrée pour GLSCENE, il existe une méthode pour intercepter le rendu lorsqu'il atteint ce plan particulier, puis utilisez des primitives OpenGL pour appliquer la texture de décalque après l'application de la texture matérielleLibrary?

Était-ce utile?

La solution

Voici une méthode, sans appliquer une deuxième texture, mais fait néanmoins un marqueur visible.

Lors du chargement des textures, créez une seconde tgllibmatial sans texture, mais avec toutes les modifications «Mettez en surbrillance» que vous souhaitez apporter sur votre texture «sélectionnée» et appelez-la de même qu'avec «Non sélectionné» annexé au nom.

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;

Cela ne consomme pas de mémoire de texture car vous ne rechargez pas la texture.

Puis dans votre code, identifiez l'objet que vous souhaitez mettre en évidence et faire quelque chose comme ça.

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

FPICKEDMaterial enregistre le nom du matériau d'origine afin que je puisse le restaurer plus tard.

Pas parfaitement ce que je veux, mais ça marche.Appelez-le un travail pour le moment.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top