Region editor
This commit is contained in:
@@ -4,6 +4,7 @@ from dusk.event import Event
|
|||||||
from dusk.defs import CHUNK_WIDTH, CHUNK_HEIGHT, CHUNK_DEPTH, CHUNK_VERTEX_COUNT_MAX, TILE_SHAPE_NULL
|
from dusk.defs import CHUNK_WIDTH, CHUNK_HEIGHT, CHUNK_DEPTH, CHUNK_VERTEX_COUNT_MAX, TILE_SHAPE_NULL
|
||||||
from dusk.tile import Tile
|
from dusk.tile import Tile
|
||||||
from dusk.entity import Entity
|
from dusk.entity import Entity
|
||||||
|
from dusk.region import Region
|
||||||
from editortool.map.vertexbuffer import VertexBuffer
|
from editortool.map.vertexbuffer import VertexBuffer
|
||||||
from OpenGL.GL import *
|
from OpenGL.GL import *
|
||||||
|
|
||||||
@@ -16,12 +17,24 @@ class Chunk:
|
|||||||
self.current = {}
|
self.current = {}
|
||||||
self.original = {}
|
self.original = {}
|
||||||
self.entities = {}
|
self.entities = {}
|
||||||
|
self.regions = {}
|
||||||
self.onChunkData = Event()
|
self.onChunkData = Event()
|
||||||
self.dirty = False
|
self.dirty = False
|
||||||
|
|
||||||
self.tiles = {}
|
self.tiles = {}
|
||||||
self.vertexBuffer = VertexBuffer()
|
self.vertexBuffer = VertexBuffer()
|
||||||
|
|
||||||
|
# Test Region
|
||||||
|
region = self.regions[0] = Region(self)
|
||||||
|
region.minX = 0
|
||||||
|
region.minY = 0
|
||||||
|
region.minZ = 0
|
||||||
|
region.maxX = 32
|
||||||
|
region.maxY = 32
|
||||||
|
region.maxZ = 32
|
||||||
|
region.updateVertexs()
|
||||||
|
|
||||||
|
# Gen tiles.
|
||||||
tileIndex = 0
|
tileIndex = 0
|
||||||
for tz in range(CHUNK_DEPTH):
|
for tz in range(CHUNK_DEPTH):
|
||||||
for ty in range(CHUNK_HEIGHT):
|
for ty in range(CHUNK_HEIGHT):
|
||||||
|
|||||||
@@ -222,6 +222,12 @@ class Map:
|
|||||||
for entity in chunk.entities.values():
|
for entity in chunk.entities.values():
|
||||||
entity.draw()
|
entity.draw()
|
||||||
|
|
||||||
|
# Only render on Region tab
|
||||||
|
if self.parent.leftPanel.tabs.currentWidget() == self.parent.leftPanel.regionPanel:
|
||||||
|
for chunk in self.chunks.values():
|
||||||
|
for region in chunk.regions.values():
|
||||||
|
region.draw()
|
||||||
|
|
||||||
def getChunkAtWorldPos(self, x, y, z):
|
def getChunkAtWorldPos(self, x, y, z):
|
||||||
chunkX = x // CHUNK_WIDTH
|
chunkX = x // CHUNK_WIDTH
|
||||||
chunkY = y // CHUNK_HEIGHT
|
chunkY = y // CHUNK_HEIGHT
|
||||||
|
|||||||
141
tools/dusk/region.py
Normal file
141
tools/dusk/region.py
Normal file
@@ -0,0 +1,141 @@
|
|||||||
|
from dusk.defs import CHUNK_WIDTH, CHUNK_HEIGHT, CHUNK_DEPTH, TILE_WIDTH, TILE_HEIGHT, TILE_DEPTH
|
||||||
|
from editortool.map.vertexbuffer import VertexBuffer
|
||||||
|
from OpenGL.GL import *
|
||||||
|
from OpenGL.GLU import *
|
||||||
|
|
||||||
|
class Region:
|
||||||
|
def __init__(self, chunk):
|
||||||
|
self.minX = 0
|
||||||
|
self.minY = 0
|
||||||
|
self.minZ = 0
|
||||||
|
self.maxX = 0
|
||||||
|
self.maxY = 0
|
||||||
|
self.maxZ = 0
|
||||||
|
self.chunk = chunk
|
||||||
|
self.vertexBuffer = VertexBuffer()
|
||||||
|
self.color = (1.0, 0.0, 0.0)
|
||||||
|
self.updateVertexs()
|
||||||
|
pass
|
||||||
|
|
||||||
|
def updateVertexs(self):
|
||||||
|
# Draw a quad, semi transparent with solid outlines
|
||||||
|
vminX = (self.minX * CHUNK_WIDTH) * TILE_WIDTH
|
||||||
|
vminY = (self.minY * CHUNK_HEIGHT) * TILE_HEIGHT
|
||||||
|
vminZ = (self.minZ * CHUNK_DEPTH) * TILE_DEPTH
|
||||||
|
vmaxX = (self.maxX * CHUNK_WIDTH) * TILE_WIDTH
|
||||||
|
vmaxY = (self.maxY * CHUNK_HEIGHT) * TILE_HEIGHT
|
||||||
|
vmaxZ = (self.maxZ * CHUNK_DEPTH) * TILE_DEPTH
|
||||||
|
alpha = 0.25
|
||||||
|
|
||||||
|
# Move back half a tile width
|
||||||
|
vminX -= TILE_WIDTH / 2
|
||||||
|
vmaxX -= TILE_WIDTH / 2
|
||||||
|
vminY -= TILE_HEIGHT / 2
|
||||||
|
vmaxY -= TILE_HEIGHT / 2
|
||||||
|
vminZ -= TILE_DEPTH / 2
|
||||||
|
vmaxZ -= TILE_DEPTH / 2
|
||||||
|
|
||||||
|
# Cube (6 verts per face)
|
||||||
|
self.vertexBuffer.vertices = [
|
||||||
|
# Front face
|
||||||
|
vminX, vminY, vmaxZ,
|
||||||
|
vmaxX, vminY, vmaxZ,
|
||||||
|
vmaxX, vmaxY, vmaxZ,
|
||||||
|
vminX, vminY, vmaxZ,
|
||||||
|
vmaxX, vmaxY, vmaxZ,
|
||||||
|
vminX, vmaxY, vmaxZ,
|
||||||
|
|
||||||
|
# Back face
|
||||||
|
vmaxX, vminY, vminZ,
|
||||||
|
vminX, vminY, vminZ,
|
||||||
|
vminX, vmaxY, vminZ,
|
||||||
|
vmaxX, vminY, vminZ,
|
||||||
|
vminX, vmaxY, vminZ,
|
||||||
|
vmaxX, vmaxY, vminZ,
|
||||||
|
|
||||||
|
# Left face
|
||||||
|
vminX, vminY, vminZ,
|
||||||
|
vminX, vminY, vmaxZ,
|
||||||
|
vminX, vmaxY, vmaxZ,
|
||||||
|
vminX, vminY, vminZ,
|
||||||
|
vminX, vmaxY, vmaxZ,
|
||||||
|
vminX, vmaxY, vminZ,
|
||||||
|
|
||||||
|
# Right face
|
||||||
|
vmaxX, vminY, vmaxZ,
|
||||||
|
vmaxX, vminY, vminZ,
|
||||||
|
vmaxX, vmaxY, vminZ,
|
||||||
|
vmaxX, vminY, vmaxZ,
|
||||||
|
vmaxX, vmaxY, vminZ,
|
||||||
|
vmaxX, vmaxY, vmaxZ,
|
||||||
|
|
||||||
|
# Top face
|
||||||
|
vminX, vmaxY, vmaxZ,
|
||||||
|
vmaxX, vmaxY, vmaxZ,
|
||||||
|
vmaxX, vmaxY, vminZ,
|
||||||
|
vminX, vmaxY, vmaxZ,
|
||||||
|
vmaxX, vmaxY, vminZ,
|
||||||
|
vminX, vmaxY, vminZ,
|
||||||
|
|
||||||
|
# Bottom face
|
||||||
|
vminX, vminY, vminZ,
|
||||||
|
vmaxX, vminY, vminZ,
|
||||||
|
vmaxX, vminY, vmaxZ,
|
||||||
|
vminX, vminY, vminZ,
|
||||||
|
vmaxX, vminY, vmaxZ,
|
||||||
|
vminX, vminY, vmaxZ,
|
||||||
|
]
|
||||||
|
|
||||||
|
self.vertexBuffer.colors = [
|
||||||
|
# Front face
|
||||||
|
self.color[0], self.color[1], self.color[2], alpha,
|
||||||
|
self.color[0], self.color[1], self.color[2], alpha,
|
||||||
|
self.color[0], self.color[1], self.color[2], alpha,
|
||||||
|
self.color[0], self.color[1], self.color[2], alpha,
|
||||||
|
self.color[0], self.color[1], self.color[2], alpha,
|
||||||
|
self.color[0], self.color[1], self.color[2], alpha,
|
||||||
|
|
||||||
|
# Back face
|
||||||
|
self.color[0], self.color[1], self.color[2], alpha,
|
||||||
|
self.color[0], self.color[1], self.color[2], alpha,
|
||||||
|
self.color[0], self.color[1], self.color[2], alpha,
|
||||||
|
self.color[0], self.color[1], self.color[2], alpha,
|
||||||
|
self.color[0], self.color[1], self.color[2], alpha,
|
||||||
|
self.color[0], self.color[1], self.color[2], alpha,
|
||||||
|
|
||||||
|
# Left face
|
||||||
|
self.color[0], self.color[1], self.color[2], alpha,
|
||||||
|
self.color[0], self.color[1], self.color[2], alpha,
|
||||||
|
self.color[0], self.color[1], self.color[2], alpha,
|
||||||
|
self.color[0], self.color[1], self.color[2], alpha,
|
||||||
|
self.color[0], self.color[1], self.color[2], alpha,
|
||||||
|
self.color[0], self.color[1], self.color[2], alpha,
|
||||||
|
|
||||||
|
# Right face
|
||||||
|
self.color[0], self.color[1], self.color[2], alpha,
|
||||||
|
self.color[0], self.color[1], self.color[2], alpha,
|
||||||
|
self.color[0], self.color[1], self.color[2], alpha,
|
||||||
|
self.color[0], self.color[1], self.color[2], alpha,
|
||||||
|
self.color[0], self.color[1], self.color[2], alpha,
|
||||||
|
self.color[0], self.color[1], self.color[2], alpha,
|
||||||
|
|
||||||
|
# Top face
|
||||||
|
self.color[0], self.color[1], self.color[2], alpha,
|
||||||
|
self.color[0], self.color[1], self.color[2], alpha,
|
||||||
|
self.color[0], self.color[1], self.color[2], alpha,
|
||||||
|
self.color[0], self.color[1], self.color[2], alpha,
|
||||||
|
self.color[0], self.color[1], self.color[2], alpha,
|
||||||
|
self.color[0], self.color[1], self.color[2], alpha,
|
||||||
|
|
||||||
|
# Bottom face
|
||||||
|
self.color[0], self.color[1], self.color[2], alpha,
|
||||||
|
self.color[0], self.color[1], self.color[2], alpha,
|
||||||
|
self.color[0], self.color[1], self.color[2], alpha,
|
||||||
|
self.color[0], self.color[1], self.color[2], alpha,
|
||||||
|
self.color[0], self.color[1], self.color[2], alpha,
|
||||||
|
self.color[0], self.color[1], self.color[2], alpha,
|
||||||
|
]
|
||||||
|
self.vertexBuffer.buildData()
|
||||||
|
|
||||||
|
def draw(self):
|
||||||
|
self.vertexBuffer.draw()
|
||||||
@@ -11,8 +11,8 @@ from editortool.langtool import LangToolWindow
|
|||||||
from editortool.cutscenetool import CutsceneToolWindow
|
from editortool.cutscenetool import CutsceneToolWindow
|
||||||
|
|
||||||
DEFAULT_TOOL = None
|
DEFAULT_TOOL = None
|
||||||
# DEFAULT_TOOL = "map"
|
DEFAULT_TOOL = "map"
|
||||||
DEFAULT_TOOL = "cutscene"
|
# DEFAULT_TOOL = "cutscene"
|
||||||
|
|
||||||
TOOLS = [
|
TOOLS = [
|
||||||
("Map Editor", "map", MapWindow),
|
("Map Editor", "map", MapWindow),
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ class EntityPanel(QWidget):
|
|||||||
self.setLayout(layout)
|
self.setLayout(layout)
|
||||||
|
|
||||||
# Top panel placeholder
|
# Top panel placeholder
|
||||||
topWidget = QLabel("Entity Editor (top)")
|
topWidget = QLabel("Entity Editor")
|
||||||
layout.addWidget(topWidget)
|
layout.addWidget(topWidget)
|
||||||
|
|
||||||
# Name input
|
# Name input
|
||||||
|
|||||||
@@ -14,6 +14,11 @@ class GLWidget(QOpenGLWidget):
|
|||||||
def initializeGL(self):
|
def initializeGL(self):
|
||||||
glClearColor(0.392, 0.584, 0.929, 1.0)
|
glClearColor(0.392, 0.584, 0.929, 1.0)
|
||||||
glEnable(GL_DEPTH_TEST)
|
glEnable(GL_DEPTH_TEST)
|
||||||
|
glEnable(GL_BLEND)
|
||||||
|
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)
|
||||||
|
glEnable(GL_POLYGON_OFFSET_FILL)
|
||||||
|
glPolygonOffset(1.0, 1.0)
|
||||||
|
glDisable(GL_POLYGON_OFFSET_FILL)
|
||||||
|
|
||||||
def resizeGL(self, w, h):
|
def resizeGL(self, w, h):
|
||||||
pass
|
pass
|
||||||
@@ -31,6 +36,6 @@ class GLWidget(QOpenGLWidget):
|
|||||||
|
|
||||||
glViewport(0, 0, w, h)
|
glViewport(0, 0, w, h)
|
||||||
self.parent.camera.setup(w, h)
|
self.parent.camera.setup(w, h)
|
||||||
self.parent.map.draw()
|
|
||||||
self.parent.grid.draw()
|
self.parent.grid.draw()
|
||||||
|
self.parent.map.draw()
|
||||||
self.parent.selectBox.draw()
|
self.parent.selectBox.draw()
|
||||||
@@ -11,7 +11,7 @@ class Grid:
|
|||||||
def draw(self):
|
def draw(self):
|
||||||
if not self.enabled:
|
if not self.enabled:
|
||||||
return
|
return
|
||||||
center = [0, 0, 0]
|
center = [0.01,0.01,0.01]
|
||||||
halfWidth = self.cellWidth * self.lines // 2
|
halfWidth = self.cellWidth * self.lines // 2
|
||||||
halfHeight = self.cellHeight * self.lines // 2
|
halfHeight = self.cellHeight * self.lines // 2
|
||||||
# Draw origin axes
|
# Draw origin axes
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
from PyQt5.QtWidgets import QWidget, QVBoxLayout, QGridLayout, QPushButton, QTabWidget, QLabel
|
from PyQt5.QtWidgets import QWidget, QVBoxLayout, QGridLayout, QPushButton, QTabWidget, QLabel
|
||||||
from editortool.map.chunkpanel import ChunkPanel
|
from editortool.map.chunkpanel import ChunkPanel
|
||||||
from editortool.map.entitypanel import EntityPanel
|
from editortool.map.entitypanel import EntityPanel
|
||||||
|
from editortool.map.regionpanel import RegionPanel
|
||||||
|
|
||||||
class MapLeftPanel(QWidget):
|
class MapLeftPanel(QWidget):
|
||||||
def __init__(self, parent):
|
def __init__(self, parent):
|
||||||
@@ -31,11 +32,13 @@ class MapLeftPanel(QWidget):
|
|||||||
# Panels
|
# Panels
|
||||||
self.chunkPanel = ChunkPanel(self.parent)
|
self.chunkPanel = ChunkPanel(self.parent)
|
||||||
self.entityPanel = EntityPanel(self.parent)
|
self.entityPanel = EntityPanel(self.parent)
|
||||||
|
self.regionPanel = RegionPanel(self.parent)
|
||||||
|
|
||||||
# Tabs
|
# Tabs
|
||||||
self.tabs = QTabWidget()
|
self.tabs = QTabWidget()
|
||||||
self.tabs.addTab(self.chunkPanel, "Tiles")
|
self.tabs.addTab(self.chunkPanel, "Tiles")
|
||||||
self.tabs.addTab(self.entityPanel, "Entities")
|
self.tabs.addTab(self.entityPanel, "Entities")
|
||||||
|
self.tabs.addTab(self.regionPanel, "Regions")
|
||||||
self.tabs.addTab(None, "Triggers")
|
self.tabs.addTab(None, "Triggers")
|
||||||
layout.addWidget(self.tabs)
|
layout.addWidget(self.tabs)
|
||||||
|
|
||||||
|
|||||||
15
tools/editortool/map/regionpanel.py
Normal file
15
tools/editortool/map/regionpanel.py
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
from PyQt5.QtWidgets import QWidget, QVBoxLayout, QLabel, QComboBox, QHBoxLayout, QPushButton, QLineEdit, QListWidget, QListWidgetItem
|
||||||
|
from PyQt5.QtCore import Qt
|
||||||
|
from dusk.entity import Entity
|
||||||
|
from dusk.defs import CHUNK_WIDTH, CHUNK_HEIGHT, CHUNK_DEPTH, ENTITY_TYPES, ENTITY_TYPE_NULL
|
||||||
|
|
||||||
|
class RegionPanel(QWidget):
|
||||||
|
def __init__(self, parent):
|
||||||
|
super().__init__(parent)
|
||||||
|
self.parent = parent
|
||||||
|
layout = QVBoxLayout(self)
|
||||||
|
self.setLayout(layout)
|
||||||
|
|
||||||
|
# Top panel placeholder
|
||||||
|
topWidget = QLabel("Region Editor")
|
||||||
|
layout.addWidget(topWidget)
|
||||||
Reference in New Issue
Block a user