Ansatz für einen 3D Leveleditor ^^ von ??? |
[code:1:6740922de7]; ; Konstanten ; Const screenwidth = 800 Const screenheight = 600 Const colormode = 32 ; Grafikmodus setzten Graphics3D screenwidth,screenheight,colormode,2 AppTitle("Viewport") SetBuffer BackBuffer() ; ; Types ; Type entity_t ; Entity Type Field typ Field objecttype$ Field variables$ Field obj3D End Type ; Typen: ; ; 1: Mesh ; 2: Point Entity Type object_t ; Object Type Field id Field name$ Field typ End Type Type variable_t ; Variablen Typ Field id Field name$ End Type ; ; Variablen ; ; 3D Global camera = CreateCamera() ;Global light = CreateLight(3,camera) Global camxrot Global camyrot ; Andere Global seltool = 1 Global selprimitive = 1 Global mausdruck Global mstartx,mstarty Global selectedentitys = 0 Dim selected(0) Dim tempar(0) ; 2D Viewports Global scrollx Global scrolly Global scrollz Global selviewport = 1 Global realzoom = 100 Global zoom# Global gridfinestep = 3 Dim gridfine(7) gridfine(0) = 1 gridfine(1) = 2 gridfine(2) = 5 gridfine(3) = 10 gridfine(4) = 25 gridfine(5) = 50 gridfine(6) = 75 gridfine(7) = 100 ; ; Vorbereiten ; CameraViewport camera,400,300,400,300 AmbientLight 255,255,255 ;PositionEntity light,-3,0,3 ;hwnd = GetActiveWindow() ;result = CreateRectRgn(3,30,screenwidth-57,screenheight+10) ;SetWindowRgn(hwnd,result,1) createbox 0,0,0,10,10,10 createkugel 10,10,10,10,10,10 createzylinder 20,20,20,10,10,10,2 createwall 30,30,30,10,10,1 zoom# = Float#(realzoom)/100.0 drawviewports ; ; Hauptschleife ; Repeat zoom# = Float#(realzoom)/100.0 updatemouse updatekeys Until KeyDown(1) End ; FUNKTIONEN Function drawviewports() Cls Color 200,200,200 ; Grid zeichnen Origin 0,0 For i=0 To 400 If i Mod Int(gridfine(gridfinestep)*zoom#) = 0 Then Rect i-(Int(scrollx Mod gridfine(gridfinestep))*zoom#),0,1,300,1 Next For i=0 To 300 If i Mod Int(gridfine(gridfinestep)*zoom#) = 0 Then Rect 0,i-(Int(scrolly Mod gridfine(gridfinestep))*zoom#),400,1,1 Next Origin 400,0 For i=0 To 400 If i Mod Int(gridfine(gridfinestep)*zoom#) = 0 Then Rect i-(Int(scrollz Mod gridfine(gridfinestep))*zoom#),0,1,300,1 Next For i=0 To 300 If i Mod Int(gridfine(gridfinestep)*zoom#) = 0 Then Rect 0,i-(Int(scrolly Mod gridfine(gridfinestep))*zoom#),400,1,1 Next Origin 0,300 For i=0 To 400 If i Mod Int(gridfine(gridfinestep)*zoom#) = 0 Then Rect i-(Int(scrollx Mod gridfine(gridfinestep))*zoom#),0,1,300,1 Next For i=0 To 300 If i Mod Int(gridfine(gridfinestep)*zoom#) = 0 Then Rect 0,i-(Int(scrollz Mod gridfine(gridfinestep))*zoom#),400,1,1 Next Origin 0,0 RenderWorld ; 3D Viewport zeichnen For et.entity_t = Each entity_t ; 2D Viewports zeichnen Color 128,255,255 For i=1 To selectedentitys If etobj3d = selected(i) Then Color 255,0,0 Next For i=1 To CountSurfaces(etobj3d) For j=0 To CountTriangles(GetSurface(etobj3d,i))-1 For k=0 To 2 p1# = VertexX#(GetSurface(etobj3d,i),TriangleVertex(GetSurface(etobj3d,i),j,k)) p2# = VertexY#(GetSurface(etobj3d,i),TriangleVertex(GetSurface(etobj3d,i),j,k)) p3# = VertexZ#(GetSurface(etobj3d,i),TriangleVertex(GetSurface(etobj3d,i),j,k)) TFormPoint p1,p2,p3,etobj3d,0 p1# = (TFormedX#()-scrollx)*zoom# p2# = (TFormedY#()-scrolly)*zoom# p3# = (TFormedZ#()-scrollz)*zoom# p4# = VertexX#(GetSurface(etobj3d,i),TriangleVertex(GetSurface(etobj3d,i),j,((k+1) Mod 3))) p5# = VertexY#(GetSurface(etobj3d,i),TriangleVertex(GetSurface(etobj3d,i),j,((k+1) Mod 3))) p6# = VertexZ#(GetSurface(etobj3d,i),TriangleVertex(GetSurface(etobj3d,i),j,((k+1) Mod 3))) TFormPoint p4,p5,p6,etobj3d,0 p4# = (TFormedX#()-scrollx)*zoom# p5# = (TFormedY#()-scrolly)*zoom# p6# = (TFormedZ#()-scrollz)*zoom# If (p1>=-100 And p1<= 500) And (p2>=-100 And p2<= 400) And (p4>=-100 And p4<= 500) And (p5>=-100 And p5<= 400) Then Viewport 0,0,400,300 Origin 0,0 Line p1,p2,p4,p5 End If If (p3>=-100 And p3<= 500) And (p2>=-100 And p2<= 400) And (p6>=-100 And p6<= 500) And (p5>=-100 And p5<= 400) Then Viewport 400,0,400,300 Origin 400,0 Line p3,p2,p6,p5 End If If (p1>=-100 And p1<= 500) And (p3>=-100 And p3<= 400) And (p4>=-100 And p4<= 500) And (p6>=-100 And p6<= 400) Then Viewport 0,300,400,300 Origin 0,300 Line p1,p3,p4,p6 End If Next Next Next Next Origin 0,0 ; Selektierten Viewport kennzeichnen Viewport 0,0,800,600 Color 255,255,255 Rect 399,0,2,600,1 Rect 0,299,800,2,1 Color 255,0,0 Select selviewport Case 1 tempx = 0 tempy = 0 Case 2 tempx = 400 tempy = 0 Case 3 tempx = 0 tempy = 300 Case 4 tempx = 400 tempy = 300 End Select Rect tempx,tempy,400,300,0 Flip End Function Function draw3dviewport() RenderWorld Color 255,255,255 If selviewport = 4 Then Color 255,0,0 Rect 400,300,400,300,0 Flip End Function Function updatemouse() mausx = MouseXSpeed() mausy = MouseYSpeed() If MouseDown(2) Then ; Viewport selektieren If MouseX() <= 400 Then If MouseY() <= 300 Then selviewport = 1 Else selviewport = 3 End If Else If MouseY() <= 300 Then selviewport = 2 Else selviewport = 4 End If End If drawviewports End If mausz = MouseZSpeed() ; Zoomen Select Sgn(mausz) Case -1 If realzoom+20*mausz >= 60 Then realzoom = realzoom+20*mausz drawviewports Case 1 If realzoom+20*mausz <= 1000 Then realzoom = realzoom+20*mausz drawviewports End Select If MouseDown(3) Then ; Scrollen If mausx <> 0 Then Select selviewport Case 1 scrollx = scrollx-(mausx/zoom#) Case 2 scrollz = scrollz-(mausx/zoom#) Case 3 scrollx = scrollx-(mausx/zoom#) End Select End If If mausy <> 0 Then Select selviewport Case 1 scrolly = scrolly-(mausy/zoom#) Case 2 scrolly = scrolly-(mausy/zoom#) Case 3 scrollz = scrollz-(mausy/zoom#) End Select End If If scrollx < 0 Then scrollx = 0 If scrollx > 50000 Then scrollx = 50000 If scrolly < 0 Then scrolly = 0 If scrolly > 50000 Then scrolly = 50000 If scrollz < 0 Then scrollz = 0 If scrollz > 50000 Then scrollz = 50000 drawviewports End If Select seltool ; Tool ausführen Case 1 If MouseHit(1) Then If selviewport = 4 Then If KeyDown(29) = 0 Then desselall ; Strg temp = CameraPick(camera,MouseX()-400,MouseY()-300) If temp <> 0 Then selectentity temp End If End If drawviewports End If End Select End Function Function updatekeys() ; If selviewport = 4 Then If KeyDown(17) Then MoveEntity camera,0,0,1 If KeyDown(30) Then MoveEntity camera,-1,0,0 If KeyDown(31) Then MoveEntity camera,0,0,-1 If KeyDown(32) Then MoveEntity camera,1,0,0 If KeyDown(200) Then camxrot = camxrot - 2 If KeyDown(203) Then camyrot = camyrot + 2 If KeyDown(208) Then camxrot = camxrot + 2 If KeyDown(205) Then camyrot = camyrot - 2 If camxrot > 359 Then camxrot = camxrot - 360 If camxrot < 0 Then camxrot = camxrot + 360 If camyrot > 359 Then camyrot = camyrot - 360 If camyrot < 0 Then camyrot = camyrot + 360 RotateEntity camera,camxrot,camyrot,0 draw3dviewport ; End If End Function Function createbox(posx,posy,posz,grx,gry,grz) et.entity_t = New entity_t et yp = 1 etobjecttype$ = "worldspawn" etobj3d = CreateCube() EntityPickMode etobj3d,2,1 ScaleEntity etobj3d,Float#(grx)/2.0,Float#(gry)/2.0,Float#(grz)/2.0 PositionEntity etobj3d,posx+Float#(grx)/2.0,posy+Float#(gry)/2.0,posz+Float#(grz)/2.0 End Function Function createkugel(posx,posy,posz,grx,gry,grz) et.entity_t = New entity_t et yp = 1 etobjecttype$ = "worldspawn" etobj3d = CreateSphere() EntityPickMode etobj3d,2,1 ScaleEntity etobj3d,Float#(grx)/2.0,Float#(gry)/2.0,Float#(grz)/2.0 PositionEntity etobj3d,posx+Float#(grx)/2.0,posy+Float#(gry)/2.0,posz+Float#(grz)/2.0 End Function Function createzylinder(posx,posy,posz,grx,gry,grz,vwprt) et.entity_t = New entity_t et yp = 1 etobjecttype$ = "worldspawn" etobj3d = CreateCylinder() EntityPickMode etobj3d,2,1 ScaleEntity etobj3d,Float#(grx)/2.0,Float#(gry)/2.0,Float#(grz)/2.0 PositionEntity etobj3d,posx+Float#(grx)/2.0,posy+Float#(gry)/2.0,posz+Float#(grz)/2.0 End Function Function createwall(posx,posy,posz,grx,gry,vwprt) et.entity_t = New entity_t et yp = 1 etobjecttype$ = "worldspawn" etobj3d = CreateMesh() surf = CreateSurface(etobj3d) v1 = AddVertex(surf,-Float#(grx/2),-Float#(grx/2),0) v2 = AddVertex(surf,Float#(grx/2),-Float#(grx/2),0) v3 = AddVertex(surf,-Float#(grx/2),Float#(grx/2),0) v4 = AddVertex(surf,Float#(grx/2),Float#(grx/2),0) AddTriangle surf,v1,v2,v3 AddTriangle surf,v3,v2,v4 FlipMesh etobj3d AddTriangle surf,v1,v2,v3 AddTriangle surf,v3,v2,v4 UpdateNormals etobj3d EntityPickMode etobj3d,2,1 PositionEntity etobj3d,posx+Float#(grx)/2.0,posy+Float#(gry)/2.0,posz+Float#(grz)/2.0 End Function Function createentity(posx,posy,posz,typ$) et.entity_t = New entity_t etobjecttype$ = typ$ etobj3d = CreateCube() EntityPickMode etobj3d,2,1 ScaleEntity etobj3d,Float#(grx)/2.0,Float#(gry)/2.0,Float#(grz)/2.0 PositionEntity etobj3d,posx+Float#(grx)/2.0,posy+Float#(gry)/2.0,posz+Float#(grz)/2.0 End Function Function selectentity(entity) Local temp = 0 Dim tempar(selectedentitys) For i=1 To selectedentitys tempar(i) = selected(i) If selected(i) = entity Then temp = i Next If temp <> 0 Then For et.entity_t = Each entity_t If entity = etobj3d Then EntityColor etobj3d,255,255,255 End If Next For i=temp To selectedentitys-1 tempar(i) = tempar(i+1) Next selectedentitys = selectedentitys-1 Dim selected(selectedentitys) For i=1 To selectedentitys selected(i) = tempar(i) Next Return 0 End If selectedentitys = selectedentitys+1 Dim selected(selectedentitys) For i=1 To selectedentitys-1 selected(i) = tempar(i) Next For et.entity_t = Each entity_t If entity = etobj3d Then EntityColor etobj3d,255,0,0 selected(selectedentitys) = etobj3d End If Next End Function Function desselall() Dim selected(0) selectedentitys = 0 For et.entity_t = Each entity_t EntityColor etobj3d,255,255,255 Next End Function[/code:1:6740922de7] Freue mich über Komments! |
von ??? |
Lese mal bitte: http://www.blitzforum.de/viewtopic.php?t=1574 [b:f6f3646abb]Punkt 4[/b:f6f3646abb] Da braucht man ewig um den Code zu kappieren, vorallem für NewBies ist dies nicht brauchbar, auch wen der Code absolute spitze ist... |
von ??? |
Sorr, hatte nciht sonderlich viel Zeit beim posten :D Also ne erklärung einmal: Es ist ein Proggi sag ich mal, das vor allem das Zeichnen der verschiedenen Viewports eines 3D Editors zeigt. Zu finden in der Funktion Drawviewports, wo auch die Funktionen TForm..., welche eher unbekannt(stehen in keinen Tutorials, usw.), aber für solche sachen trotzdem wichtig sind. Interessant dabei ist auch das Scrollen und Zoomen. Diese beiden Funktionen sind auf die Maus festgelegt, da das Programm keine GUI hat. Also: Scrollrad ist zum zoomen. Maus3(mittlere Maustaste) ist zum scrollen. Und Maus2(linke Maustaste) ist zum selektieren der Viewports. Weiteres ist auch schon eine Selktierfunktion eingebaut(Die nur in der 3D Ansicht funktioniert), wo acuh ganz interesannt ist, die umdimensionierung von einem Array. Naja nicht ganz umdimensionierung, aber die Anzahl der Einträge wird verändert, wobei umdimensionierung natürlich auch möglich wäre, in diesem Fall aber nicht gebraucht wird! Und schlussendlich sind noch ein paar Primitives Funktionen dabei, die zur Erstellung der ersten Objekte da sind. Also von den Namen der Funktionen ist eigentlich alles klar und wenn man weis, was welche Funktion amcht, dann is der Code darin auch nicht alzuschwer zu verstehen. Mfg Skateboarder [EDIT]Achja, hab ich vergessen: Die 3D Ansicht wird mit WASD und den Cursortasten gesteuert, also wie bei Hammer ^^[/EDIT] |
von ??? |
Coole Sache, muss man nicht immer alles von Null an machen. ber verwende neben Scrollrad bitte noch eine Alternative (z.B. MouseY()+Shift), weil einige Systeme, bei denen funzt das nicht. |
von ??? |
Außerdem hab ich weder ein Scrollrad noch eine 3. Maustaste :roll: |
von ??? |
Ich denke das umzucoden dürfte für euch doch kein Problem sein ;) Und ich glaub du meinst Maus2 und nicht MausY norc ^^ |