MP3D Alpha 32

Du brauchst Grafiken, gute Programme oder Leute die dir helfen? Frag hier.
Benutzeravatar
grapy
Beiträge: 108
Registriert: 09.09.2004 09:05

Re: MP3D Alpha 28

Beitrag von grapy »

Hi,

ich weiß nicht ob MP_KeyHit() mit jeder Taste gleich funktionieren sollte, aber

Code: Alles auswählen

  If MP_KeyHit(#PB_Key_LeftAlt)
    a+1
    Debug a
  EndIf
mit der linken Alt Taste geht es nur bei jedem 2ten mal.
und ausgerechnet die, brauch ich ^^ :mrgreen:

gruß grapy

Nachtrag: Hängt wohl am Windows Mode. Wenn ich die linke Alt Taste drücke bleibt auch das Bild stehen.

Code: Alles auswählen

MP_Graphics3DWindow(0, 0, 1280, 720, "MP3D", #PB_Window_SystemMenu|#PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget|#PB_Window_SizeGadget|#PB_Window_ScreenCentered)
Kann man das eventuell trotzdem abstellen?
Benutzeravatar
mpz
Beiträge: 505
Registriert: 14.06.2005 15:53
Computerausstattung: Win 11 Pro, 48 GB Ram, Intel I7 CPU und RX4070 Grafikkarte, PB (4/5) 6.12LT
Wohnort: Berlin, Tempelhof

Re: MP3D Alpha 28

Beitrag von mpz »

Hi,

schaue ich mir gerne an, aber grosse Hoffnungen kann ich da nicht machen falls es ein "Windows Event" ist. D. h. wer diesen Tastendruck zuerste abfängt (Windows Event oder DX9) hat gewonnen...


Gruß Michael
Working on :lol: - LibSGD - MP3D Engine - 8)
Benutzeravatar
grapy
Beiträge: 108
Registriert: 09.09.2004 09:05

Re: MP3D Alpha 28

Beitrag von grapy »

Hi Michael,

ich bins mal wieder :mrgreen:
danke, hat aber nicht Prio 1 ^^
Habe noch ein komisches Phänomen.
Vielleicht hat jemand eine Erklärung oder kanns nachprüfen.

Code: Alles auswählen

MP_Graphics3D(800, 600, 32, 2)
cam0 = MP_CreateCamera()
light0 = MP_CreateLight(2)

entity0 = MP_CreateRetangle(2, 2, 2)
tex0 = MP_CreateTextureColor(256, 256, RGBA(0, 255, 255, 255))
MP_MaterialEmissiveColor (tex0, 0, 0, 0, 0) 

MP_EntitySetTexture(entity0, tex0)
MP_PositionEntity(entity0, 0, 0, 4)

While Not MP_KeyDown(#PB_Key_Escape) And Not MP_WindowEvent() = #PB_Event_CloseWindow
  MP_TurnEntity(entity0, 0.2, 0.3, 0.4)
  MP_RenderWorld()
  MP_Flip ()  
Wend
Sobald ich die F10 Taste drücke bleibt das Programm stehen?
Hat aber anscheinend was mit Purebasic oder Windows-Fenster zu tun.
Passiert auch wenn ich die eingebaute 3D-Engine verwende.

und nochwas:
wenn man MP_EntityGetTriangle(Entity, triangle_index, corner.b) beginnt der Index laut Doku ja mit 1. Soweit so gut.
Aber bei MP_PickedGetTriangle() geht es schon bei 0 los. Habe ich durch folgen Code rausgefunden.

Code: Alles auswählen

MP_Graphics3D(800, 600, 32, 2)
MP_VSync(1)
MP_Wireframe(1)
MP_CreateLight(1)

cam0 = MP_CreateCamera()
MP_PositionCamera(cam0, -150, 90, -140)
MP_RotateCamera(cam0, 47, 0, -30)

tex0 = MP_CreateTextureColor(256, 256, RGBA(0, 255, 255, 255))

plane0 = MP_CreatePlane(10, 10)
MP_EntitySetTexture(plane0, tex0)
MP_ScaleMesh(plane0, 16, 16, 1)
MP_RotateEntity(plane0, 0, 90, 0)

sphere0 = MP_CreateSphere(16)
MP_ScaleMesh(sphere0, 3, 8, 3) 

While Not MP_KeyDown(#PB_Key_Escape) And Not MP_WindowEvent() = #PB_Event_CloseWindow
  pickedmesh = MP_PickCamera(cam0, WindowMouseX(0),WindowMouseY(0))
  triangleindex = MP_PickedGetTriangle();+1 ;<-hier muß 1 addiert werden, sonst passt es nicht
  If triangleindex And pickedmesh = plane0
    index0 = MP_EntityGetTriangle(pickedmesh, triangleindex, 0)
    MP_PositionEntity(sphere0, MP_VertexGetX(pickedmesh, index0), MP_VertexGetZ(pickedmesh, index0), MP_VertexGetY(pickedmesh, index0)) ;MP_VertexGetZ(pickedmesh, index0)
  EndIf
  MP_DrawText(0, 0, "triangleindex = " + Str(triangleindex))
  MP_RenderWorld()
  MP_Flip ()  
Wend
Vielleicht passt Du ja den Befehl MP_PickedGetTriangle() an, wenn nicht wäre ein Hinweis in der Doku nicht schlecht :-)
Außerdem wäre noch eine Funktion wünschenswert die, die absoluten 3D Koordinaten auf dem mesh bzw. entity zurückgibt.

gruß grapy
Benutzeravatar
mpz
Beiträge: 505
Registriert: 14.06.2005 15:53
Computerausstattung: Win 11 Pro, 48 GB Ram, Intel I7 CPU und RX4070 Grafikkarte, PB (4/5) 6.12LT
Wohnort: Berlin, Tempelhof

Re: MP3D Alpha 28

Beitrag von mpz »

Hallo Graphy,

guter Trianglepick code, werde ich gleich als Demo übernehmen...

Den Befehl "MP_PickedGetTriangle()" haben ich gleich angepasst, thx. Ein Triangel sollte wirklich bei 1 beginnen und nicht bei 0.

Das mit der F10 Taste muss ich nich untersuchen bzw. im Forum nachfragen. Ist vermutlich ein das gleich wie mit der "Alt Taste". Ich bleib dran und sage Bescheid wenn ich was gefunden habe. Ich tippe auf irgendein Windowsevent was ich anders abfragen muss ?!?
wünschenswert die, die absoluten 3D Koordinaten auf dem mesh bzw. entity zurückgibt
Schaue ich mir an. Es geht um den Treffer Wert mit dem entity, wenn ich es recht verstehe?

Derzeit bin ich mit der Übersetzung der XNA Shader Programming Demos von digitalerr0r auf MP3D beschäftigt. Sind meiner Meinung nach mit die Besten Shader Demos im Netz.

XNA Shader Programming – Tutorial 13, Alpha mapping
http://digitalerr0r.wordpress.com/2009/ ... a-mapping/

MP3D Demotranslation:
http://www.file-upload.net/download-324 ... r.exe.html

Gruß Michael
Working on :lol: - LibSGD - MP3D Engine - 8)
Benutzeravatar
grapy
Beiträge: 108
Registriert: 09.09.2004 09:05

Re: MP3D Alpha 28

Beitrag von grapy »

Hi Michael,

stimmt die Shader sehen echt klasse aus. :-)
Ja, ich meinte die 3D Koordinaten innerhalb des Triangles an der Stelle an der sich z.B. die Maus, befindet.
Hab meinen Code noch ein bischen erweitert um alle Vertexe die zum Triangle gehören anzuzeigen.

Code: Alles auswählen

MP_Graphics3D(800, 600, 32, 2)
MP_VSync(1)
MP_Wireframe(1)
MP_CreateLight(1)

cam0 = MP_CreateCamera()
MP_PositionCamera(cam0, -150, 90, -140)
MP_RotateCamera(cam0, 47, 0, -30)

tex0 = MP_CreateTextureColor(256, 256, RGBA(255, 0, 0, 255))
tex1 = MP_CreateTextureColor(256, 256, RGBA(0, 255, 0, 255))
tex2 = MP_CreateTextureColor(256, 256, RGBA(0, 0, 255, 255))
tex3 = MP_CreateTextureColor(256, 256, RGBA(0, 255, 255, 255))

plane0 = MP_CreatePlane(10, 10)
MP_EntitySetTexture(plane0, tex3)
MP_ScaleMesh(plane0, 16, 16, 1)
MP_RotateEntity(plane0, 0, 90, 0)

cone0 = MP_CreateCone(16, 16)
MP_EntitySetTexture(cone0, tex0)
MP_ScaleMesh(cone0, 2, 2, 1)
MP_RotateEntity(cone0, 0, 270, 0)

cone1 = MP_CreateCone(16, 16)
MP_EntitySetTexture(cone1, tex1)
MP_ScaleMesh(cone1, 2, 2, 1)
MP_RotateEntity(cone1, 0, 270, 0)

cone2 = MP_CreateCone(16, 16)
MP_EntitySetTexture(cone2, tex2)
MP_ScaleMesh(cone2, 2, 2, 1)
MP_RotateEntity(cone2, 0, 270, 0)

While Not MP_KeyDown(#PB_Key_Escape) And Not MP_WindowEvent() = #PB_Event_CloseWindow
  pickedmesh = MP_PickCamera(cam0, WindowMouseX(0),WindowMouseY(0))
  triangleindex = MP_PickedGetTriangle()+1;
  If triangleindex And pickedmesh = plane0
    index0 = MP_EntityGetTriangle(pickedmesh, triangleindex, 0)
    index1 = MP_EntityGetTriangle(pickedmesh, triangleindex, 1)
    index2 = MP_EntityGetTriangle(pickedmesh, triangleindex, 2)
    MP_PositionEntity(cone0, MP_VertexGetX(pickedmesh, index0), MP_VertexGetZ(pickedmesh, index0)+8, MP_VertexGetY(pickedmesh, index0))
    MP_PositionEntity(cone1, MP_VertexGetX(pickedmesh, index1), MP_VertexGetZ(pickedmesh, index1)+8, MP_VertexGetY(pickedmesh, index1))
    MP_PositionEntity(cone2, MP_VertexGetX(pickedmesh, index2), MP_VertexGetZ(pickedmesh, index2)+8, MP_VertexGetY(pickedmesh, index2))
  EndIf
  MP_DrawText(0, 0, "triangleindex = " + Str(triangleindex))
  MP_RenderWorld()
  MP_Flip()  
Wend
Macht mir echt Spaß mit deiner Engine. Vor allem da man keine DLL usw. dazu braucht, nur DirectX.
Hab vor so eine Art einfachen World Editor zu basteln um bestimmte Dinge testen bzw. probieren zu können.
So das man das Ganze auch speichern und wieder laden kann. Was noch ganz oben auf meiner Wunschliste steht wären Schatten,
dann Sliding Collision und Physik. Aber das ist sicher alles nicht so Ohne.

Gruß grapy
tmjuk
Beiträge: 380
Registriert: 30.06.2006 00:10
Wohnort: Backaryd, Schweden

Re: MP3D Alpha 28

Beitrag von tmjuk »

Bei "normalen" Anwendungen ist F10 ja der Menüaufruf.
Vielleicht mal in die Richtung forschen?

Torsten
PB 4.51 32 Windows Vista, 32 XP, PB 4.51 32 Ubuntu 10.10
Benutzeravatar
mpz
Beiträge: 505
Registriert: 14.06.2005 15:53
Computerausstattung: Win 11 Pro, 48 GB Ram, Intel I7 CPU und RX4070 Grafikkarte, PB (4/5) 6.12LT
Wohnort: Berlin, Tempelhof

Re: MP3D Alpha 28

Beitrag von mpz »

Hallo Torsten,

Du hast rechts, damit wird das nicht vorhandene Menü aufgerufen und das Programm stoppt. Leider habe ich keine Funktion gefunden um F10 zu deaktivieren. Ist also im PureBaisc "verdrahtet" bzw wird beim Windows erstellen aktiviert. Was ich aber nicht verstehe ist warum das Windows Menü mit der Funktionstaste F10 aktiv ist obwohl ich nur die folgenden Windows Flags verwende (#PB_Window_ScreenCentered | #PB_Window_TitleBar) und das Flag #PB_Window_SystemMenu gar nicht benutze...

Gruß Michael
Working on :lol: - LibSGD - MP3D Engine - 8)
tmjuk
Beiträge: 380
Registriert: 30.06.2006 00:10
Wohnort: Backaryd, Schweden

Re: MP3D Alpha 28

Beitrag von tmjuk »

Nun, dann erstelle doch mit

Code: Alles auswählen

AddKeyboardShortcut(#window, #PB_Shortcut_F10, #shortcut)
einen Shortcut für das Fenster. Und diesen lässt du dann ins "Leere" laufen.
Bei einer "gewöhnlichen" GUI wird damit der Zugriff auf das Menü über F10 verhindert.
Vielleicht klappt es ja bei dir auch (sollte eigentlich).

Torsten
PB 4.51 32 Windows Vista, 32 XP, PB 4.51 32 Ubuntu 10.10
Benutzeravatar
mpz
Beiträge: 505
Registriert: 14.06.2005 15:53
Computerausstattung: Win 11 Pro, 48 GB Ram, Intel I7 CPU und RX4070 Grafikkarte, PB (4/5) 6.12LT
Wohnort: Berlin, Tempelhof

Re: MP3D Alpha 28

Beitrag von mpz »

Hallo Thorsten,

Dein Tipp war richtig. Wenn man das so macht funktioniert die F10 Funktion nicht mehr als Menüaufruf

Hier der Testcodei:

Gruß Michael

Code: Alles auswählen

MP_Graphics3D(800, 600, 32, 2)
cam0 = MP_CreateCamera()
light0 = MP_CreateLight(2)


AddKeyboardShortcut(0, #PB_Shortcut_F10, 111) ;(111 ist willkürlich)

entity0 = MP_CreateRetangle(2, 2, 2)
tex0 = MP_CreateTextureColor(256, 256, RGBA(0, 255, 255, 255))
MP_MaterialEmissiveColor (tex0, 0, 0, 0, 0) 

MP_EntitySetTexture(entity0, tex0)
MP_PositionEntity(entity0, 0, 0, 4)

While Not MP_KeyDown(#PB_Key_Escape) And Not MP_WindowEvent() = #PB_Event_CloseWindow
  MP_TurnEntity(entity0, 0.2, 0.3, 0.4)
  MP_RenderWorld()
  MP_Flip ()  
Wend
Working on :lol: - LibSGD - MP3D Engine - 8)
Benutzeravatar
grapy
Beiträge: 108
Registriert: 09.09.2004 09:05

Re: MP3D Alpha 28

Beitrag von grapy »

Hallo Michael,
gut, das ist doch schon mal ein kleiner Workaround.
Dann mal noch was anderes:

Hab das Thema im GameDev Forum zu "Viewing Frustum Detection" etwas mitverfolgt.
Zur Zeit wird ja alles über deine Engine gerendert, auch wenn die Meshes nicht gerade im Kamerabereich sind.
Hier ein kleines Demo Testprogramm um sowas testen zu können.

Code: Alles auswählen

ExamineDesktops()
MP_Graphics3D(DesktopWidth(0), DesktopHeight(0), DesktopDepth(0), 0) 
MP_MouseInWindow()
ShowCursor_(0)
MP_VSync(0)

z.f  = -1000
cam0 = MP_CreateCamera()
MP_CameraSetRange(cam0, 4, 2048)
MP_PositionCamera(cam0, x.f, y.f, z.f)

NewList cubelist()
cubeswidth = 180
For zzz = -cubeswidth  To cubeswidth Step 20
  For xxx = -cubeswidth To cubeswidth Step 20
    For yyy = -cubeswidth To cubeswidth Step 20
      tempmesh = MP_CreateRetangle(10, 10, 10)
      MP_EntitySetTexture(tempmesh, MP_CreateTextureColor(32, 32, RGBA(Random(255), Random(255), Random(255), 0)))
      MP_PositionEntity(tempmesh, xxx, yyy, zzz)
      AddElement(cubelist())
      cubelist() = tempmesh
      alltriangles + MP_CountTriangles(tempmesh)      
    Next  
  Next
Next

While Not MP_KeyDown(#PB_Key_Escape) And Not MP_WindowEvent() = #PB_Event_CloseWindow
  
  camspeed = 128
  vst.f = MP_VSyncTime()
  
  pitch.f + MP_MouseDeltaX()/3
  roll.f - MP_MouseDeltaY()/3
  If pitch.f >= 360
    pitch.f - 360
  ElseIf pitch.f < 0  
    pitch.f + 360    
  EndIf  
  If roll.f >= 89
    roll.f = 89
  ElseIf roll.f <= -89  
    roll.f = -89
  EndIf   
  
  dirnormx.f = Sin(Radian(pitch.f))*Cos(Radian(roll.f))
  dirnormy.f = Sin(Radian(roll.f))
  dirnormz.f = Cos(Radian(roll.f))*Cos(Radian(pitch.f))
  
  If MP_KeyDown(#PB_Key_W) = 1
    x.f + camspeed*dirnormx.f*vst.f
    y.f + camspeed*dirnormy.f*vst.f    
    z.f + camspeed*dirnormz.f*vst.f
  EndIf  
  If MP_KeyDown(#PB_Key_A) = 1
    x.f - camspeed*Cos(Radian(pitch.f))*vst.f
    z.f + camspeed6*Sin(Radian(pitch.f))*vst.f
  EndIf
  If MP_KeyDown(#PB_Key_D) = 1
    x.f + camspeed*Cos(Radian(pitch.f))*vst.f
    z.f - camspeed*Sin(Radian(pitch.f))*vst.f
  EndIf  
  If MP_KeyDown(#PB_Key_S) = 1
    x.f - camspeed6*dirnormx.f*vst.f 
    y.f - camspeed*dirnormy.f*vst.f 
    z.f - camspeed*dirnormz.f*vst.f
  EndIf
  
  MP_PositionCamera(cam0, x.f, y.f, z.f)
  MP_RotateCamera(cam0, pitch.f, yaw.f, roll.f)  
  
  MP_DrawText(0, 0, "FPS = " + Str(MP_FPS()))
  MP_DrawText(0, 12, "Triangles = " + Str(alltriangles))
  MP_LineXY(WindowWidth(0)/2-32, WindowHeight(0)/2, WindowWidth(0)/2+32, WindowHeight(0)/2, RGB(255,255,255))
  MP_LineXY(WindowWidth(0)/2, WindowHeight(0)/2-32, WindowWidth(0)/2, WindowHeight(0)/2+32, RGB(255,255,255))  
  MP_RenderWorld()
  MP_Flip()
Wend
Gruß grapy :mrgreen:
Antworten