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 ^^



Suche:
(unterstützt mySQL Wildcards ala %)
Titel:
Text:
Autor: