Seite 11 von 22

Re: MP3D Alpha 28

Verfasst: 20.02.2011 15:20
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?

Re: MP3D Alpha 28

Verfasst: 21.02.2011 13:50
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

Re: MP3D Alpha 28

Verfasst: 24.02.2011 23:20
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

Re: MP3D Alpha 28

Verfasst: 26.02.2011 20:51
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

Re: MP3D Alpha 28

Verfasst: 27.02.2011 01:20
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

Re: MP3D Alpha 28

Verfasst: 27.02.2011 03:26
von tmjuk
Bei "normalen" Anwendungen ist F10 ja der Menüaufruf.
Vielleicht mal in die Richtung forschen?

Torsten

Re: MP3D Alpha 28

Verfasst: 27.02.2011 22:57
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

Re: MP3D Alpha 28

Verfasst: 28.02.2011 10:03
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

Re: MP3D Alpha 28

Verfasst: 28.02.2011 10:35
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

Re: MP3D Alpha 28

Verfasst: 02.03.2011 00:24
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: