PC SOFT
DEPOT EN LIGNE
POUR WINDEVWEBDEV ET WINDEV MOBILE

TheCube (Champ cube amélioré)
Publié par Patrice TERRIER
dans la catégorie Graphisme
Nouveautés
forum dédié :
http://www.objreader.com/index.php?topic=357.msg6150#new

Description
Ce projet écrit à l'origine en WD12 avec GDImage 5.07,
montre comment réaliser un contrôle de type "champ cube" avec GDImage 7.00 en mode 64-bit

Caractéristiques principales :

1 - Contrairement au champ Cube de décor WINDEV, nul besoin d'installer le framework DotNET (donc, pas d'attente lors du lancement initial).
2 - Vous pouvez interagir avec le cube et ses clones.
3 - Chaque face du cube peut aficher une image différente.
4 - En cliquant sur une face du cube principal (le plus gros) vous pouvez changer l'image de fond.
5 - Vous pouvez déplacer le cube à n'importe quel endroit dans le champ GDImage (avec la souris ou le clavier).
6 - La fonction "clone" (spécifique de GDImage) vous permet d'avoir plusieurs cubes animés qui fonctionnent en même temps.
7 - Le GFI GDImage (visible lorsqu'on choisit un dossier image) est compatible avec toutes les animations y compris DirectX, OpenGL, et les contrôles externes.

Parallèlement ce projet montre comment effectuer une sélection avec la souris sur un objet 3D comportant plusieurs textures.

Dans le monde de la 3D, le moyen usuel d'effectuer une sélection sur un objet en mouvement se nomme : "Picking".
Cependant cette technique, basée sur l'éloignement des différents objets par rapport à la caméra, ne permet pas de connaître avec certitude l'endroit précis correspondant aux coordonnées de la souris.

J'ai donc été obligé d'utiliser une autre méthode appelée "color detection".
Avec cette méthode, lorsqu'on est en mode "HitDetection", on utilise une couleur unique sur chaque face du cube au lieu d'y "mapper" les textures.
Ensuite, il suffit de tester la couleur du point survolé par la souris, pour connaître la face correspondante.

L'affectation des couleurs est effectuée dans la procédure "DrawCube" :

PROCEDURE DrawCube(LOCAL nHitDetection is int)
IF nHitDetection THEN glColor4ub(0,0,1,255)
GL_DrawCubeFrontFace(gaMt[1].Texture)

IF nHitDetection THEN glColor4ub(0,0,2,255)
GL_DrawCubeBackFace(gaMt[2].Texture)

IF nHitDetection THEN glColor4ub(0,0,3,255)
GL_DrawCubeTopFace(gaMt[3].Texture)

IF nHitDetection THEN glColor4ub(0,0,4,255)
GL_DrawCubeBottomFace(gaMt[4].Texture)

IF nHitDetection THEN glColor4ub(0,0,5,255)
GL_DrawCubeRightFace(gaMt[5].Texture)

IF nHitDetection THEN glColor4ub(0,0,6,255)
GL_DrawCubeLeftFace(gaMt[6].Texture)

La détection proprement dite "HitDetection" est effectuée dans la procédure "RenderAnimation" :

IF gP.nHitDetection THEN
x, y is int
nID is 1byte int
ZD_GetObjectXY(IDS_3DOBJECT, x, y)
mX is int = gP.nMouseX - x
mY is int = gP.nMouseY - y
zSplitColorARGB(GetPixel(GLmemDC(), mX, mY), 0, nID, 0, 0)
IF nID < ArrayInfo(gaMt, tiDimension) + 1 THEN
MonBufferAnsi is a Buffer on 520
Transfer(&MonBufferAnsi, &gaMt[nID].FullName, 520)
gP.sUseBackground = UnicodeToAnsi(MonBufferAnsi)//gaMt[nID].FullName)

GDImageUpdateBackground()

// What is the next ListBox texture to use?
nItem is int = ListSelect(BackgroundList)
IF nItem < ListCount(BackgroundList) THEN nItem++ ELSE nItem = 1
ListSelectPlus(BackgroundList, nItem)

// Update the selected texture
swFullName is string UNICODE = AnsiToUnicode(BackgroundList[nItem])
Transfer(&gaMt[nID].FullName, &swFullName, 520)

ZI_UpdateNamedGLTextureFromFileEx(BackgroundList[nItem], gaMt[nID].ID, gaMt[nID].Square)
END

gP.nHitDetection = 0

ELSE
// Paint the resulting bitmap to our window
ZD_ReplaceObjectBitmap(ZI_CreateBitmapFromImage(zBitmapToImage( GLmemDC() )), IDS_3DOBJECT, True)
END


Comment utiliser "TheCube" :

1 - Effectuer un simple ou double clic, avec le bouton gauche de la souris, sur l'une des faces du cube (le plus gros). L'image sélectionnée est utilisée comme nouveau fond de la fenêtre, tandis qu'une nouvelle image est affichée sur la face correspondante du cube.
2 - Vous pouvez utiliser la souris (bouton gauche) ou le clavier pour déplacer le cube à un nouvel emplacement.
3 - Un clic avec le bouton droit de la souris permet de choisir un nouveau dossier contenant des images qui seront affichées sur les faces du cube (choisir de préférence un dossier contenant plus de 6 images).
4 - Vous pouvez déplacer tous les cubes, cependant la sélection d'image ne se fera que sur le cube principal, celui qui est agrandi lors du démarrage initial.

Note:
En raison de l'utilisation des fonctions 3D de GDImage, vous devez utiliser une carte graphique qui supporte les spécifications OpenGL 2.00+.
Illustrations, copies d'écran
none
none
Avis des utilisateurs
(Pour noter la ressource, cliquez sur Ecrire un avis)
Aucun avis ou commentaire ? Soyez le premier !
A PROPOS
EVALUATION :
00Aucune évaluation
TELECHARGEMENTS :
42
MISE À JOUR :
18 juin 2021
VERSION :
2.00
CONCERNE :
WINDEV
Version minimale : WD17+
TAILLE :
10,6 Mo
DU MÊME DÉVELOPPEUR