uploaded source :?
BIN
LoreMuseum.exe
BIN
OpenAL32.dll
After Width: | Height: | Size: 1.8 KiB |
|
@ -0,0 +1,165 @@
|
||||||
|
-- written by groverbuger for g3d
|
||||||
|
-- february 2021
|
||||||
|
-- MIT license
|
||||||
|
|
||||||
|
local shader = require(G3D_PATH .. "/shader")
|
||||||
|
local newMatrix = require(G3D_PATH .. "/matrices")
|
||||||
|
|
||||||
|
----------------------------------------------------------------------------------------------------
|
||||||
|
-- define the camera singleton
|
||||||
|
----------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
local camera = {
|
||||||
|
fov = math.pi/2,
|
||||||
|
nearClip = 0.01,
|
||||||
|
farClip = 1000,
|
||||||
|
aspectRatio = love.graphics.getWidth()/love.graphics.getHeight(),
|
||||||
|
position = {0,0,0},
|
||||||
|
target = {0,0,1},
|
||||||
|
down = {0,-1,0},
|
||||||
|
|
||||||
|
viewMatrix = newMatrix(),
|
||||||
|
projectionMatrix = newMatrix(),
|
||||||
|
}
|
||||||
|
|
||||||
|
-- private variables used only for the first person camera functions
|
||||||
|
local fpsController = {
|
||||||
|
direction = 0,
|
||||||
|
pitch = 0
|
||||||
|
}
|
||||||
|
|
||||||
|
-- read-only variables, can't be set by the end user
|
||||||
|
function camera.getDirectionPitch()
|
||||||
|
return fpsController.direction, fpsController.pitch
|
||||||
|
end
|
||||||
|
|
||||||
|
-- convenient function to return the camera's normalized look vector
|
||||||
|
function camera:getLookVector()
|
||||||
|
local vx = camera.target[1] - camera.position[1]
|
||||||
|
local vy = camera.target[2] - camera.position[2]
|
||||||
|
local vz = camera.target[3] - camera.position[3]
|
||||||
|
local length = math.sqrt(vx^2 + vy^2 + vz^2)
|
||||||
|
|
||||||
|
-- make sure not to divide by 0
|
||||||
|
if length > 0 then
|
||||||
|
return vx/length, vy/length, vz/length
|
||||||
|
end
|
||||||
|
return vx,vy,vz
|
||||||
|
end
|
||||||
|
|
||||||
|
-- give the camera a point to look from and a point to look towards
|
||||||
|
function camera.lookAt(x,y,z, xAt,yAt,zAt)
|
||||||
|
camera.position[1] = x
|
||||||
|
camera.position[2] = y
|
||||||
|
camera.position[3] = z
|
||||||
|
camera.target[1] = xAt
|
||||||
|
camera.target[2] = yAt
|
||||||
|
camera.target[3] = zAt
|
||||||
|
|
||||||
|
-- update the fpsController's direction and pitch based on lookAt
|
||||||
|
-- thanks 4v0v!
|
||||||
|
local dx,dy,dz = camera:getLookVector()
|
||||||
|
fpsController.direction = math.pi/2 - math.atan2(dz, dx)
|
||||||
|
fpsController.pitch = -math.atan2(dy, math.sqrt(dx^2 + dz^2))
|
||||||
|
|
||||||
|
-- update the camera in the shader
|
||||||
|
camera.updateViewMatrix()
|
||||||
|
end
|
||||||
|
|
||||||
|
-- move and rotate the camera, given a point and a direction and a pitch (vertical direction)
|
||||||
|
function camera.lookInDirection(x,y,z, directionTowards,pitchTowards)
|
||||||
|
camera.position[1] = x or camera.position[1]
|
||||||
|
camera.position[2] = y or camera.position[2]
|
||||||
|
camera.position[3] = z or camera.position[3]
|
||||||
|
|
||||||
|
fpsController.direction = directionTowards or fpsController.direction
|
||||||
|
fpsController.pitch = pitchTowards or fpsController.pitch
|
||||||
|
|
||||||
|
-- convert the direction and pitch into a target point
|
||||||
|
|
||||||
|
-- turn the cos of the pitch into a sign value, either 1, -1, or 0
|
||||||
|
local sign = math.cos(fpsController.pitch)
|
||||||
|
sign = (sign > 0 and 1) or (sign < 0 and -1) or 0
|
||||||
|
|
||||||
|
-- don't let cosPitch ever hit 0, because weird camera glitches will happen
|
||||||
|
local cosPitch = sign*math.max(math.abs(math.cos(fpsController.pitch)), 0.00001)
|
||||||
|
|
||||||
|
camera.target[1] = camera.position[1]+math.sin(fpsController.direction)*cosPitch
|
||||||
|
camera.target[2] = camera.position[2]-math.sin(fpsController.pitch)
|
||||||
|
camera.target[3] = camera.position[3]+math.cos(fpsController.direction)*cosPitch
|
||||||
|
|
||||||
|
-- update the camera in the shader
|
||||||
|
camera.updateViewMatrix()
|
||||||
|
end
|
||||||
|
|
||||||
|
-- recreate the camera's view matrix from its current values
|
||||||
|
-- and send the matrix to the shader specified, or the default shader
|
||||||
|
function camera.updateViewMatrix(shaderGiven)
|
||||||
|
camera.viewMatrix:setViewMatrix(camera.position, camera.target, camera.down);
|
||||||
|
(shaderGiven or shader):send("viewMatrix", camera.viewMatrix)
|
||||||
|
end
|
||||||
|
|
||||||
|
-- recreate the camera's projection matrix from its current values
|
||||||
|
-- and send the matrix to the shader specified, or the default shader
|
||||||
|
function camera.updateProjectionMatrix(shaderGiven)
|
||||||
|
camera.projectionMatrix:setProjectionMatrix(camera.fov, camera.nearClip, camera.farClip, camera.aspectRatio);
|
||||||
|
(shaderGiven or shader):send("projectionMatrix", camera.projectionMatrix)
|
||||||
|
end
|
||||||
|
|
||||||
|
-- recreate the camera's orthographic projection matrix from its current values
|
||||||
|
-- and send the matrix to the shader specified, or the default shader
|
||||||
|
function camera.updateOrthographicMatrix(size, shaderGiven)
|
||||||
|
camera.projectionMatrix:setOrthographicMatrix(camera.fov, size or 5, camera.nearClip, camera.farClip, camera.aspectRatio);
|
||||||
|
(shaderGiven or shader):send("projectionMatrix", camera.projectionMatrix)
|
||||||
|
end
|
||||||
|
|
||||||
|
-- simple first person camera movement with WASD
|
||||||
|
-- put this local function in your love.update to use, passing in dt
|
||||||
|
function camera.firstPersonMovement(dt,speed)
|
||||||
|
-- collect inputs
|
||||||
|
local moveX,moveY = 0,0
|
||||||
|
local cameraMoved = false
|
||||||
|
if love.keyboard.isDown("w") then moveY = moveY - 1 end
|
||||||
|
if love.keyboard.isDown("a") then moveX = moveX - 1 end
|
||||||
|
if love.keyboard.isDown("s") then moveY = moveY + 1 end
|
||||||
|
if love.keyboard.isDown("d") then moveX = moveX + 1 end
|
||||||
|
if love.keyboard.isDown("space") then
|
||||||
|
camera.position[2] = camera.position[2] - speed*dt
|
||||||
|
cameraMoved = true
|
||||||
|
end
|
||||||
|
if love.keyboard.isDown("lshift") then
|
||||||
|
camera.position[2] = camera.position[2] + speed*dt
|
||||||
|
cameraMoved = true
|
||||||
|
end
|
||||||
|
|
||||||
|
-- do some trigonometry on the inputs to make movement relative to camera's direction
|
||||||
|
-- also to make the player not move faster in diagonal directions
|
||||||
|
if moveX ~= 0 or moveY ~= 0 then
|
||||||
|
local angle = math.atan2(moveY,moveX)
|
||||||
|
local directionX,directionZ = math.cos(fpsController.direction + angle)*speed*dt, math.sin(fpsController.direction + angle + math.pi)*speed*dt
|
||||||
|
|
||||||
|
camera.position[1] = camera.position[1] + directionX
|
||||||
|
camera.position[3] = camera.position[3] + directionZ
|
||||||
|
cameraMoved = true
|
||||||
|
end
|
||||||
|
|
||||||
|
-- update the camera's in the shader
|
||||||
|
-- only if the camera moved, for a slight performance benefit
|
||||||
|
if cameraMoved then
|
||||||
|
camera.lookInDirection()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- use this in your love.mousemoved function, passing in the movements
|
||||||
|
function camera.firstPersonLook(dx,dy)
|
||||||
|
-- capture the mouse
|
||||||
|
love.mouse.setRelativeMode(true)
|
||||||
|
|
||||||
|
local sensitivity = 1/300
|
||||||
|
fpsController.direction = fpsController.direction + dx*sensitivity
|
||||||
|
fpsController.pitch = math.max(math.min(fpsController.pitch - dy*sensitivity, math.pi*0.5), math.pi*-0.5)
|
||||||
|
|
||||||
|
camera.lookInDirection(camera.position[1],camera.position[2],camera.position[3], fpsController.direction,fpsController.pitch)
|
||||||
|
end
|
||||||
|
|
||||||
|
return camera
|
|
@ -0,0 +1,560 @@
|
||||||
|
-- written by groverbuger for g3d
|
||||||
|
-- february 2021
|
||||||
|
-- MIT license
|
||||||
|
|
||||||
|
local vectors = require(G3D_PATH .. "/vectors")
|
||||||
|
local fastSubtract = vectors.subtract
|
||||||
|
local vectorAdd = vectors.add
|
||||||
|
local vectorCrossProduct = vectors.crossProduct
|
||||||
|
local vectorDotProduct = vectors.dotProduct
|
||||||
|
local vectorNormalize = vectors.normalize
|
||||||
|
local vectorMagnitude = vectors.magnitude
|
||||||
|
|
||||||
|
----------------------------------------------------------------------------------------------------
|
||||||
|
-- collision detection functions
|
||||||
|
----------------------------------------------------------------------------------------------------
|
||||||
|
--
|
||||||
|
-- none of these functions are required for developing 3D games
|
||||||
|
-- however these collision functions are very frequently used in 3D games
|
||||||
|
--
|
||||||
|
-- be warned! a lot of this code is butt-ugly
|
||||||
|
-- using a table per vector would create a bazillion tables and lots of used memory
|
||||||
|
-- so instead all vectors are all represented using three number variables each
|
||||||
|
-- this approach ends up making the code look terrible, but collision functions need to be efficient
|
||||||
|
|
||||||
|
local collisions = {}
|
||||||
|
|
||||||
|
-- finds the closest point to the source point on the given line segment
|
||||||
|
local function closestPointOnLineSegment(
|
||||||
|
a_x,a_y,a_z, -- point one of line segment
|
||||||
|
b_x,b_y,b_z, -- point two of line segment
|
||||||
|
x,y,z -- source point
|
||||||
|
)
|
||||||
|
local ab_x, ab_y, ab_z = b_x - a_x, b_y - a_y, b_z - a_z
|
||||||
|
local t = vectorDotProduct(x - a_x, y - a_y, z - a_z, ab_x, ab_y, ab_z) / (ab_x^2 + ab_y^2 + ab_z^2)
|
||||||
|
t = math.min(1, math.max(0, t))
|
||||||
|
return a_x + t*ab_x, a_y + t*ab_y, a_z + t*ab_z
|
||||||
|
end
|
||||||
|
|
||||||
|
-- model - ray intersection
|
||||||
|
-- based off of triangle - ray collision from excessive's CPML library
|
||||||
|
-- does a triangle - ray collision for every face in the model to find the shortest collision
|
||||||
|
--
|
||||||
|
-- sources:
|
||||||
|
-- https://github.com/excessive/cpml/blob/master/modules/intersect.lua
|
||||||
|
-- http://www.lighthouse3d.com/tutorials/maths/ray-triangle-intersection/
|
||||||
|
local tiny = 2.2204460492503131e-16 -- the smallest possible value for a double, "double epsilon"
|
||||||
|
local function triangleRay(
|
||||||
|
tri_0_x, tri_0_y, tri_0_z,
|
||||||
|
tri_1_x, tri_1_y, tri_1_z,
|
||||||
|
tri_2_x, tri_2_y, tri_2_z,
|
||||||
|
n_x, n_y, n_z,
|
||||||
|
src_x, src_y, src_z,
|
||||||
|
dir_x, dir_y, dir_z
|
||||||
|
)
|
||||||
|
|
||||||
|
-- cache these variables for efficiency
|
||||||
|
local e11,e12,e13 = fastSubtract(tri_1_x,tri_1_y,tri_1_z, tri_0_x,tri_0_y,tri_0_z)
|
||||||
|
local e21,e22,e23 = fastSubtract(tri_2_x,tri_2_y,tri_2_z, tri_0_x,tri_0_y,tri_0_z)
|
||||||
|
local h1,h2,h3 = vectorCrossProduct(dir_x,dir_y,dir_z, e21,e22,e23)
|
||||||
|
local a = vectorDotProduct(h1,h2,h3, e11,e12,e13)
|
||||||
|
|
||||||
|
-- if a is too close to 0, ray does not intersect triangle
|
||||||
|
if math.abs(a) <= tiny then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
local s1,s2,s3 = fastSubtract(src_x,src_y,src_z, tri_0_x,tri_0_y,tri_0_z)
|
||||||
|
local u = vectorDotProduct(s1,s2,s3, h1,h2,h3) / a
|
||||||
|
|
||||||
|
-- ray does not intersect triangle
|
||||||
|
if u < 0 or u > 1 then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
local q1,q2,q3 = vectorCrossProduct(s1,s2,s3, e11,e12,e13)
|
||||||
|
local v = vectorDotProduct(dir_x,dir_y,dir_z, q1,q2,q3) / a
|
||||||
|
|
||||||
|
-- ray does not intersect triangle
|
||||||
|
if v < 0 or u + v > 1 then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
-- at this stage we can compute t to find out where
|
||||||
|
-- the intersection point is on the line
|
||||||
|
local thisLength = vectorDotProduct(q1,q2,q3, e21,e22,e23) / a
|
||||||
|
|
||||||
|
-- if hit this triangle and it's closer than any other hit triangle
|
||||||
|
if thisLength >= tiny and (not finalLength or thisLength < finalLength) then
|
||||||
|
--local norm_x, norm_y, norm_z = vectorCrossProduct(e11,e12,e13, e21,e22,e23)
|
||||||
|
|
||||||
|
return thisLength, src_x + dir_x*thisLength, src_y + dir_y*thisLength, src_z + dir_z*thisLength, n_x,n_y,n_z
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- detects a collision between a triangle and a sphere
|
||||||
|
--
|
||||||
|
-- sources:
|
||||||
|
-- https://wickedengine.net/2020/04/26/capsule-collision-detection/
|
||||||
|
local function triangleSphere(
|
||||||
|
tri_0_x, tri_0_y, tri_0_z,
|
||||||
|
tri_1_x, tri_1_y, tri_1_z,
|
||||||
|
tri_2_x, tri_2_y, tri_2_z,
|
||||||
|
tri_n_x, tri_n_y, tri_n_z,
|
||||||
|
src_x, src_y, src_z, radius
|
||||||
|
)
|
||||||
|
|
||||||
|
-- recalculate surface normal of this triangle
|
||||||
|
local side1_x, side1_y, side1_z = tri_1_x - tri_0_x, tri_1_y - tri_0_y, tri_1_z - tri_0_z
|
||||||
|
local side2_x, side2_y, side2_z = tri_2_x - tri_0_x, tri_2_y - tri_0_y, tri_2_z - tri_0_z
|
||||||
|
local n_x, n_y, n_z = vectorNormalize(vectorCrossProduct(side1_x, side1_y, side1_z, side2_x, side2_y, side2_z))
|
||||||
|
|
||||||
|
-- distance from src to a vertex on the triangle
|
||||||
|
local dist = vectorDotProduct(src_x - tri_0_x, src_y - tri_0_y, src_z - tri_0_z, n_x, n_y, n_z)
|
||||||
|
|
||||||
|
-- collision not possible, just return
|
||||||
|
if dist < -radius or dist > radius then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
-- itx stands for intersection
|
||||||
|
local itx_x, itx_y, itx_z = src_x - n_x * dist, src_y - n_y * dist, src_z - n_z * dist
|
||||||
|
|
||||||
|
-- determine whether itx is inside the triangle
|
||||||
|
-- project it onto the triangle and return if this is the case
|
||||||
|
local c0_x, c0_y, c0_z = vectorCrossProduct(itx_x - tri_0_x, itx_y - tri_0_y, itx_z - tri_0_z, tri_1_x - tri_0_x, tri_1_y - tri_0_y, tri_1_z - tri_0_z)
|
||||||
|
local c1_x, c1_y, c1_z = vectorCrossProduct(itx_x - tri_1_x, itx_y - tri_1_y, itx_z - tri_1_z, tri_2_x - tri_1_x, tri_2_y - tri_1_y, tri_2_z - tri_1_z)
|
||||||
|
local c2_x, c2_y, c2_z = vectorCrossProduct(itx_x - tri_2_x, itx_y - tri_2_y, itx_z - tri_2_z, tri_0_x - tri_2_x, tri_0_y - tri_2_y, tri_0_z - tri_2_z)
|
||||||
|
if vectorDotProduct(c0_x, c0_y, c0_z, n_x, n_y, n_z) <= 0
|
||||||
|
and vectorDotProduct(c1_x, c1_y, c1_z, n_x, n_y, n_z) <= 0
|
||||||
|
and vectorDotProduct(c2_x, c2_y, c2_z, n_x, n_y, n_z) <= 0 then
|
||||||
|
n_x, n_y, n_z = src_x - itx_x, src_y - itx_y, src_z - itx_z
|
||||||
|
|
||||||
|
-- the sphere is inside the triangle, so the normal is zero
|
||||||
|
-- instead, just return the triangle's normal
|
||||||
|
if n_x == 0 and n_y == 0 and n_z == 0 then
|
||||||
|
return vectorMagnitude(n_x, n_y, n_z), itx_x, itx_y, itx_z, tri_n_x, tri_n_y, tri_n_z
|
||||||
|
end
|
||||||
|
|
||||||
|
return vectorMagnitude(n_x, n_y, n_z), itx_x, itx_y, itx_z, n_x, n_y, n_z
|
||||||
|
end
|
||||||
|
|
||||||
|
-- itx is outside triangle
|
||||||
|
-- find points on all three line segments that are closest to itx
|
||||||
|
-- if distance between itx and one of these three closest points is in range, there is an intersection
|
||||||
|
local radiussq = radius * radius
|
||||||
|
local smallestDist
|
||||||
|
|
||||||
|
local line1_x, line1_y, line1_z = closestPointOnLineSegment(tri_0_x, tri_0_y, tri_0_z, tri_1_x, tri_1_y, tri_1_z, src_x, src_y, src_z)
|
||||||
|
local dist = (src_x - line1_x)^2 + (src_y - line1_y)^2 + (src_z - line1_z)^2
|
||||||
|
if dist <= radiussq then
|
||||||
|
smallestDist = dist
|
||||||
|
itx_x, itx_y, itx_z = line1_x, line1_y, line1_z
|
||||||
|
end
|
||||||
|
|
||||||
|
local line2_x, line2_y, line2_z = closestPointOnLineSegment(tri_1_x, tri_1_y, tri_1_z, tri_2_x, tri_2_y, tri_2_z, src_x, src_y, src_z)
|
||||||
|
local dist = (src_x - line2_x)^2 + (src_y - line2_y)^2 + (src_z - line2_z)^2
|
||||||
|
if (smallestDist and dist < smallestDist or not smallestDist) and dist <= radiussq then
|
||||||
|
smallestDist = dist
|
||||||
|
itx_x, itx_y, itx_z = line2_x, line2_y, line2_z
|
||||||
|
end
|
||||||
|
|
||||||
|
local line3_x, line3_y, line3_z = closestPointOnLineSegment(tri_2_x, tri_2_y, tri_2_z, tri_0_x, tri_0_y, tri_0_z, src_x, src_y, src_z)
|
||||||
|
local dist = (src_x - line3_x)^2 + (src_y - line3_y)^2 + (src_z - line3_z)^2
|
||||||
|
if (smallestDist and dist < smallestDist or not smallestDist) and dist <= radiussq then
|
||||||
|
smallestDist = dist
|
||||||
|
itx_x, itx_y, itx_z = line3_x, line3_y, line3_z
|
||||||
|
end
|
||||||
|
|
||||||
|
if smallestDist then
|
||||||
|
n_x, n_y, n_z = src_x - itx_x, src_y - itx_y, src_z - itx_z
|
||||||
|
|
||||||
|
-- the sphere is inside the triangle, so the normal is zero
|
||||||
|
-- instead, just return the triangle's normal
|
||||||
|
if n_x == 0 and n_y == 0 and n_z == 0 then
|
||||||
|
return vectorMagnitude(n_x, n_y, n_z), itx_x, itx_y, itx_z, tri_n_x, tri_n_y, tri_n_z
|
||||||
|
end
|
||||||
|
|
||||||
|
return vectorMagnitude(n_x, n_y, n_z), itx_x, itx_y, itx_z, n_x, n_y, n_z
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- finds the closest point on the triangle from the source point given
|
||||||
|
--
|
||||||
|
-- sources:
|
||||||
|
-- https://wickedengine.net/2020/04/26/capsule-collision-detection/
|
||||||
|
local function trianglePoint(
|
||||||
|
tri_0_x, tri_0_y, tri_0_z,
|
||||||
|
tri_1_x, tri_1_y, tri_1_z,
|
||||||
|
tri_2_x, tri_2_y, tri_2_z,
|
||||||
|
tri_n_x, tri_n_y, tri_n_z,
|
||||||
|
src_x, src_y, src_z
|
||||||
|
)
|
||||||
|
|
||||||
|
-- recalculate surface normal of this triangle
|
||||||
|
local side1_x, side1_y, side1_z = tri_1_x - tri_0_x, tri_1_y - tri_0_y, tri_1_z - tri_0_z
|
||||||
|
local side2_x, side2_y, side2_z = tri_2_x - tri_0_x, tri_2_y - tri_0_y, tri_2_z - tri_0_z
|
||||||
|
local n_x, n_y, n_z = vectorNormalize(vectorCrossProduct(side1_x, side1_y, side1_z, side2_x, side2_y, side2_z))
|
||||||
|
|
||||||
|
-- distance from src to a vertex on the triangle
|
||||||
|
local dist = vectorDotProduct(src_x - tri_0_x, src_y - tri_0_y, src_z - tri_0_z, n_x, n_y, n_z)
|
||||||
|
|
||||||
|
-- itx stands for intersection
|
||||||
|
local itx_x, itx_y, itx_z = src_x - n_x * dist, src_y - n_y * dist, src_z - n_z * dist
|
||||||
|
|
||||||
|
-- determine whether itx is inside the triangle
|
||||||
|
-- project it onto the triangle and return if this is the case
|
||||||
|
local c0_x, c0_y, c0_z = vectorCrossProduct(itx_x - tri_0_x, itx_y - tri_0_y, itx_z - tri_0_z, tri_1_x - tri_0_x, tri_1_y - tri_0_y, tri_1_z - tri_0_z)
|
||||||
|
local c1_x, c1_y, c1_z = vectorCrossProduct(itx_x - tri_1_x, itx_y - tri_1_y, itx_z - tri_1_z, tri_2_x - tri_1_x, tri_2_y - tri_1_y, tri_2_z - tri_1_z)
|
||||||
|
local c2_x, c2_y, c2_z = vectorCrossProduct(itx_x - tri_2_x, itx_y - tri_2_y, itx_z - tri_2_z, tri_0_x - tri_2_x, tri_0_y - tri_2_y, tri_0_z - tri_2_z)
|
||||||
|
if vectorDotProduct(c0_x, c0_y, c0_z, n_x, n_y, n_z) <= 0
|
||||||
|
and vectorDotProduct(c1_x, c1_y, c1_z, n_x, n_y, n_z) <= 0
|
||||||
|
and vectorDotProduct(c2_x, c2_y, c2_z, n_x, n_y, n_z) <= 0 then
|
||||||
|
n_x, n_y, n_z = src_x - itx_x, src_y - itx_y, src_z - itx_z
|
||||||
|
|
||||||
|
-- the sphere is inside the triangle, so the normal is zero
|
||||||
|
-- instead, just return the triangle's normal
|
||||||
|
if n_x == 0 and n_y == 0 and n_z == 0 then
|
||||||
|
return vectorMagnitude(n_x, n_y, n_z), itx_x, itx_y, itx_z, tri_n_x, tri_n_y, tri_n_z
|
||||||
|
end
|
||||||
|
|
||||||
|
return vectorMagnitude(n_x, n_y, n_z), itx_x, itx_y, itx_z, n_x, n_y, n_z
|
||||||
|
end
|
||||||
|
|
||||||
|
-- itx is outside triangle
|
||||||
|
-- find points on all three line segments that are closest to itx
|
||||||
|
-- if distance between itx and one of these three closest points is in range, there is an intersection
|
||||||
|
local line1_x, line1_y, line1_z = closestPointOnLineSegment(tri_0_x, tri_0_y, tri_0_z, tri_1_x, tri_1_y, tri_1_z, src_x, src_y, src_z)
|
||||||
|
local dist = (src_x - line1_x)^2 + (src_y - line1_y)^2 + (src_z - line1_z)^2
|
||||||
|
local smallestDist = dist
|
||||||
|
itx_x, itx_y, itx_z = line1_x, line1_y, line1_z
|
||||||
|
|
||||||
|
local line2_x, line2_y, line2_z = closestPointOnLineSegment(tri_1_x, tri_1_y, tri_1_z, tri_2_x, tri_2_y, tri_2_z, src_x, src_y, src_z)
|
||||||
|
local dist = (src_x - line2_x)^2 + (src_y - line2_y)^2 + (src_z - line2_z)^2
|
||||||
|
if smallestDist and dist < smallestDist then
|
||||||
|
smallestDist = dist
|
||||||
|
itx_x, itx_y, itx_z = line2_x, line2_y, line2_z
|
||||||
|
end
|
||||||
|
|
||||||
|
local line3_x, line3_y, line3_z = closestPointOnLineSegment(tri_2_x, tri_2_y, tri_2_z, tri_0_x, tri_0_y, tri_0_z, src_x, src_y, src_z)
|
||||||
|
local dist = (src_x - line3_x)^2 + (src_y - line3_y)^2 + (src_z - line3_z)^2
|
||||||
|
if smallestDist and dist < smallestDist then
|
||||||
|
smallestDist = dist
|
||||||
|
itx_x, itx_y, itx_z = line3_x, line3_y, line3_z
|
||||||
|
end
|
||||||
|
|
||||||
|
if smallestDist then
|
||||||
|
n_x, n_y, n_z = src_x - itx_x, src_y - itx_y, src_z - itx_z
|
||||||
|
|
||||||
|
-- the sphere is inside the triangle, so the normal is zero
|
||||||
|
-- instead, just return the triangle's normal
|
||||||
|
if n_x == 0 and n_y == 0 and n_z == 0 then
|
||||||
|
return vectorMagnitude(n_x, n_y, n_z), itx_x, itx_y, itx_z, tri_n_x, tri_n_y, tri_n_z
|
||||||
|
end
|
||||||
|
|
||||||
|
return vectorMagnitude(n_x, n_y, n_z), itx_x, itx_y, itx_z, n_x, n_y, n_z
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- finds the collision point between a triangle and a capsule
|
||||||
|
-- capsules are defined with two points and a radius
|
||||||
|
--
|
||||||
|
-- sources:
|
||||||
|
-- https://wickedengine.net/2020/04/26/capsule-collision-detection/
|
||||||
|
local function triangleCapsule(
|
||||||
|
tri_0_x, tri_0_y, tri_0_z,
|
||||||
|
tri_1_x, tri_1_y, tri_1_z,
|
||||||
|
tri_2_x, tri_2_y, tri_2_z,
|
||||||
|
n_x, n_y, n_z,
|
||||||
|
tip_x, tip_y, tip_z,
|
||||||
|
base_x, base_y, base_z,
|
||||||
|
a_x, a_y, a_z,
|
||||||
|
b_x, b_y, b_z,
|
||||||
|
capn_x, capn_y, capn_z,
|
||||||
|
radius
|
||||||
|
)
|
||||||
|
|
||||||
|
-- find the normal of this triangle
|
||||||
|
-- tbd if necessary, this sometimes fixes weird edgecases
|
||||||
|
local side1_x, side1_y, side1_z = tri_1_x - tri_0_x, tri_1_y - tri_0_y, tri_1_z - tri_0_z
|
||||||
|
local side2_x, side2_y, side2_z = tri_2_x - tri_0_x, tri_2_y - tri_0_y, tri_2_z - tri_0_z
|
||||||
|
local n_x, n_y, n_z = vectorNormalize(vectorCrossProduct(side1_x, side1_y, side1_z, side2_x, side2_y, side2_z))
|
||||||
|
|
||||||
|
local dotOfNormals = math.abs(vectorDotProduct(n_x, n_y, n_z, capn_x, capn_y, capn_z))
|
||||||
|
|
||||||
|
-- default reference point to an arbitrary point on the triangle
|
||||||
|
-- for when dotOfNormals is 0, because then the capsule is parallel to the triangle
|
||||||
|
local ref_x, ref_y, ref_z = tri_0_x, tri_0_y, tri_0_z
|
||||||
|
|
||||||
|
if dotOfNormals > 0 then
|
||||||
|
-- capsule is not parallel to the triangle's plane
|
||||||
|
-- find where the capsule's normal vector intersects the triangle's plane
|
||||||
|
local t = vectorDotProduct(n_x, n_y, n_z, (tri_0_x - base_x) / dotOfNormals, (tri_0_y - base_y) / dotOfNormals, (tri_0_z - base_z) / dotOfNormals)
|
||||||
|
local plane_itx_x, plane_itx_y, plane_itx_z = base_x + capn_x*t, base_y + capn_y*t, base_z + capn_z*t
|
||||||
|
local _
|
||||||
|
|
||||||
|
-- then clamp that plane intersect point onto the triangle itself
|
||||||
|
-- this is the new reference point
|
||||||
|
_, ref_x, ref_y, ref_z = trianglePoint(
|
||||||
|
tri_0_x, tri_0_y, tri_0_z,
|
||||||
|
tri_1_x, tri_1_y, tri_1_z,
|
||||||
|
tri_2_x, tri_2_y, tri_2_z,
|
||||||
|
n_x, n_y, n_z,
|
||||||
|
plane_itx_x, plane_itx_y, plane_itx_z
|
||||||
|
)
|
||||||
|
end
|
||||||
|
|
||||||
|
-- find the closest point on the capsule line to the reference point
|
||||||
|
local c_x, c_y, c_z = closestPointOnLineSegment(a_x, a_y, a_z, b_x, b_y, b_z, ref_x, ref_y, ref_z)
|
||||||
|
|
||||||
|
-- do a sphere cast from that closest point to the triangle and return the result
|
||||||
|
return triangleSphere(
|
||||||
|
tri_0_x, tri_0_y, tri_0_z,
|
||||||
|
tri_1_x, tri_1_y, tri_1_z,
|
||||||
|
tri_2_x, tri_2_y, tri_2_z,
|
||||||
|
n_x, n_y, n_z,
|
||||||
|
c_x, c_y, c_z, radius
|
||||||
|
)
|
||||||
|
end
|
||||||
|
|
||||||
|
-- finds whether or not a triangle is inside an AABB
|
||||||
|
local function triangleAABB(
|
||||||
|
tri_0_x, tri_0_y, tri_0_z,
|
||||||
|
tri_1_x, tri_1_y, tri_1_z,
|
||||||
|
tri_2_x, tri_2_y, tri_2_z,
|
||||||
|
n_x, n_y, n_z,
|
||||||
|
min_x, min_y, min_z,
|
||||||
|
max_x, max_y, max_z
|
||||||
|
)
|
||||||
|
|
||||||
|
-- get the closest point from the centerpoint on the triangle
|
||||||
|
local len,x,y,z,nx,ny,nz = trianglePoint(
|
||||||
|
tri_0_x, tri_0_y, tri_0_z,
|
||||||
|
tri_1_x, tri_1_y, tri_1_z,
|
||||||
|
tri_2_x, tri_2_y, tri_2_z,
|
||||||
|
n_x, n_y, n_z,
|
||||||
|
(min_x+max_x)*0.5, (min_y+max_y)*0.5, (min_z+max_z)*0.5
|
||||||
|
)
|
||||||
|
|
||||||
|
-- if the point is not inside the AABB, return nothing
|
||||||
|
if not (x >= min_x and x <= max_x) then return end
|
||||||
|
if not (y >= min_y and y <= max_y) then return end
|
||||||
|
if not (z >= min_z and z <= max_z) then return end
|
||||||
|
|
||||||
|
-- the point is inside the AABB, return the collision data
|
||||||
|
return len, x,y,z, nx,ny,nz
|
||||||
|
end
|
||||||
|
|
||||||
|
-- runs a given intersection function on all of the triangles made up of a given vert table
|
||||||
|
local function findClosest(self, verts, func, ...)
|
||||||
|
-- declare the variables that will be returned by the function
|
||||||
|
local finalLength, where_x, where_y, where_z, norm_x, norm_y, norm_z
|
||||||
|
|
||||||
|
-- cache references to this model's properties for efficiency
|
||||||
|
local translation_x = self.translation[1]
|
||||||
|
local translation_y = self.translation[2]
|
||||||
|
local translation_z = self.translation[3]
|
||||||
|
local scale_x = self.scale[1]
|
||||||
|
local scale_y = self.scale[2]
|
||||||
|
local scale_z = self.scale[3]
|
||||||
|
|
||||||
|
for v=1, #verts, 3 do
|
||||||
|
-- apply the function given with the arguments given
|
||||||
|
-- also supply the points of the current triangle
|
||||||
|
local n_x, n_y, n_z = vectorNormalize(
|
||||||
|
verts[v][6]*scale_x,
|
||||||
|
verts[v][7]*scale_x,
|
||||||
|
verts[v][8]*scale_x
|
||||||
|
)
|
||||||
|
|
||||||
|
local length, wx,wy,wz, nx,ny,nz = func(
|
||||||
|
verts[v][1]*scale_x + translation_x,
|
||||||
|
verts[v][2]*scale_y + translation_y,
|
||||||
|
verts[v][3]*scale_z + translation_z,
|
||||||
|
verts[v+1][1]*scale_x + translation_x,
|
||||||
|
verts[v+1][2]*scale_y + translation_y,
|
||||||
|
verts[v+1][3]*scale_z + translation_z,
|
||||||
|
verts[v+2][1]*scale_x + translation_x,
|
||||||
|
verts[v+2][2]*scale_y + translation_y,
|
||||||
|
verts[v+2][3]*scale_z + translation_z,
|
||||||
|
n_x,
|
||||||
|
n_y,
|
||||||
|
n_z,
|
||||||
|
...
|
||||||
|
)
|
||||||
|
|
||||||
|
-- if something was hit
|
||||||
|
-- and either the finalLength is not yet defined or the new length is closer
|
||||||
|
-- then update the collision information
|
||||||
|
if length and (not finalLength or length < finalLength) then
|
||||||
|
finalLength = length
|
||||||
|
where_x = wx
|
||||||
|
where_y = wy
|
||||||
|
where_z = wz
|
||||||
|
norm_x = nx
|
||||||
|
norm_y = ny
|
||||||
|
norm_z = nz
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- normalize the normal vector before it is returned
|
||||||
|
if finalLength then
|
||||||
|
norm_x, norm_y, norm_z = vectorNormalize(norm_x, norm_y, norm_z)
|
||||||
|
end
|
||||||
|
|
||||||
|
-- return all the information in a standardized way
|
||||||
|
return finalLength, where_x, where_y, where_z, norm_x, norm_y, norm_z
|
||||||
|
end
|
||||||
|
|
||||||
|
function collisions:rayIntersection(src_x, src_y, src_z, dir_x, dir_y, dir_z)
|
||||||
|
return findClosest(self, self.verts, triangleRay, src_x, src_y, src_z, dir_x, dir_y, dir_z)
|
||||||
|
end
|
||||||
|
|
||||||
|
function collisions:sphereIntersection(src_x, src_y, src_z, radius)
|
||||||
|
return findClosest(self, self.verts, triangleSphere, src_x, src_y, src_z, radius)
|
||||||
|
end
|
||||||
|
|
||||||
|
function collisions:closestPoint(src_x, src_y, src_z)
|
||||||
|
return findClosest(self, self.verts, trianglePoint, src_x, src_y, src_z)
|
||||||
|
end
|
||||||
|
|
||||||
|
function collisions:capsuleIntersection(tip_x, tip_y, tip_z, base_x, base_y, base_z, radius)
|
||||||
|
-- the normal vector coming out the tip of the capsule
|
||||||
|
local norm_x, norm_y, norm_z = vectorNormalize(tip_x - base_x, tip_y - base_y, tip_z - base_z)
|
||||||
|
|
||||||
|
-- the base and tip, inset by the radius
|
||||||
|
-- these two coordinates are the actual extent of the capsule sphere line
|
||||||
|
local a_x, a_y, a_z = base_x + norm_x*radius, base_y + norm_y*radius, base_z + norm_z*radius
|
||||||
|
local b_x, b_y, b_z = tip_x - norm_x*radius, tip_y - norm_y*radius, tip_z - norm_z*radius
|
||||||
|
|
||||||
|
return findClosest(
|
||||||
|
self,
|
||||||
|
self.verts,
|
||||||
|
triangleCapsule,
|
||||||
|
tip_x, tip_y, tip_z,
|
||||||
|
base_x, base_y, base_z,
|
||||||
|
a_x, a_y, a_z,
|
||||||
|
b_x, b_y, b_z,
|
||||||
|
norm_x, norm_y, norm_z,
|
||||||
|
radius
|
||||||
|
)
|
||||||
|
end
|
||||||
|
|
||||||
|
----------------------------------------------------------------------------------------------------
|
||||||
|
-- AABB functions
|
||||||
|
----------------------------------------------------------------------------------------------------
|
||||||
|
-- generate an axis-aligned bounding box
|
||||||
|
-- very useful for less precise collisions, like hitboxes
|
||||||
|
--
|
||||||
|
-- translation, and scale are not included here because they are computed on the fly instead
|
||||||
|
-- rotation is never included because AABBs are axis-aligned
|
||||||
|
function collisions:generateAABB()
|
||||||
|
local aabb = {
|
||||||
|
min = {
|
||||||
|
math.huge,
|
||||||
|
math.huge,
|
||||||
|
math.huge,
|
||||||
|
},
|
||||||
|
max = {
|
||||||
|
-1*math.huge,
|
||||||
|
-1*math.huge,
|
||||||
|
-1*math.huge
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for _,vert in ipairs(self.verts) do
|
||||||
|
aabb.min[1] = math.min(aabb.min[1], vert[1])
|
||||||
|
aabb.min[2] = math.min(aabb.min[2], vert[2])
|
||||||
|
aabb.min[3] = math.min(aabb.min[3], vert[3])
|
||||||
|
aabb.max[1] = math.max(aabb.max[1], vert[1])
|
||||||
|
aabb.max[2] = math.max(aabb.max[2], vert[2])
|
||||||
|
aabb.max[3] = math.max(aabb.max[3], vert[3])
|
||||||
|
end
|
||||||
|
|
||||||
|
self.aabb = aabb
|
||||||
|
return aabb
|
||||||
|
end
|
||||||
|
|
||||||
|
-- check if two models have intersecting AABBs
|
||||||
|
-- other argument is another model
|
||||||
|
--
|
||||||
|
-- sources:
|
||||||
|
-- https://developer.mozilla.org/en-US/docs/Games/Techniques/3D_collision_detection
|
||||||
|
function collisions:isIntersectionAABB(other)
|
||||||
|
-- cache these references
|
||||||
|
local a_min = self.aabb.min
|
||||||
|
local a_max = self.aabb.max
|
||||||
|
local b_min = other.aabb.min
|
||||||
|
local b_max = other.aabb.max
|
||||||
|
|
||||||
|
-- make shorter variable names for translation
|
||||||
|
local a_1 = self.translation[1]
|
||||||
|
local a_2 = self.translation[2]
|
||||||
|
local a_3 = self.translation[3]
|
||||||
|
local b_1 = other.translation[1]
|
||||||
|
local b_2 = other.translation[2]
|
||||||
|
local b_3 = other.translation[3]
|
||||||
|
|
||||||
|
-- do the calculation
|
||||||
|
local x = a_min[1]*self.scale[1] + a_1 <= b_max[1]*other.scale[1] + b_1 and a_max[1]*self.scale[1] + a_1 >= b_min[1]*other.scale[1] + b_1
|
||||||
|
local y = a_min[2]*self.scale[2] + a_2 <= b_max[2]*other.scale[2] + b_2 and a_max[2]*self.scale[2] + a_2 >= b_min[2]*other.scale[2] + b_2
|
||||||
|
local z = a_min[3]*self.scale[3] + a_3 <= b_max[3]*other.scale[3] + b_3 and a_max[3]*self.scale[3] + a_3 >= b_min[3]*other.scale[3] + b_3
|
||||||
|
return x and y and z
|
||||||
|
end
|
||||||
|
|
||||||
|
-- check if a given point is inside the model's AABB
|
||||||
|
function collisions:isPointInsideAABB(x,y,z)
|
||||||
|
local min = self.aabb.min
|
||||||
|
local max = self.aabb.max
|
||||||
|
|
||||||
|
local in_x = x >= min[1]*self.scale[1] + self.translation[1] and x <= max[1]*self.scale[1] + self.translation[1]
|
||||||
|
local in_y = y >= min[2]*self.scale[2] + self.translation[2] and y <= max[2]*self.scale[2] + self.translation[2]
|
||||||
|
local in_z = z >= min[3]*self.scale[3] + self.translation[3] and z <= max[3]*self.scale[3] + self.translation[3]
|
||||||
|
|
||||||
|
return in_x and in_y and in_z
|
||||||
|
end
|
||||||
|
|
||||||
|
-- returns the distance from the point given to the origin of the model
|
||||||
|
function collisions:getDistanceFrom(x,y,z)
|
||||||
|
return math.sqrt((x - self.translation[1])^2 + (y - self.translation[2])^2 + (z - self.translation[3])^2)
|
||||||
|
end
|
||||||
|
|
||||||
|
-- AABB - ray intersection
|
||||||
|
-- based off of ray - AABB intersection from excessive's CPML library
|
||||||
|
--
|
||||||
|
-- sources:
|
||||||
|
-- https://github.com/excessive/cpml/blob/master/modules/intersect.lua
|
||||||
|
-- http://gamedev.stackexchange.com/a/18459
|
||||||
|
function collisions:rayIntersectionAABB(src_1, src_2, src_3, dir_1, dir_2, dir_3)
|
||||||
|
local dir_1, dir_2, dir_3 = vectorNormalize(dir_1, dir_2, dir_3)
|
||||||
|
|
||||||
|
local t1 = (self.aabb.min[1]*self.scale[1] + self.translation[1] - src_1) / dir_1
|
||||||
|
local t2 = (self.aabb.max[1]*self.scale[1] + self.translation[1] - src_1) / dir_1
|
||||||
|
local t3 = (self.aabb.min[2]*self.scale[2] + self.translation[2] - src_2) / dir_2
|
||||||
|
local t4 = (self.aabb.max[2]*self.scale[2] + self.translation[2] - src_2) / dir_2
|
||||||
|
local t5 = (self.aabb.min[3]*self.scale[3] + self.translation[3] - src_3) / dir_3
|
||||||
|
local t6 = (self.aabb.max[3]*self.scale[3] + self.translation[3] - src_3) / dir_3
|
||||||
|
|
||||||
|
local min = math.min
|
||||||
|
local max = math.max
|
||||||
|
local tmin = max(max(min(t1, t2), min(t3, t4)), min(t5, t6))
|
||||||
|
local tmax = min(min(max(t1, t2), max(t3, t4)), max(t5, t6))
|
||||||
|
|
||||||
|
-- ray is intersecting AABB, but whole AABB is behind us
|
||||||
|
if tmax < 0 then
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
|
||||||
|
-- ray does not intersect AABB
|
||||||
|
if tmin > tmax then
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
|
||||||
|
-- return distance and the collision coordinates
|
||||||
|
local where_1 = src_1 + dir_1 * tmin
|
||||||
|
local where_2 = src_2 + dir_2 * tmin
|
||||||
|
local where_3 = src_3 + dir_3 * tmin
|
||||||
|
return tmin, where_1, where_2, where_3
|
||||||
|
end
|
||||||
|
|
||||||
|
return collisions
|
|
@ -0,0 +1,62 @@
|
||||||
|
-- written by groverbuger for g3d
|
||||||
|
-- february 2021
|
||||||
|
-- MIT license
|
||||||
|
|
||||||
|
--[[
|
||||||
|
__ __
|
||||||
|
/'__`\ /\ \
|
||||||
|
__ /\_\L\ \ \_\ \
|
||||||
|
/'_ `\/_/_\_<_ /'_` \
|
||||||
|
/\ \L\ \/\ \L\ \/\ \L\ \
|
||||||
|
\ \____ \ \____/\ \___,_\
|
||||||
|
\/___L\ \/___/ \/__,_ /
|
||||||
|
/\____/
|
||||||
|
\_/__/
|
||||||
|
--]]
|
||||||
|
|
||||||
|
-- add the path to g3d to the global namespace
|
||||||
|
-- so submodules can know how to load their dependencies
|
||||||
|
G3D_PATH = ...
|
||||||
|
|
||||||
|
local g3d = {
|
||||||
|
_VERSION = "g3d 1.3",
|
||||||
|
_DESCRIPTION = "Simple and easy 3D engine for LÖVE.",
|
||||||
|
_URL = "https://github.com/groverburger/g3d",
|
||||||
|
_LICENSE = [[
|
||||||
|
MIT License
|
||||||
|
|
||||||
|
Copyright (c) 2021 groverburger
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
|
]],
|
||||||
|
}
|
||||||
|
|
||||||
|
g3d.newModel = require(G3D_PATH .. "/model")
|
||||||
|
g3d.camera = require(G3D_PATH .. "/camera")
|
||||||
|
g3d.camera.updateProjectionMatrix()
|
||||||
|
g3d.camera.updateViewMatrix()
|
||||||
|
|
||||||
|
-- so that far polygons don't overlap near polygons
|
||||||
|
love.graphics.setDepthMode("lequal", true)
|
||||||
|
|
||||||
|
-- get rid of G3D_PATH from the global namespace
|
||||||
|
-- so the end user doesn't have to worry about any globals
|
||||||
|
G3D_PATH = nil
|
||||||
|
|
||||||
|
return g3d
|
|
@ -0,0 +1,183 @@
|
||||||
|
-- written by groverbuger for g3d
|
||||||
|
-- february 2021
|
||||||
|
-- MIT license
|
||||||
|
|
||||||
|
local vectors = require(G3D_PATH .. "/vectors")
|
||||||
|
local vectorCrossProduct = vectors.crossProduct
|
||||||
|
local vectorDotProduct = vectors.dotProduct
|
||||||
|
local vectorNormalize = vectors.normalize
|
||||||
|
|
||||||
|
----------------------------------------------------------------------------------------------------
|
||||||
|
-- matrix class
|
||||||
|
----------------------------------------------------------------------------------------------------
|
||||||
|
-- matrices are 16 numbers in table, representing a 4x4 matrix
|
||||||
|
|
||||||
|
local matrix = {}
|
||||||
|
matrix.__index = matrix
|
||||||
|
|
||||||
|
local function newMatrix()
|
||||||
|
local self = setmetatable({}, matrix)
|
||||||
|
self:identity()
|
||||||
|
return self
|
||||||
|
end
|
||||||
|
|
||||||
|
function matrix:identity()
|
||||||
|
self[1], self[2], self[3], self[4] = 1, 0, 0, 0
|
||||||
|
self[5], self[6], self[7], self[8] = 0, 1, 0, 0
|
||||||
|
self[9], self[10], self[11], self[12] = 0, 0, 1, 0
|
||||||
|
self[13], self[14], self[15], self[16] = 0, 0, 0, 1
|
||||||
|
end
|
||||||
|
|
||||||
|
function matrix:getValueAt(x,y)
|
||||||
|
return self[x + (y-1)*4]
|
||||||
|
end
|
||||||
|
|
||||||
|
-- multiply this matrix and another matrix together
|
||||||
|
-- this matrix becomes the result of the multiplication operation
|
||||||
|
local orig = newMatrix()
|
||||||
|
function matrix:multiply(other)
|
||||||
|
-- hold the values of the original matrix
|
||||||
|
-- because the matrix is changing while it is used
|
||||||
|
for i=1, 16 do
|
||||||
|
orig[i] = self[i]
|
||||||
|
end
|
||||||
|
|
||||||
|
local i = 1
|
||||||
|
for y=1, 4 do
|
||||||
|
for x=1, 4 do
|
||||||
|
self[i] = orig:getValueAt(1,y)*other:getValueAt(x,1)
|
||||||
|
self[i] = self[i] + orig:getValueAt(2,y)*other:getValueAt(x,2)
|
||||||
|
self[i] = self[i] + orig:getValueAt(3,y)*other:getValueAt(x,3)
|
||||||
|
self[i] = self[i] + orig:getValueAt(4,y)*other:getValueAt(x,4)
|
||||||
|
i = i + 1
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function matrix:__tostring()
|
||||||
|
local str = ""
|
||||||
|
|
||||||
|
for i=1, 16 do
|
||||||
|
str = str .. self[i]
|
||||||
|
|
||||||
|
if i%4 == 0 and i > 1 then
|
||||||
|
str = str .. "\n"
|
||||||
|
else
|
||||||
|
str = str .. ", "
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
return str
|
||||||
|
end
|
||||||
|
|
||||||
|
----------------------------------------------------------------------------------------------------
|
||||||
|
-- transformation, projection, and rotation matrices
|
||||||
|
----------------------------------------------------------------------------------------------------
|
||||||
|
-- the three most important matrices for 3d graphics
|
||||||
|
-- these three matrices are all you need to write a simple 3d shader
|
||||||
|
|
||||||
|
-- returns a transformation matrix
|
||||||
|
-- translation and rotation are 3d vectors
|
||||||
|
local temp = newMatrix()
|
||||||
|
function matrix:setTransformationMatrix(translation, rotation, scale)
|
||||||
|
self:identity()
|
||||||
|
|
||||||
|
-- translations
|
||||||
|
self[4] = translation[1]
|
||||||
|
self[8] = translation[2]
|
||||||
|
self[12] = translation[3]
|
||||||
|
|
||||||
|
-- rotations
|
||||||
|
if #rotation == 3 then
|
||||||
|
-- use 3D rotation vector as euler angles
|
||||||
|
-- x
|
||||||
|
temp:identity()
|
||||||
|
temp[6] = math.cos(rotation[1])
|
||||||
|
temp[7] = -1*math.sin(rotation[1])
|
||||||
|
temp[10] = math.sin(rotation[1])
|
||||||
|
temp[11] = math.cos(rotation[1])
|
||||||
|
self:multiply(temp)
|
||||||
|
|
||||||
|
-- y
|
||||||
|
temp:identity()
|
||||||
|
temp[1] = math.cos(rotation[2])
|
||||||
|
temp[3] = math.sin(rotation[2])
|
||||||
|
temp[9] = -1*math.sin(rotation[2])
|
||||||
|
temp[11] = math.cos(rotation[2])
|
||||||
|
self:multiply(temp)
|
||||||
|
|
||||||
|
-- z
|
||||||
|
temp:identity()
|
||||||
|
temp[1] = math.cos(rotation[3])
|
||||||
|
temp[2] = -1*math.sin(rotation[3])
|
||||||
|
temp[5] = math.sin(rotation[3])
|
||||||
|
temp[6] = math.cos(rotation[3])
|
||||||
|
self:multiply(temp)
|
||||||
|
else
|
||||||
|
-- use 4D rotation vector as quaternion
|
||||||
|
temp:identity()
|
||||||
|
|
||||||
|
local qx,qy,qz,qw = rotation[1], rotation[2], rotation[3], rotation[4]
|
||||||
|
temp[1], temp[2], temp[3] = 1 - 2*qy^2 - 2*qz^2, 2*qx*qy - 2*qz*qw, 2*qx*qz + 2*qy*qw
|
||||||
|
temp[5], temp[6], temp[7] = 2*qx*qy + 2*qz*qw, 1 - 2*qx^2 - 2*qz^2, 2*qy*qz - 2*qx*qw
|
||||||
|
temp[9], temp[10], temp[11] = 2*qx*qz - 2*qy*qw, 2*qy*qz + 2*qx*qw, 1 - 2*qx^2 - 2*qy^2
|
||||||
|
|
||||||
|
self:multiply(temp)
|
||||||
|
end
|
||||||
|
|
||||||
|
-- scale
|
||||||
|
temp:identity()
|
||||||
|
temp[1] = scale[1]
|
||||||
|
temp[6] = scale[2]
|
||||||
|
temp[11] = scale[3]
|
||||||
|
self:multiply(temp)
|
||||||
|
|
||||||
|
return self
|
||||||
|
end
|
||||||
|
|
||||||
|
-- returns a perspective projection matrix
|
||||||
|
-- (things farther away appear smaller)
|
||||||
|
-- all arguments are scalars aka normal numbers
|
||||||
|
-- aspectRatio is defined as window width divided by window height
|
||||||
|
function matrix:setProjectionMatrix(fov, near, far, aspectRatio)
|
||||||
|
local top = near * math.tan(fov/2)
|
||||||
|
local bottom = -1*top
|
||||||
|
local right = top * aspectRatio
|
||||||
|
local left = -1*right
|
||||||
|
|
||||||
|
self[1], self[2], self[3], self[4] = 2*near/(right-left), 0, (right+left)/(right-left), 0
|
||||||
|
self[5], self[6], self[7], self[8] = 0, 2*near/(top-bottom), (top+bottom)/(top-bottom), 0
|
||||||
|
self[9], self[10], self[11], self[12] = 0, 0, -1*(far+near)/(far-near), -2*far*near/(far-near)
|
||||||
|
self[13], self[14], self[15], self[16] = 0, 0, -1, 0
|
||||||
|
end
|
||||||
|
|
||||||
|
-- returns an orthographic projection matrix
|
||||||
|
-- (things farther away are the same size as things closer)
|
||||||
|
-- all arguments are scalars aka normal numbers
|
||||||
|
-- aspectRatio is defined as window width divided by window height
|
||||||
|
function matrix:setOrthographicMatrix(fov, size, near, far, aspectRatio)
|
||||||
|
local top = size * math.tan(fov/2)
|
||||||
|
local bottom = -1*top
|
||||||
|
local right = top * aspectRatio
|
||||||
|
local left = -1*right
|
||||||
|
|
||||||
|
self[1], self[2], self[3], self[4] = 2/(right-left), 0, 0, -1*(right+left)/(right-left)
|
||||||
|
self[5], self[6], self[7], self[8] = 0, 2/(top-bottom), 0, -1*(top+bottom)/(top-bottom)
|
||||||
|
self[9], self[10], self[11], self[12] = 0, 0, -2/(far-near), -(far+near)/(far-near)
|
||||||
|
self[13], self[14], self[15], self[16] = 0, 0, 0, 1
|
||||||
|
end
|
||||||
|
|
||||||
|
-- returns a view matrix
|
||||||
|
-- eye, target, and down are all 3d vectors
|
||||||
|
function matrix:setViewMatrix(eye, target, down)
|
||||||
|
local z_1, z_2, z_3 = vectorNormalize(eye[1] - target[1], eye[2] - target[2], eye[3] - target[3])
|
||||||
|
local x_1, x_2, x_3 = vectorNormalize(vectorCrossProduct(down[1], down[2], down[3], z_1, z_2, z_3))
|
||||||
|
local y_1, y_2, y_3 = vectorCrossProduct(z_1, z_2, z_3, x_1, x_2, x_3)
|
||||||
|
|
||||||
|
self[1], self[2], self[3], self[4] = x_1, x_2, x_3, -1*vectorDotProduct(x_1, x_2, x_3, eye[1], eye[2], eye[3])
|
||||||
|
self[5], self[6], self[7], self[8] = y_1, y_2, y_3, -1*vectorDotProduct(y_1, y_2, y_3, eye[1], eye[2], eye[3])
|
||||||
|
self[9], self[10], self[11], self[12] = z_1, z_2, z_3, -1*vectorDotProduct(z_1, z_2, z_3, eye[1], eye[2], eye[3])
|
||||||
|
self[13], self[14], self[15], self[16] = 0, 0, 0, 1
|
||||||
|
end
|
||||||
|
|
||||||
|
return newMatrix
|
|
@ -0,0 +1,155 @@
|
||||||
|
-- written by groverbuger for g3d
|
||||||
|
-- february 2021
|
||||||
|
-- MIT license
|
||||||
|
|
||||||
|
local newMatrix = require(G3D_PATH .. "/matrices")
|
||||||
|
local loadObjFile = require(G3D_PATH .. "/objloader")
|
||||||
|
local collisions = require(G3D_PATH .. "/collisions")
|
||||||
|
local vectors = require(G3D_PATH .. "/vectors")
|
||||||
|
local vectorCrossProduct = vectors.crossProduct
|
||||||
|
local vectorNormalize = vectors.normalize
|
||||||
|
|
||||||
|
----------------------------------------------------------------------------------------------------
|
||||||
|
-- define a model class
|
||||||
|
----------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
local model = {}
|
||||||
|
model.__index = model
|
||||||
|
|
||||||
|
-- define some default properties that every model should inherit
|
||||||
|
-- that being the standard vertexFormat and basic 3D shader
|
||||||
|
model.vertexFormat = {
|
||||||
|
{"VertexPosition", "float", 3},
|
||||||
|
{"VertexTexCoord", "float", 2},
|
||||||
|
{"VertexNormal", "float", 3},
|
||||||
|
{"VertexColor", "byte", 4},
|
||||||
|
}
|
||||||
|
model.shader = require(G3D_PATH .. "/shader")
|
||||||
|
|
||||||
|
-- model class imports functions from the collisions library
|
||||||
|
for key,value in pairs(collisions) do
|
||||||
|
model[key] = value
|
||||||
|
end
|
||||||
|
|
||||||
|
-- this returns a new instance of the model class
|
||||||
|
-- a model must be given a .obj file or equivalent lua table, and a texture
|
||||||
|
-- translation, rotation, and scale are all 3d vectors and are all optional
|
||||||
|
local function newModel(verts, texture, translation, rotation, scale)
|
||||||
|
local self = setmetatable({}, model)
|
||||||
|
|
||||||
|
-- if verts is a string, use it as a path to a .obj file
|
||||||
|
-- otherwise verts is a table, use it as a model defintion
|
||||||
|
if type(verts) == "string" then
|
||||||
|
verts = loadObjFile(verts)
|
||||||
|
end
|
||||||
|
assert(verts and type(verts) == "table", "Invalid vertices given to newModel")
|
||||||
|
|
||||||
|
-- if texture is a string, use it as a path to an image file
|
||||||
|
-- otherwise texture is already an image, so don't bother
|
||||||
|
if type(texture) == "string" then
|
||||||
|
texture = love.graphics.newImage(texture)
|
||||||
|
end
|
||||||
|
|
||||||
|
-- initialize my variables
|
||||||
|
self.verts = verts
|
||||||
|
self.texture = texture
|
||||||
|
self.mesh = love.graphics.newMesh(self.vertexFormat, self.verts, "triangles")
|
||||||
|
self.mesh:setTexture(self.texture)
|
||||||
|
self.matrix = newMatrix()
|
||||||
|
self:setTransform(translation or {0,0,0}, rotation or {0,0,0}, scale or {1,1,1})
|
||||||
|
self:generateAABB()
|
||||||
|
|
||||||
|
return self
|
||||||
|
end
|
||||||
|
|
||||||
|
-- populate model's normals in model's mesh automatically
|
||||||
|
-- if true is passed in, then the normals are all flipped
|
||||||
|
function model:makeNormals(isFlipped)
|
||||||
|
for i=1, #self.verts, 3 do
|
||||||
|
local vp = self.verts[i]
|
||||||
|
local v = self.verts[i+1]
|
||||||
|
local vn = self.verts[i+2]
|
||||||
|
|
||||||
|
local n_1, n_2, n_3 = vectorNormalize(vectorCrossProduct(v[1]-vp[1], v[2]-vp[2], v[3]-vp[3], vn[1]-v[1], vn[2]-v[2], vn[3]-v[3]))
|
||||||
|
local flippage = isFlipped and -1 or 1
|
||||||
|
n_1 = n_1 * flippage
|
||||||
|
n_2 = n_2 * flippage
|
||||||
|
n_3 = n_3 * flippage
|
||||||
|
|
||||||
|
vp[6], v[6], vn[6] = n_1, n_1, n_1
|
||||||
|
vp[7], v[7], vn[7] = n_2, n_2, n_2
|
||||||
|
vp[8], v[8], vn[8] = n_3, n_3, n_3
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- move and rotate given two 3d vectors
|
||||||
|
function model:setTransform(translation, rotation, scale)
|
||||||
|
self.translation = translation or self.translation
|
||||||
|
self.rotation = rotation or self.rotation
|
||||||
|
self.scale = scale or self.scale
|
||||||
|
self:updateMatrix()
|
||||||
|
end
|
||||||
|
|
||||||
|
-- move given one 3d vector
|
||||||
|
function model:setTranslation(tx,ty,tz)
|
||||||
|
self.translation[1] = tx
|
||||||
|
self.translation[2] = ty
|
||||||
|
self.translation[3] = tz
|
||||||
|
self:updateMatrix()
|
||||||
|
end
|
||||||
|
|
||||||
|
-- rotate given one 3d vector
|
||||||
|
-- using euler angles
|
||||||
|
function model:setRotation(rx,ry,rz)
|
||||||
|
self.rotation[1] = rx
|
||||||
|
self.rotation[2] = ry
|
||||||
|
self.rotation[3] = rz
|
||||||
|
self.rotation[4] = nil
|
||||||
|
self:updateMatrix()
|
||||||
|
end
|
||||||
|
|
||||||
|
-- create a quaternion from an axis and an angle
|
||||||
|
function model:setAxisAngleRotation(x,y,z,angle)
|
||||||
|
x,y,z = vectorNormalize(x,y,z)
|
||||||
|
angle = angle / 2
|
||||||
|
|
||||||
|
self.rotation[1] = x * math.sin(angle)
|
||||||
|
self.rotation[2] = y * math.sin(angle)
|
||||||
|
self.rotation[3] = z * math.sin(angle)
|
||||||
|
self.rotation[4] = math.cos(angle)
|
||||||
|
|
||||||
|
self:updateMatrix()
|
||||||
|
end
|
||||||
|
|
||||||
|
-- rotate given one quaternion
|
||||||
|
function model:setQuaternionRotation(x,y,z,w)
|
||||||
|
self.rotation[1] = x
|
||||||
|
self.rotation[2] = y
|
||||||
|
self.rotation[3] = z
|
||||||
|
self.rotation[4] = w
|
||||||
|
self:updateMatrix()
|
||||||
|
end
|
||||||
|
|
||||||
|
-- resize model's matrix based on a given 3d vector
|
||||||
|
function model:setScale(sx,sy,sz)
|
||||||
|
self.scale[1] = sx
|
||||||
|
self.scale[2] = sy or sx
|
||||||
|
self.scale[3] = sz or sx
|
||||||
|
self:updateMatrix()
|
||||||
|
end
|
||||||
|
|
||||||
|
-- update the model's transformation matrix
|
||||||
|
function model:updateMatrix()
|
||||||
|
self.matrix:setTransformationMatrix(self.translation, self.rotation, self.scale)
|
||||||
|
end
|
||||||
|
|
||||||
|
-- draw the model
|
||||||
|
function model:draw(shader)
|
||||||
|
local shader = shader or self.shader
|
||||||
|
love.graphics.setShader(shader)
|
||||||
|
shader:send("modelMatrix", self.matrix)
|
||||||
|
love.graphics.draw(self.mesh)
|
||||||
|
love.graphics.setShader()
|
||||||
|
end
|
||||||
|
|
||||||
|
return newModel
|
|
@ -0,0 +1,125 @@
|
||||||
|
-- written by groverbuger for g3d
|
||||||
|
-- february 2021
|
||||||
|
-- MIT license
|
||||||
|
|
||||||
|
----------------------------------------------------------------------------------------------------
|
||||||
|
-- simple obj loader
|
||||||
|
----------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
-- stitch two tables together and return the result
|
||||||
|
local function concatTables(t1,t2,t3)
|
||||||
|
local ret = {}
|
||||||
|
|
||||||
|
for i,v in ipairs(t1) do
|
||||||
|
ret[#ret +1] = v
|
||||||
|
end
|
||||||
|
for i,v in ipairs(t2) do
|
||||||
|
ret[#ret +1] = v
|
||||||
|
end
|
||||||
|
for i,v in ipairs(t3) do
|
||||||
|
ret[#ret +1] = v
|
||||||
|
end
|
||||||
|
|
||||||
|
return ret
|
||||||
|
end
|
||||||
|
|
||||||
|
-- give path of file
|
||||||
|
-- returns a lua table representation
|
||||||
|
local function objLoader(path)
|
||||||
|
local verts = {}
|
||||||
|
local faces = {}
|
||||||
|
local uvs = {}
|
||||||
|
local normals = {}
|
||||||
|
|
||||||
|
-- go line by line through the file
|
||||||
|
for line in love.filesystem.lines(path) do
|
||||||
|
local words = {}
|
||||||
|
|
||||||
|
-- split the line into words
|
||||||
|
for word in line:gmatch("([^".."%s".."]+)") do
|
||||||
|
table.insert(words, word)
|
||||||
|
end
|
||||||
|
|
||||||
|
-- if the first word in this line is a "v", then this defines a vertex
|
||||||
|
if words[1] == "v" then
|
||||||
|
verts[#verts+1] = {tonumber(words[2]), tonumber(words[3]), tonumber(words[4])}
|
||||||
|
end
|
||||||
|
|
||||||
|
-- if the first word in this line is a "vt", then this defines a texture coordinate
|
||||||
|
if words[1] == "vt" then
|
||||||
|
uvs[#uvs+1] = {tonumber(words[2]), tonumber(words[3])}
|
||||||
|
end
|
||||||
|
|
||||||
|
-- if the first word in this line is a "vn", then this defines a vertex normal
|
||||||
|
if words[1] == "vn" then
|
||||||
|
normals[#normals+1] = {tonumber(words[2]), tonumber(words[3]), tonumber(words[4])}
|
||||||
|
end
|
||||||
|
|
||||||
|
-- if the first word in this line is a "f", then this is a face
|
||||||
|
-- a face takes three arguments which refer to points, each of those points take three arguments
|
||||||
|
-- the arguments a point takes is v,vt,vn
|
||||||
|
if words[1] == "f" then
|
||||||
|
local store = {}
|
||||||
|
|
||||||
|
assert(#words == 4, "Faces in "..path.." must be triangulated before they can be used in g3d!")
|
||||||
|
|
||||||
|
for i=2, #words do
|
||||||
|
local num = ""
|
||||||
|
local word = words[i]
|
||||||
|
local ii = 1
|
||||||
|
local char = word:sub(ii,ii)
|
||||||
|
|
||||||
|
while true do
|
||||||
|
char = word:sub(ii,ii)
|
||||||
|
if char ~= "/" then
|
||||||
|
num = num .. char
|
||||||
|
else
|
||||||
|
break
|
||||||
|
end
|
||||||
|
ii = ii + 1
|
||||||
|
end
|
||||||
|
store[#store+1] = tonumber(num)
|
||||||
|
|
||||||
|
local num = ""
|
||||||
|
ii = ii + 1
|
||||||
|
while true do
|
||||||
|
char = word:sub(ii,ii)
|
||||||
|
if ii <= #word and char ~= "/" then
|
||||||
|
num = num .. char
|
||||||
|
else
|
||||||
|
break
|
||||||
|
end
|
||||||
|
ii = ii + 1
|
||||||
|
end
|
||||||
|
store[#store+1] = tonumber(num)
|
||||||
|
|
||||||
|
local num = ""
|
||||||
|
ii = ii + 1
|
||||||
|
while true do
|
||||||
|
char = word:sub(ii,ii)
|
||||||
|
if ii <= #word and char ~= "/" then
|
||||||
|
num = num .. char
|
||||||
|
else
|
||||||
|
break
|
||||||
|
end
|
||||||
|
ii = ii + 1
|
||||||
|
end
|
||||||
|
store[#store+1] = tonumber(num)
|
||||||
|
end
|
||||||
|
|
||||||
|
faces[#faces+1] = store
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- put it all together in the right order
|
||||||
|
local compiled = {}
|
||||||
|
for i,face in pairs(faces) do
|
||||||
|
compiled[#compiled +1] = concatTables(verts[face[1]], uvs[face[2]], normals[face[3]])
|
||||||
|
compiled[#compiled +1] = concatTables(verts[face[4]], uvs[face[5]], normals[face[6]])
|
||||||
|
compiled[#compiled +1] = concatTables(verts[face[7]], uvs[face[8]], normals[face[9]])
|
||||||
|
end
|
||||||
|
|
||||||
|
return compiled
|
||||||
|
end
|
||||||
|
|
||||||
|
return objLoader
|
|
@ -0,0 +1,35 @@
|
||||||
|
-- written by groverbuger for g3d
|
||||||
|
-- february 2021
|
||||||
|
-- MIT license
|
||||||
|
|
||||||
|
----------------------------------------------------------------------------------------------------
|
||||||
|
-- define the 3d shader
|
||||||
|
----------------------------------------------------------------------------------------------------
|
||||||
|
-- this is what projects 3d objects onto the 2d screen
|
||||||
|
|
||||||
|
local shader = love.graphics.newShader [[
|
||||||
|
uniform mat4 projectionMatrix;
|
||||||
|
uniform mat4 modelMatrix;
|
||||||
|
uniform mat4 viewMatrix;
|
||||||
|
|
||||||
|
varying vec4 vertexColor;
|
||||||
|
|
||||||
|
#ifdef VERTEX
|
||||||
|
vec4 position(mat4 transform_projection, vec4 vertex_position)
|
||||||
|
{
|
||||||
|
vertexColor = VertexColor;
|
||||||
|
return projectionMatrix * viewMatrix * modelMatrix * vertex_position;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef PIXEL
|
||||||
|
vec4 effect(vec4 color, Image tex, vec2 texcoord, vec2 pixcoord)
|
||||||
|
{
|
||||||
|
vec4 texcolor = Texel(tex, texcoord);
|
||||||
|
if (texcolor.a == 0.0) { discard; }
|
||||||
|
return vec4(texcolor)*color*vertexColor;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
]]
|
||||||
|
|
||||||
|
return shader
|
|
@ -0,0 +1,42 @@
|
||||||
|
-- written by groverbuger for g3d
|
||||||
|
-- february 2021
|
||||||
|
-- MIT license
|
||||||
|
|
||||||
|
----------------------------------------------------------------------------------------------------
|
||||||
|
-- vector functions
|
||||||
|
----------------------------------------------------------------------------------------------------
|
||||||
|
-- some basic vector functions that don't use tables
|
||||||
|
-- because these functions will happen often, this is done to avoid frequent memory allocation
|
||||||
|
|
||||||
|
local vectors = {}
|
||||||
|
|
||||||
|
function vectors.subtract(v1,v2,v3, v4,v5,v6)
|
||||||
|
return v1-v4, v2-v5, v3-v6
|
||||||
|
end
|
||||||
|
|
||||||
|
function vectors.add(v1,v2,v3, v4,v5,v6)
|
||||||
|
return v1+v4, v2+v5, v3+v6
|
||||||
|
end
|
||||||
|
|
||||||
|
function vectors.scalarMultiply(scalar, v1,v2,v3)
|
||||||
|
return v1*scalar, v2*scalar, v3*scalar
|
||||||
|
end
|
||||||
|
|
||||||
|
function vectors.crossProduct(a1,a2,a3, b1,b2,b3)
|
||||||
|
return a2*b3 - a3*b2, a3*b1 - a1*b3, a1*b2 - a2*b1
|
||||||
|
end
|
||||||
|
|
||||||
|
function vectors.dotProduct(a1,a2,a3, b1,b2,b3)
|
||||||
|
return a1*b1 + a2*b2 + a3*b3
|
||||||
|
end
|
||||||
|
|
||||||
|
function vectors.normalize(x,y,z)
|
||||||
|
local mag = math.sqrt(x^2 + y^2 + z^2)
|
||||||
|
return x/mag, y/mag, z/mag
|
||||||
|
end
|
||||||
|
|
||||||
|
function vectors.magnitude(x,y,z)
|
||||||
|
return math.sqrt(x^2 + y^2 + z^2)
|
||||||
|
end
|
||||||
|
|
||||||
|
return vectors
|
|
@ -0,0 +1,118 @@
|
||||||
|
g3d = require "g3d"
|
||||||
|
|
||||||
|
function love.load()
|
||||||
|
math.randomseed(os.time())
|
||||||
|
-- GRAPHICS
|
||||||
|
-- GOOD PIXEL
|
||||||
|
love.graphics.setDefaultFilter("nearest")
|
||||||
|
|
||||||
|
-- FONTS
|
||||||
|
DefaultFont = love.graphics.newImageFont("default_font.png",
|
||||||
|
" abcdefghijklmnopqrstuvwxyz" ..
|
||||||
|
"ABCDEFGHIJKLMNOPQRSTUVWXYZ0" ..
|
||||||
|
"123456789.,!?-+/():;%&`'*#=[]\"")
|
||||||
|
love.graphics.setFont(DefaultFont)
|
||||||
|
|
||||||
|
obj_list = {}
|
||||||
|
|
||||||
|
-- obj_flower_pot = g3d.newModel("objects/flower_pot.obj","objects/flower_pot/texture.png",{0,0,0},{0,0,0},{1,-1,1}),
|
||||||
|
--
|
||||||
|
generate_museum(0,0,0)
|
||||||
|
end
|
||||||
|
|
||||||
|
function love.mousemoved(x,y, dx,dy)
|
||||||
|
g3d.camera.firstPersonLook(dx,dy)
|
||||||
|
end
|
||||||
|
|
||||||
|
function love.update(dt)
|
||||||
|
g3d.camera.firstPersonMovement(dt,5)
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
function love.keypressed(key)
|
||||||
|
if key == "z" then
|
||||||
|
obj_list = {}
|
||||||
|
math.randomseed(os.time())
|
||||||
|
generate_museum(0,0,0)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function love.draw()
|
||||||
|
-- draw everything
|
||||||
|
for _, obj in pairs(obj_list) do
|
||||||
|
obj:draw()
|
||||||
|
end
|
||||||
|
|
||||||
|
-- print coords
|
||||||
|
love.graphics.print("Press [z] to generate a new museum", 20, 20)
|
||||||
|
|
||||||
|
-- print coords
|
||||||
|
love.graphics.print("x: "..math.floor(g3d.camera.position[1])..", y: "..math.floor(g3d.camera.position[2])..", z: "..math.floor(g3d.camera.position[3]), 20, 40)
|
||||||
|
end
|
||||||
|
|
||||||
|
function generate_museum(x,y,z)
|
||||||
|
local width = math.random(10,20)
|
||||||
|
local height = 4
|
||||||
|
local depth = math.random(10,20)
|
||||||
|
|
||||||
|
-- make the ground
|
||||||
|
for w = 0, width, 1 do for d = 0, depth, 1 do
|
||||||
|
table.insert(obj_list,g3d.newModel("objects/ground.obj","objects/ground/texture.png",{x+w,y,z+d},{0,0,0},{1,-1,1}))
|
||||||
|
end end
|
||||||
|
|
||||||
|
-- make the walls
|
||||||
|
for w = 0, width, 1 do for h = 0, height, 1 do
|
||||||
|
table.insert(obj_list,g3d.newModel("objects/wall.obj","objects/wall/texture.png",{x+w,y-h,z},{0,math.pi/2,0},{1,-1,1}))
|
||||||
|
table.insert(obj_list,g3d.newModel("objects/wall.obj","objects/wall/texture.png",{x+w,y-h,z+depth},{0,math.pi/2,0},{1,-1,1}))
|
||||||
|
end end
|
||||||
|
|
||||||
|
for d = 0, depth, 1 do for h = 0, height, 1 do
|
||||||
|
table.insert(obj_list,g3d.newModel("objects/wall.obj","objects/wall/texture.png",{x,y-h,z+d},{0,0,0},{1,-1,1}))
|
||||||
|
table.insert(obj_list,g3d.newModel("objects/wall.obj","objects/wall/texture.png",{x+width,y-h,z+d},{0,0,0},{1,-1,1}))
|
||||||
|
end end
|
||||||
|
|
||||||
|
-- decorate with paintings
|
||||||
|
local art_height = 2.5
|
||||||
|
|
||||||
|
for w = 2, width-2, 4 do
|
||||||
|
random_art(x+w,y-art_height,z,0,math.pi/2,0)
|
||||||
|
random_art(x+w,y-art_height,z+depth,0,-math.pi/2,0)
|
||||||
|
end
|
||||||
|
for d = 2, depth-2, 4 do
|
||||||
|
random_art(x,y-art_height,z+d,0,-math.pi,0)
|
||||||
|
random_art(x+width,y-art_height,z+d,0,0,0)
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
-- place carpet in the middle of the room
|
||||||
|
table.insert(obj_list,g3d.newModel("objects/carpet.obj","objects/carpet/texture.png",{x+width/2, y, z+depth/2},{0,math.random(),0},{1,-1,1}))
|
||||||
|
|
||||||
|
-- place camera in the middle of the room
|
||||||
|
g3d.camera.position = {x+width/2, y-2, z+depth/2}
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
function random_art(x,y,z,rotx,roty,rotz)
|
||||||
|
local art = math.random(0,9)
|
||||||
|
if art == 0 then
|
||||||
|
-- no art :S
|
||||||
|
elseif art == 1 then
|
||||||
|
table.insert(obj_list,g3d.newModel("objects/art_9_12.obj","objects/art_9_12/eri_sueños.png",{x,y-(12/16),z},{rotx,roty,rotz},{-1,1,1}))
|
||||||
|
elseif art == 2 then
|
||||||
|
table.insert(obj_list,g3d.newModel("objects/art_1_1.obj","objects/art_1_1/yari_walk.png",{x,y-(10/16),z},{rotx,roty,rotz},{-1,1,1}))
|
||||||
|
elseif art == 3 then
|
||||||
|
table.insert(obj_list,g3d.newModel("objects/art_16_9.obj","objects/art_16_9/clareta_tira.png",{x,y-(9/16),z},{rotx,roty,rotz},{-1,1,1}))
|
||||||
|
elseif art == 4 then
|
||||||
|
table.insert(obj_list,g3d.newModel("objects/art_16_12.obj","objects/art_16_12/clareta_garden_throne.png",{x,y-(12/16),z},{rotx,roty,rotz},{-1,1,1}))
|
||||||
|
elseif art == 5 then
|
||||||
|
table.insert(obj_list,g3d.newModel("objects/art_24_16.obj","objects/art_24_16/eri_dungeon.png",{x,y-(16/16),z},{rotx,roty,rotz},{-1,1,1}))
|
||||||
|
elseif art == 6 then
|
||||||
|
table.insert(obj_list,g3d.newModel("objects/art_12_9.obj","objects/art_12_9/noe_nerielle.png",{x,y-(9/16),z},{rotx,roty,rotz},{-1,1,1}))
|
||||||
|
elseif art == 7 then
|
||||||
|
table.insert(obj_list,g3d.newModel("objects/art_1_1.obj","objects/art_1_1/yari_pumpum.png",{x,y-(10/16),z},{rotx,roty,rotz},{-1,1,1}))
|
||||||
|
elseif art == 8 then
|
||||||
|
table.insert(obj_list,g3d.newModel("objects/art_12_6.obj","objects/art_12_6/eri_sigils.png",{x,y-(6/16),z},{rotx,roty,rotz},{-1,1,1}))
|
||||||
|
elseif art == 9 then
|
||||||
|
table.insert(obj_list,g3d.newModel("objects/art_16_24.obj","objects/art_16_24/eri_ariel_with_overalls.png",{x,y-(24/16),z},{rotx,roty,rotz},{-1,1,1}))
|
||||||
|
end
|
||||||
|
end
|
BIN
mpg123.dll
BIN
msvcp120.dll
BIN
msvcr120.dll
|
@ -0,0 +1,101 @@
|
||||||
|
# Made in Blockbench 3.7.4
|
||||||
|
mtllib art_12_6.mtl
|
||||||
|
o cube
|
||||||
|
v 0.0625 0.875 0.8125
|
||||||
|
v 0.0625 0.875 -0.8125
|
||||||
|
v 0.0625 0 0.8125
|
||||||
|
v 0.0625 0 -0.8125
|
||||||
|
v 0 0.875 -0.8125
|
||||||
|
v 0 0.875 0.8125
|
||||||
|
v 0 0 -0.8125
|
||||||
|
v 0 0 0.8125
|
||||||
|
vt 0 1
|
||||||
|
vt 0 0
|
||||||
|
vt 1 1
|
||||||
|
vt 0 0
|
||||||
|
vt 1 0
|
||||||
|
vt 1 1
|
||||||
|
vt 0 1
|
||||||
|
vt 0 1
|
||||||
|
vt 0 1
|
||||||
|
vt 0 1
|
||||||
|
vt 0 1
|
||||||
|
vt 0 1
|
||||||
|
vt 0 1.001
|
||||||
|
vt 0 1
|
||||||
|
vt 0.999 1.001
|
||||||
|
vt 0 1
|
||||||
|
vt 0.999 1
|
||||||
|
vt 0.999 1.001
|
||||||
|
vt 0 -0.1499999999999999
|
||||||
|
vt 0 0
|
||||||
|
vt 0.999 -0.1499999999999999
|
||||||
|
vt 0 0
|
||||||
|
vt 0.999 0
|
||||||
|
vt 0.999 -0.1499999999999999
|
||||||
|
vt 0 1
|
||||||
|
vt 0 0
|
||||||
|
vt 0 1
|
||||||
|
vt 0 0
|
||||||
|
vt 0 0
|
||||||
|
vt 0 1
|
||||||
|
vt 1 1
|
||||||
|
vt 1 0
|
||||||
|
vt 1.099 1
|
||||||
|
vt 1 0
|
||||||
|
vt 1.099 0
|
||||||
|
vt 1.099 1
|
||||||
|
vn 1 0 0
|
||||||
|
vn 1 0 0
|
||||||
|
vn 1 0 0
|
||||||
|
vn 1 0 0
|
||||||
|
vn 1 0 0
|
||||||
|
vn 1 0 0
|
||||||
|
vn -1 0 0
|
||||||
|
vn -1 0 0
|
||||||
|
vn -1 0 0
|
||||||
|
vn -1 0 0
|
||||||
|
vn -1 0 0
|
||||||
|
vn -1 0 0
|
||||||
|
vn 0 1 0
|
||||||
|
vn 0 1 0
|
||||||
|
vn 0 1 0
|
||||||
|
vn 0 1 0
|
||||||
|
vn 0 1 0
|
||||||
|
vn 0 1 0
|
||||||
|
vn 0 -1 0
|
||||||
|
vn 0 -1 0
|
||||||
|
vn 0 -1 0
|
||||||
|
vn 0 -1 0
|
||||||
|
vn 0 -1 0
|
||||||
|
vn 0 -1 0
|
||||||
|
vn 0 0 1
|
||||||
|
vn 0 0 1
|
||||||
|
vn 0 0 1
|
||||||
|
vn 0 0 1
|
||||||
|
vn 0 0 1
|
||||||
|
vn 0 0 1
|
||||||
|
vn 0 0 -1
|
||||||
|
vn 0 0 -1
|
||||||
|
vn 0 0 -1
|
||||||
|
vn 0 0 -1
|
||||||
|
vn 0 0 -1
|
||||||
|
vn 0 0 -1
|
||||||
|
usemtl m_0
|
||||||
|
f 1/1/1 3/2/2 2/3/3
|
||||||
|
f 3/4/4 4/5/5 2/6/6
|
||||||
|
usemtl m_0
|
||||||
|
f 5/7/7 7/8/8 6/9/9
|
||||||
|
f 7/10/10 8/11/11 6/12/12
|
||||||
|
usemtl m_0
|
||||||
|
f 5/13/13 6/14/14 2/15/15
|
||||||
|
f 6/16/16 1/17/17 2/18/18
|
||||||
|
usemtl m_0
|
||||||
|
f 8/19/19 7/20/20 3/21/21
|
||||||
|
f 7/22/22 4/23/23 3/24/24
|
||||||
|
usemtl m_0
|
||||||
|
f 6/25/25 8/26/26 1/27/27
|
||||||
|
f 8/28/28 3/29/29 1/30/30
|
||||||
|
usemtl m_0
|
||||||
|
f 2/31/31 4/32/32 5/33/33
|
||||||
|
f 4/34/34 7/35/35 5/36/36
|
|
@ -0,0 +1,4 @@
|
||||||
|
# Made in Blockbench 3.7.4
|
||||||
|
newmtl m_0
|
||||||
|
map_Kd eri_sigils.png
|
||||||
|
newmtl none
|
After Width: | Height: | Size: 209 KiB |
|
@ -0,0 +1,101 @@
|
||||||
|
# Made in Blockbench 3.7.4
|
||||||
|
mtllib art_12_9.mtl
|
||||||
|
o cube
|
||||||
|
v 0.0625 1.25 0.8125
|
||||||
|
v 0.0625 1.25 -0.8125
|
||||||
|
v 0.0625 0 0.8125
|
||||||
|
v 0.0625 0 -0.8125
|
||||||
|
v 0 1.25 -0.8125
|
||||||
|
v 0 1.25 0.8125
|
||||||
|
v 0 0 -0.8125
|
||||||
|
v 0 0 0.8125
|
||||||
|
vt 0 1
|
||||||
|
vt 0 0
|
||||||
|
vt 1 1
|
||||||
|
vt 0 0
|
||||||
|
vt 1 0
|
||||||
|
vt 1 1
|
||||||
|
vt 0 1
|
||||||
|
vt 0 1
|
||||||
|
vt 0 1
|
||||||
|
vt 0 1
|
||||||
|
vt 0 1
|
||||||
|
vt 0 1
|
||||||
|
vt 0 1.001
|
||||||
|
vt 0 1
|
||||||
|
vt 0.999 1.001
|
||||||
|
vt 0 1
|
||||||
|
vt 0.999 1
|
||||||
|
vt 0.999 1.001
|
||||||
|
vt 0 -0.1499999999999999
|
||||||
|
vt 0 0
|
||||||
|
vt 0.999 -0.1499999999999999
|
||||||
|
vt 0 0
|
||||||
|
vt 0.999 0
|
||||||
|
vt 0.999 -0.1499999999999999
|
||||||
|
vt 0 1
|
||||||
|
vt 0 0
|
||||||
|
vt 0 1
|
||||||
|
vt 0 0
|
||||||
|
vt 0 0
|
||||||
|
vt 0 1
|
||||||
|
vt 1 1
|
||||||
|
vt 1 0
|
||||||
|
vt 1.099 1
|
||||||
|
vt 1 0
|
||||||
|
vt 1.099 0
|
||||||
|
vt 1.099 1
|
||||||
|
vn 1 0 0
|
||||||
|
vn 1 0 0
|
||||||
|
vn 1 0 0
|
||||||
|
vn 1 0 0
|
||||||
|
vn 1 0 0
|
||||||
|
vn 1 0 0
|
||||||
|
vn -1 0 0
|
||||||
|
vn -1 0 0
|
||||||
|
vn -1 0 0
|
||||||
|
vn -1 0 0
|
||||||
|
vn -1 0 0
|
||||||
|
vn -1 0 0
|
||||||
|
vn 0 1 0
|
||||||
|
vn 0 1 0
|
||||||
|
vn 0 1 0
|
||||||
|
vn 0 1 0
|
||||||
|
vn 0 1 0
|
||||||
|
vn 0 1 0
|
||||||
|
vn 0 -1 0
|
||||||
|
vn 0 -1 0
|
||||||
|
vn 0 -1 0
|
||||||
|
vn 0 -1 0
|
||||||
|
vn 0 -1 0
|
||||||
|
vn 0 -1 0
|
||||||
|
vn 0 0 1
|
||||||
|
vn 0 0 1
|
||||||
|
vn 0 0 1
|
||||||
|
vn 0 0 1
|
||||||
|
vn 0 0 1
|
||||||
|
vn 0 0 1
|
||||||
|
vn 0 0 -1
|
||||||
|
vn 0 0 -1
|
||||||
|
vn 0 0 -1
|
||||||
|
vn 0 0 -1
|
||||||
|
vn 0 0 -1
|
||||||
|
vn 0 0 -1
|
||||||
|
usemtl m_0
|
||||||
|
f 1/1/1 3/2/2 2/3/3
|
||||||
|
f 3/4/4 4/5/5 2/6/6
|
||||||
|
usemtl m_0
|
||||||
|
f 5/7/7 7/8/8 6/9/9
|
||||||
|
f 7/10/10 8/11/11 6/12/12
|
||||||
|
usemtl m_0
|
||||||
|
f 5/13/13 6/14/14 2/15/15
|
||||||
|
f 6/16/16 1/17/17 2/18/18
|
||||||
|
usemtl m_0
|
||||||
|
f 8/19/19 7/20/20 3/21/21
|
||||||
|
f 7/22/22 4/23/23 3/24/24
|
||||||
|
usemtl m_0
|
||||||
|
f 6/25/25 8/26/26 1/27/27
|
||||||
|
f 8/28/28 3/29/29 1/30/30
|
||||||
|
usemtl m_0
|
||||||
|
f 2/31/31 4/32/32 5/33/33
|
||||||
|
f 4/34/34 7/35/35 5/36/36
|
|
@ -0,0 +1,4 @@
|
||||||
|
# Made in Blockbench 3.7.4
|
||||||
|
newmtl m_0
|
||||||
|
map_Kd noe_nerielle.png
|
||||||
|
newmtl none
|
After Width: | Height: | Size: 314 KiB |
|
@ -0,0 +1,101 @@
|
||||||
|
# Made in Blockbench 3.7.4
|
||||||
|
mtllib art_16_12.mtl
|
||||||
|
o cube
|
||||||
|
v 0.0625 1.625 1.0625
|
||||||
|
v 0.0625 1.625 -1.0625
|
||||||
|
v 0.0625 0 1.0625
|
||||||
|
v 0.0625 0 -1.0625
|
||||||
|
v 0 1.625 -1.0625
|
||||||
|
v 0 1.625 1.0625
|
||||||
|
v 0 0 -1.0625
|
||||||
|
v 0 0 1.0625
|
||||||
|
vt 0 1
|
||||||
|
vt 0 0
|
||||||
|
vt 1 1
|
||||||
|
vt 0 0
|
||||||
|
vt 1 0
|
||||||
|
vt 1 1
|
||||||
|
vt 0 1
|
||||||
|
vt 0 1
|
||||||
|
vt 0 1
|
||||||
|
vt 0 1
|
||||||
|
vt 0 1
|
||||||
|
vt 0 1
|
||||||
|
vt 0 1.0008173076923077
|
||||||
|
vt 0 1
|
||||||
|
vt 1 1.0008173076923077
|
||||||
|
vt 0 1
|
||||||
|
vt 1 1
|
||||||
|
vt 1 1.0008173076923077
|
||||||
|
vt 0 0.00043269230769227285
|
||||||
|
vt 0 0.0012500000000000844
|
||||||
|
vt 0.9993749999999999 0.00043269230769227285
|
||||||
|
vt 0 0.0012500000000000844
|
||||||
|
vt 0.9993749999999999 0.0012500000000000844
|
||||||
|
vt 0.9993749999999999 0.00043269230769227285
|
||||||
|
vt 0 1
|
||||||
|
vt 0 0
|
||||||
|
vt 0 1
|
||||||
|
vt 0 0
|
||||||
|
vt 0 0
|
||||||
|
vt 0 1
|
||||||
|
vt 0.995625 1
|
||||||
|
vt 0.995625 0.00043269230769227285
|
||||||
|
vt 0.9962499999999999 1
|
||||||
|
vt 0.995625 0.00043269230769227285
|
||||||
|
vt 0.9962499999999999 0.00043269230769227285
|
||||||
|
vt 0.9962499999999999 1
|
||||||
|
vn 1 0 0
|
||||||
|
vn 1 0 0
|
||||||
|
vn 1 0 0
|
||||||
|
vn 1 0 0
|
||||||
|
vn 1 0 0
|
||||||
|
vn 1 0 0
|
||||||
|
vn -1 0 0
|
||||||
|
vn -1 0 0
|
||||||
|
vn -1 0 0
|
||||||
|
vn -1 0 0
|
||||||
|
vn -1 0 0
|
||||||
|
vn -1 0 0
|
||||||
|
vn 0 1 0
|
||||||
|
vn 0 1 0
|
||||||
|
vn 0 1 0
|
||||||
|
vn 0 1 0
|
||||||
|
vn 0 1 0
|
||||||
|
vn 0 1 0
|
||||||
|
vn 0 -1 0
|
||||||
|
vn 0 -1 0
|
||||||
|
vn 0 -1 0
|
||||||
|
vn 0 -1 0
|
||||||
|
vn 0 -1 0
|
||||||
|
vn 0 -1 0
|
||||||
|
vn 0 0 1
|
||||||
|
vn 0 0 1
|
||||||
|
vn 0 0 1
|
||||||
|
vn 0 0 1
|
||||||
|
vn 0 0 1
|
||||||
|
vn 0 0 1
|
||||||
|
vn 0 0 -1
|
||||||
|
vn 0 0 -1
|
||||||
|
vn 0 0 -1
|
||||||
|
vn 0 0 -1
|
||||||
|
vn 0 0 -1
|
||||||
|
vn 0 0 -1
|
||||||
|
usemtl m_0
|
||||||
|
f 1/1/1 3/2/2 2/3/3
|
||||||
|
f 3/4/4 4/5/5 2/6/6
|
||||||
|
usemtl m_0
|
||||||
|
f 5/7/7 7/8/8 6/9/9
|
||||||
|
f 7/10/10 8/11/11 6/12/12
|
||||||
|
usemtl m_0
|
||||||
|
f 5/13/13 6/14/14 2/15/15
|
||||||
|
f 6/16/16 1/17/17 2/18/18
|
||||||
|
usemtl m_0
|
||||||
|
f 8/19/19 7/20/20 3/21/21
|
||||||
|
f 7/22/22 4/23/23 3/24/24
|
||||||
|
usemtl m_0
|
||||||
|
f 6/25/25 8/26/26 1/27/27
|
||||||
|
f 8/28/28 3/29/29 1/30/30
|
||||||
|
usemtl m_0
|
||||||
|
f 2/31/31 4/32/32 5/33/33
|
||||||
|
f 4/34/34 7/35/35 5/36/36
|
|
@ -0,0 +1,4 @@
|
||||||
|
# Made in Blockbench 3.7.4
|
||||||
|
newmtl m_0
|
||||||
|
map_Kd clareta_garden_throne.png
|
||||||
|
newmtl none
|
After Width: | Height: | Size: 687 KiB |
|
@ -0,0 +1,101 @@
|
||||||
|
# Made in Blockbench 3.7.4
|
||||||
|
mtllib art_16_24.mtl
|
||||||
|
o cube
|
||||||
|
v 0.0625 3.125 1.0625
|
||||||
|
v 0.0625 3.125 -1.0625
|
||||||
|
v 0.0625 0 1.0625
|
||||||
|
v 0.0625 0 -1.0625
|
||||||
|
v 0 3.125 -1.0625
|
||||||
|
v 0 3.125 1.0625
|
||||||
|
v 0 0 -1.0625
|
||||||
|
v 0 0 1.0625
|
||||||
|
vt 0 1
|
||||||
|
vt 0 0
|
||||||
|
vt 1 1
|
||||||
|
vt 0 0
|
||||||
|
vt 1 0
|
||||||
|
vt 1 1
|
||||||
|
vt 0 1
|
||||||
|
vt 0 1
|
||||||
|
vt 0 1
|
||||||
|
vt 0 1
|
||||||
|
vt 0 1
|
||||||
|
vt 0 1
|
||||||
|
vt 0 1.0008173076923077
|
||||||
|
vt 0 1
|
||||||
|
vt 1 1.0008173076923077
|
||||||
|
vt 0 1
|
||||||
|
vt 1 1
|
||||||
|
vt 1 1.0008173076923077
|
||||||
|
vt 0 0.00043269230769227285
|
||||||
|
vt 0 0.0012499999999999734
|
||||||
|
vt 0.9993749999999999 0.00043269230769227285
|
||||||
|
vt 0 0.0012499999999999734
|
||||||
|
vt 0.9993749999999999 0.0012499999999999734
|
||||||
|
vt 0.9993749999999999 0.00043269230769227285
|
||||||
|
vt 0 1
|
||||||
|
vt 0 0
|
||||||
|
vt 0 1
|
||||||
|
vt 0 0
|
||||||
|
vt 0 0
|
||||||
|
vt 0 1
|
||||||
|
vt 0.995625 1
|
||||||
|
vt 0.995625 0.00043269230769227285
|
||||||
|
vt 0.9962499999999999 1
|
||||||
|
vt 0.995625 0.00043269230769227285
|
||||||
|
vt 0.9962499999999999 0.00043269230769227285
|
||||||
|
vt 0.9962499999999999 1
|
||||||
|
vn 1 0 0
|
||||||
|
vn 1 0 0
|
||||||
|
vn 1 0 0
|
||||||
|
vn 1 0 0
|
||||||
|
vn 1 0 0
|
||||||
|
vn 1 0 0
|
||||||
|
vn -1 0 0
|
||||||
|
vn -1 0 0
|
||||||
|
vn -1 0 0
|
||||||
|
vn -1 0 0
|
||||||
|
vn -1 0 0
|
||||||
|
vn -1 0 0
|
||||||
|
vn 0 1 0
|
||||||
|
vn 0 1 0
|
||||||
|
vn 0 1 0
|
||||||
|
vn 0 1 0
|
||||||
|
vn 0 1 0
|
||||||
|
vn 0 1 0
|
||||||
|
vn 0 -1 0
|
||||||
|
vn 0 -1 0
|
||||||
|
vn 0 -1 0
|
||||||
|
vn 0 -1 0
|
||||||
|
vn 0 -1 0
|
||||||
|
vn 0 -1 0
|
||||||
|
vn 0 0 1
|
||||||
|
vn 0 0 1
|
||||||
|
vn 0 0 1
|
||||||
|
vn 0 0 1
|
||||||
|
vn 0 0 1
|
||||||
|
vn 0 0 1
|
||||||
|
vn 0 0 -1
|
||||||
|
vn 0 0 -1
|
||||||
|
vn 0 0 -1
|
||||||
|
vn 0 0 -1
|
||||||
|
vn 0 0 -1
|
||||||
|
vn 0 0 -1
|
||||||
|
usemtl m_0
|
||||||
|
f 1/1/1 3/2/2 2/3/3
|
||||||
|
f 3/4/4 4/5/5 2/6/6
|
||||||
|
usemtl m_0
|
||||||
|
f 5/7/7 7/8/8 6/9/9
|
||||||
|
f 7/10/10 8/11/11 6/12/12
|
||||||
|
usemtl m_0
|
||||||
|
f 5/13/13 6/14/14 2/15/15
|
||||||
|
f 6/16/16 1/17/17 2/18/18
|
||||||
|
usemtl m_0
|
||||||
|
f 8/19/19 7/20/20 3/21/21
|
||||||
|
f 7/22/22 4/23/23 3/24/24
|
||||||
|
usemtl m_0
|
||||||
|
f 6/25/25 8/26/26 1/27/27
|
||||||
|
f 8/28/28 3/29/29 1/30/30
|
||||||
|
usemtl m_0
|
||||||
|
f 2/31/31 4/32/32 5/33/33
|
||||||
|
f 4/34/34 7/35/35 5/36/36
|
|
@ -0,0 +1,4 @@
|
||||||
|
# Made in Blockbench 3.7.4
|
||||||
|
newmtl m_0
|
||||||
|
map_Kd eri_ariel_with_overalls.png
|
||||||
|
newmtl none
|
After Width: | Height: | Size: 758 KiB |
|
@ -0,0 +1,101 @@
|
||||||
|
# Made in Blockbench 3.7.4
|
||||||
|
mtllib art_16_9.mtl
|
||||||
|
o cube
|
||||||
|
v 0.0625 1.3125 1.0625
|
||||||
|
v 0.0625 1.3125 -1.0625
|
||||||
|
v 0.0625 0.0625 1.0625
|
||||||
|
v 0.0625 0.0625 -1.0625
|
||||||
|
v 0 1.3125 -1.0625
|
||||||
|
v 0 1.3125 1.0625
|
||||||
|
v 0 0.0625 -1.0625
|
||||||
|
v 0 0.0625 1.0625
|
||||||
|
vt 0 1
|
||||||
|
vt 0 0
|
||||||
|
vt 1 1
|
||||||
|
vt 0 0
|
||||||
|
vt 1 0
|
||||||
|
vt 1 1
|
||||||
|
vt 0.16176470588235295 0
|
||||||
|
vt 0.16176470588235295 0.039166666666666794
|
||||||
|
vt 0.8230392156862746 0
|
||||||
|
vt 0.16176470588235295 0.039166666666666794
|
||||||
|
vt 0.8230392156862746 0.039166666666666794
|
||||||
|
vt 0.8230392156862746 0
|
||||||
|
vt 0.18774509803921569 1
|
||||||
|
vt 0.18774509803921569 1
|
||||||
|
vt 0.75 1
|
||||||
|
vt 0.18774509803921569 1
|
||||||
|
vt 0.75 1
|
||||||
|
vt 0.75 1
|
||||||
|
vt 0.18186274509803924 0
|
||||||
|
vt 0.18186274509803924 0.013333333333333308
|
||||||
|
vt 0.7441176470588236 0
|
||||||
|
vt 0.18186274509803924 0.013333333333333308
|
||||||
|
vt 0.7441176470588236 0.013333333333333308
|
||||||
|
vt 0.7441176470588236 0
|
||||||
|
vt 0 1
|
||||||
|
vt 0 0
|
||||||
|
vt 0 1
|
||||||
|
vt 0 0
|
||||||
|
vt 0 0
|
||||||
|
vt 0 1
|
||||||
|
vt 0.996078431372549 0.8300000000000001
|
||||||
|
vt 0.996078431372549 0.08000000000000007
|
||||||
|
vt 0.9965686274509804 0.8300000000000001
|
||||||
|
vt 0.996078431372549 0.08000000000000007
|
||||||
|
vt 0.9965686274509804 0.08000000000000007
|
||||||
|
vt 0.9965686274509804 0.8300000000000001
|
||||||
|
vn 1 0 0
|
||||||
|
vn 1 0 0
|
||||||
|
vn 1 0 0
|
||||||
|
vn 1 0 0
|
||||||
|
vn 1 0 0
|
||||||
|
vn 1 0 0
|
||||||
|
vn -1 0 0
|
||||||
|
vn -1 0 0
|
||||||
|
vn -1 0 0
|
||||||
|
vn -1 0 0
|
||||||
|
vn -1 0 0
|
||||||
|
vn -1 0 0
|
||||||
|
vn 0 1 0
|
||||||
|
vn 0 1 0
|
||||||
|
vn 0 1 0
|
||||||
|
vn 0 1 0
|
||||||
|
vn 0 1 0
|
||||||
|
vn 0 1 0
|
||||||
|
vn 0 -1 0
|
||||||
|
vn 0 -1 0
|
||||||
|
vn 0 -1 0
|
||||||
|
vn 0 -1 0
|
||||||
|
vn 0 -1 0
|
||||||
|
vn 0 -1 0
|
||||||
|
vn 0 0 1
|
||||||
|
vn 0 0 1
|
||||||
|
vn 0 0 1
|
||||||
|
vn 0 0 1
|
||||||
|
vn 0 0 1
|
||||||
|
vn 0 0 1
|
||||||
|
vn 0 0 -1
|
||||||
|
vn 0 0 -1
|
||||||
|
vn 0 0 -1
|
||||||
|
vn 0 0 -1
|
||||||
|
vn 0 0 -1
|
||||||
|
vn 0 0 -1
|
||||||
|
usemtl m_0
|
||||||
|
f 1/1/1 3/2/2 2/3/3
|
||||||
|
f 3/4/4 4/5/5 2/6/6
|
||||||
|
usemtl m_0
|
||||||
|
f 5/7/7 7/8/8 6/9/9
|
||||||
|
f 7/10/10 8/11/11 6/12/12
|
||||||
|
usemtl m_0
|
||||||
|
f 5/13/13 6/14/14 2/15/15
|
||||||
|
f 6/16/16 1/17/17 2/18/18
|
||||||
|
usemtl m_0
|
||||||
|
f 8/19/19 7/20/20 3/21/21
|
||||||
|
f 7/22/22 4/23/23 3/24/24
|
||||||
|
usemtl m_0
|
||||||
|
f 6/25/25 8/26/26 1/27/27
|
||||||
|
f 8/28/28 3/29/29 1/30/30
|
||||||
|
usemtl m_0
|
||||||
|
f 2/31/31 4/32/32 5/33/33
|
||||||
|
f 4/34/34 7/35/35 5/36/36
|
|
@ -0,0 +1,4 @@
|
||||||
|
# Made in Blockbench 3.7.4
|
||||||
|
newmtl m_0
|
||||||
|
map_Kd clareta_tira.png
|
||||||
|
newmtl none
|
After Width: | Height: | Size: 1.5 MiB |
|
@ -0,0 +1,101 @@
|
||||||
|
# Made in Blockbench 3.7.4
|
||||||
|
mtllib art_1_1.mtl
|
||||||
|
o cube
|
||||||
|
v 0.0625 1.3125 0.625
|
||||||
|
v 0.0625 1.3125 -0.625
|
||||||
|
v 0.0625 0.0625 0.625
|
||||||
|
v 0.0625 0.0625 -0.625
|
||||||
|
v 0 1.3125 -0.625
|
||||||
|
v 0 1.3125 0.625
|
||||||
|
v 0 0.0625 -0.625
|
||||||
|
v 0 0.0625 0.625
|
||||||
|
vt 0 1
|
||||||
|
vt 0 0
|
||||||
|
vt 1 1
|
||||||
|
vt 0 0
|
||||||
|
vt 1 0
|
||||||
|
vt 1 1
|
||||||
|
vt 0.16176470588235295 0
|
||||||
|
vt 0.16176470588235295 0.039166666666666794
|
||||||
|
vt 0.8230392156862745 0
|
||||||
|
vt 0.16176470588235295 0.039166666666666794
|
||||||
|
vt 0.8230392156862745 0.039166666666666794
|
||||||
|
vt 0.8230392156862745 0
|
||||||
|
vt 0.1877450980392157 1
|
||||||
|
vt 0.1877450980392157 1
|
||||||
|
vt 0.75 1
|
||||||
|
vt 0.1877450980392157 1
|
||||||
|
vt 0.75 1
|
||||||
|
vt 0.75 1
|
||||||
|
vt 0.18186274509803924 0
|
||||||
|
vt 0.18186274509803924 0.013333333333333308
|
||||||
|
vt 0.7441176470588236 0
|
||||||
|
vt 0.18186274509803924 0.013333333333333308
|
||||||
|
vt 0.7441176470588236 0.013333333333333308
|
||||||
|
vt 0.7441176470588236 0
|
||||||
|
vt 0 1
|
||||||
|
vt 0 0
|
||||||
|
vt 0 1
|
||||||
|
vt 0 0
|
||||||
|
vt 0 0
|
||||||
|
vt 0 1
|
||||||
|
vt 0.996078431372549 0.8300000000000001
|
||||||
|
vt 0.996078431372549 0.08000000000000007
|
||||||
|
vt 0.9965686274509805 0.8300000000000001
|
||||||
|
vt 0.996078431372549 0.08000000000000007
|
||||||
|
vt 0.9965686274509805 0.08000000000000007
|
||||||
|
vt 0.9965686274509805 0.8300000000000001
|
||||||
|
vn 1 0 0
|
||||||
|
vn 1 0 0
|
||||||
|
vn 1 0 0
|
||||||
|
vn 1 0 0
|
||||||
|
vn 1 0 0
|
||||||
|
vn 1 0 0
|
||||||
|
vn -1 0 0
|
||||||
|
vn -1 0 0
|
||||||
|
vn -1 0 0
|
||||||
|
vn -1 0 0
|
||||||
|
vn -1 0 0
|
||||||
|
vn -1 0 0
|
||||||
|
vn 0 1 0
|
||||||
|
vn 0 1 0
|
||||||
|
vn 0 1 0
|
||||||
|
vn 0 1 0
|
||||||
|
vn 0 1 0
|
||||||
|
vn 0 1 0
|
||||||
|
vn 0 -1 0
|
||||||
|
vn 0 -1 0
|
||||||
|
vn 0 -1 0
|
||||||
|
vn 0 -1 0
|
||||||
|
vn 0 -1 0
|
||||||
|
vn 0 -1 0
|
||||||
|
vn 0 0 1
|
||||||
|
vn 0 0 1
|
||||||
|
vn 0 0 1
|
||||||
|
vn 0 0 1
|
||||||
|
vn 0 0 1
|
||||||
|
vn 0 0 1
|
||||||
|
vn 0 0 -1
|
||||||
|
vn 0 0 -1
|
||||||
|
vn 0 0 -1
|
||||||
|
vn 0 0 -1
|
||||||
|
vn 0 0 -1
|
||||||
|
vn 0 0 -1
|
||||||
|
usemtl m_0
|
||||||
|
f 1/1/1 3/2/2 2/3/3
|
||||||
|
f 3/4/4 4/5/5 2/6/6
|
||||||
|
usemtl m_0
|
||||||
|
f 5/7/7 7/8/8 6/9/9
|
||||||
|
f 7/10/10 8/11/11 6/12/12
|
||||||
|
usemtl m_0
|
||||||
|
f 5/13/13 6/14/14 2/15/15
|
||||||
|
f 6/16/16 1/17/17 2/18/18
|
||||||
|
usemtl m_0
|
||||||
|
f 8/19/19 7/20/20 3/21/21
|
||||||
|
f 7/22/22 4/23/23 3/24/24
|
||||||
|
usemtl m_0
|
||||||
|
f 6/25/25 8/26/26 1/27/27
|
||||||
|
f 8/28/28 3/29/29 1/30/30
|
||||||
|
usemtl m_0
|
||||||
|
f 2/31/31 4/32/32 5/33/33
|
||||||
|
f 4/34/34 7/35/35 5/36/36
|
|
@ -0,0 +1,4 @@
|
||||||
|
# Made in Blockbench 3.7.4
|
||||||
|
newmtl m_0
|
||||||
|
map_Kd yari_walk.png
|
||||||
|
newmtl none
|
|
@ -0,0 +1 @@
|
||||||
|
{"meta":{"format_version":"3.6","creation_time":1615816586,"model_format":"free","box_uv":false},"name":"model","geometry_name":"","visible_box":[1,1,0],"resolution":{"width":10,"height":10},"elements":[{"name":"cube","from":[0,1,-10],"to":[1,21,10],"autouv":0,"color":3,"locked":false,"origin":[0,19,0],"faces":{"north":{"uv":[9.96078431372549,1.7,9.965686274509805,9.2],"texture":0},"east":{"uv":[0,0,10,10],"texture":0},"south":{"uv":[0,0,0,10],"texture":0},"west":{"uv":[1.6176470588235294,10,8.230392156862745,9.608333333333333],"texture":0},"up":{"uv":[1.877450980392157,0,7.5,0],"texture":0},"down":{"uv":[1.8186274509803924,10,7.4411764705882355,9.866666666666667],"texture":0}},"uuid":"8f7eaaee-1bd1-2983-c07d-cc5f83205924"}],"outliner":["8f7eaaee-1bd1-2983-c07d-cc5f83205924"],"textures":[{"path":"/home/maelys/Projects/Love2D/3d/objects/art_1_1/yari_walk.png","name":"yari_walk.png","folder":"art_1_1","namespace":"","id":"0","particle":false,"visible":true,"mode":"bitmap","saved":true,"uuid":"02f9cbf2-2e6e-b6e8-d1d7-c0df3cb18d1d","source":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAADsUlEQVR4Xu2bP2jXQBTHLz/xh/8V/yA4iuiqgqAIouAmOnWp4uTgKNbBxU0XB4uOTk7apYu6CC1UBHFwEeymOBa0VupfaoOJvOvvhcv97nJ3v7yXNvklS5vkcrnvJ9/33h35JUrTNBVDvEUtgNYBbQi0OWCIc6AgS4Lzz/eKPec/144lCQAQjxs1BOybul8cLzkA6JhqsCpYyn5Vm7IA0Ad79fQ+ec+HL+dyIWI6rovmcharA1SV4AaTUDymgqlaPNybzQEqhFv31mW76AIdgE08l/VJHQCdFQlQAdy58U/mCAQQdTri9vXYWj2o8ontBiQOCAUA7REKACnaagPAB4JLrAlEYwAMOkOqFQCXC0IhcIsnqwIozJQIUUQaL4qvLw7lGMhzSSySv1/EwvTRPj61B2ASYJvaJktzYmHqSAahCvHsDkARu3ftFHG8Uuq+//gpSyae275tayYaz3HP/lSrsZZBEKkKxBt/fLxJArCdawwAEHLw8pJIkiSDvqEbidlHG+X+gUt/+uIe4KgbdyiwOgCF6EJVkUXn4PraAAgpgZOTOySbkZFFZ2VsHAAUj8pdEGoFwMcFjQfgAwHa+IQB99MnnweoAa3PCnXBrv0qEiArAN0JuvVt2U/NCbV2gBQ4Oi7/zF+868z28ok/uSnbViEcB0Q2D+hT2BOPx4sggPDcNjHmBYyiUWUAggdbEYRKAMwcOyv1n3k77c+h1gAU+6P4IAAF4qlflvA4wAOA7orcvgUAx3uDSgGcfPdKhsDrw6eyUICwMLpEg8D13oAegJb9VXGgGiAUAchCRQFQJB5JDlo6VwVAN17OnrrugFyu6EGoNQAQpLoAHKAD0Ntk1WJirPCNk1pS1oYDDPYPKX195bLOAGzlzzYnsCVCTvvTL4Yc5c8kEo6hS9T/g9YQJX6aw5YE9exvKnfL67t9FUGfKroWUoPGPu9iaHQ8l/gws/uUxBAAZcXTh0Bv9Bi3sx+mcmuAUACFK8gStlch04eA5ccSsOTVyyEOBCZGarWwCad44rrDyAH4ZG3/JeFKSw7hbDng28xxce7Ke9HpRCJJUhFFQjy9vyVUM6to1hA4sX+zUeyzB/4QOJ84awjYxONNAQKIc4VJswBEQoje79HffPotWQCAC9d+GZ2CbYJjZsALSJOgywEozrfdgJqCLiMFAHcuEucLAPqpygnkAHzwuxzQAmi6A3xDxcdNZdusSgiUHTTl9S2A9sPJ9sPJ9sPJ9sNJyqxat76Gvgr8B9wNv1+cgMVeAAAAAElFTkSuQmCC"}]}
|
After Width: | Height: | Size: 109 KiB |
After Width: | Height: | Size: 937 B |
|
@ -0,0 +1,101 @@
|
||||||
|
# Made in Blockbench 3.7.4
|
||||||
|
mtllib art_24_16.mtl
|
||||||
|
o cube
|
||||||
|
v 0.0625 2.125 1.5625
|
||||||
|
v 0.0625 2.125 -1.5625
|
||||||
|
v 0.0625 0 1.5625
|
||||||
|
v 0.0625 0 -1.5625
|
||||||
|
v 0 2.125 -1.5625
|
||||||
|
v 0 2.125 1.5625
|
||||||
|
v 0 0 -1.5625
|
||||||
|
v 0 0 1.5625
|
||||||
|
vt 0 1
|
||||||
|
vt 0 0
|
||||||
|
vt 1 1
|
||||||
|
vt 0 0
|
||||||
|
vt 1 0
|
||||||
|
vt 1 1
|
||||||
|
vt 0 1
|
||||||
|
vt 0 1
|
||||||
|
vt 0 1
|
||||||
|
vt 0 1
|
||||||
|
vt 0 1
|
||||||
|
vt 0 1
|
||||||
|
vt 0 1.0008173076923077
|
||||||
|
vt 0 1
|
||||||
|
vt 1 1.0008173076923077
|
||||||
|
vt 0 1
|
||||||
|
vt 1 1
|
||||||
|
vt 1 1.0008173076923077
|
||||||
|
vt 0 0.00043269230769227285
|
||||||
|
vt 0 0.0012500000000000844
|
||||||
|
vt 0.9993749999999999 0.00043269230769227285
|
||||||
|
vt 0 0.0012500000000000844
|
||||||
|
vt 0.9993749999999999 0.0012500000000000844
|
||||||
|
vt 0.9993749999999999 0.00043269230769227285
|
||||||
|
vt 0 1
|
||||||
|
vt 0 0
|
||||||
|
vt 0 1
|
||||||
|
vt 0 0
|
||||||
|
vt 0 0
|
||||||
|
vt 0 1
|
||||||
|
vt 0.995625 1
|
||||||
|
vt 0.995625 0.00043269230769227285
|
||||||
|
vt 0.9962499999999999 1
|
||||||
|
vt 0.995625 0.00043269230769227285
|
||||||
|
vt 0.9962499999999999 0.00043269230769227285
|
||||||
|
vt 0.9962499999999999 1
|
||||||
|
vn 1 0 0
|
||||||
|
vn 1 0 0
|
||||||
|
vn 1 0 0
|
||||||
|
vn 1 0 0
|
||||||
|
vn 1 0 0
|
||||||
|
vn 1 0 0
|
||||||
|
vn -1 0 0
|
||||||
|
vn -1 0 0
|
||||||
|
vn -1 0 0
|
||||||
|
vn -1 0 0
|
||||||
|
vn -1 0 0
|
||||||
|
vn -1 0 0
|
||||||
|
vn 0 1 0
|
||||||
|
vn 0 1 0
|
||||||
|
vn 0 1 0
|
||||||
|
vn 0 1 0
|
||||||
|
vn 0 1 0
|
||||||
|
vn 0 1 0
|
||||||
|
vn 0 -1 0
|
||||||
|
vn 0 -1 0
|
||||||
|
vn 0 -1 0
|
||||||
|
vn 0 -1 0
|
||||||
|
vn 0 -1 0
|
||||||
|
vn 0 -1 0
|
||||||
|
vn 0 0 1
|
||||||
|
vn 0 0 1
|
||||||
|
vn 0 0 1
|
||||||
|
vn 0 0 1
|
||||||
|
vn 0 0 1
|
||||||
|
vn 0 0 1
|
||||||
|
vn 0 0 -1
|
||||||
|
vn 0 0 -1
|
||||||
|
vn 0 0 -1
|
||||||
|
vn 0 0 -1
|
||||||
|
vn 0 0 -1
|
||||||
|
vn 0 0 -1
|
||||||
|
usemtl m_0
|
||||||
|
f 1/1/1 3/2/2 2/3/3
|
||||||
|
f 3/4/4 4/5/5 2/6/6
|
||||||
|
usemtl m_0
|
||||||
|
f 5/7/7 7/8/8 6/9/9
|
||||||
|
f 7/10/10 8/11/11 6/12/12
|
||||||
|
usemtl m_0
|
||||||
|
f 5/13/13 6/14/14 2/15/15
|
||||||
|
f 6/16/16 1/17/17 2/18/18
|
||||||
|
usemtl m_0
|
||||||
|
f 8/19/19 7/20/20 3/21/21
|
||||||
|
f 7/22/22 4/23/23 3/24/24
|
||||||
|
usemtl m_0
|
||||||
|
f 6/25/25 8/26/26 1/27/27
|
||||||
|
f 8/28/28 3/29/29 1/30/30
|
||||||
|
usemtl m_0
|
||||||
|
f 2/31/31 4/32/32 5/33/33
|
||||||
|
f 4/34/34 7/35/35 5/36/36
|
|
@ -0,0 +1,4 @@
|
||||||
|
# Made in Blockbench 3.7.4
|
||||||
|
newmtl m_0
|
||||||
|
map_Kd eri_dungeon.png
|
||||||
|
newmtl none
|
After Width: | Height: | Size: 3.0 MiB |
|
@ -0,0 +1,101 @@
|
||||||
|
# Made in Blockbench 3.7.4
|
||||||
|
mtllib art_12_9.mtl
|
||||||
|
o cube
|
||||||
|
v 0.0625 1.625 0.625
|
||||||
|
v 0.0625 1.625 -0.625
|
||||||
|
v 0.0625 0 0.625
|
||||||
|
v 0.0625 0 -0.625
|
||||||
|
v 0 1.625 -0.625
|
||||||
|
v 0 1.625 0.625
|
||||||
|
v 0 0 -0.625
|
||||||
|
v 0 0 0.625
|
||||||
|
vt 0 1
|
||||||
|
vt 0 0
|
||||||
|
vt 1 1
|
||||||
|
vt 0 0
|
||||||
|
vt 1 0
|
||||||
|
vt 1 1
|
||||||
|
vt 0 1
|
||||||
|
vt 0 1
|
||||||
|
vt 0 1
|
||||||
|
vt 0 1
|
||||||
|
vt 0 1
|
||||||
|
vt 0 1
|
||||||
|
vt 0 1.001
|
||||||
|
vt 0 1
|
||||||
|
vt 0.999 1.001
|
||||||
|
vt 0 1
|
||||||
|
vt 0.999 1
|
||||||
|
vt 0.999 1.001
|
||||||
|
vt 0 -0.1499999999999999
|
||||||
|
vt 0 0
|
||||||
|
vt 0.999 -0.1499999999999999
|
||||||
|
vt 0 0
|
||||||
|
vt 0.999 0
|
||||||
|
vt 0.999 -0.1499999999999999
|
||||||
|
vt 0 1
|
||||||
|
vt 0 0
|
||||||
|
vt 0 1
|
||||||
|
vt 0 0
|
||||||
|
vt 0 0
|
||||||
|
vt 0 1
|
||||||
|
vt 1 1
|
||||||
|
vt 1 0
|
||||||
|
vt 1.099 1
|
||||||
|
vt 1 0
|
||||||
|
vt 1.099 0
|
||||||
|
vt 1.099 1
|
||||||
|
vn 1 0 0
|
||||||
|
vn 1 0 0
|
||||||
|
vn 1 0 0
|
||||||
|
vn 1 0 0
|
||||||
|
vn 1 0 0
|
||||||
|
vn 1 0 0
|
||||||
|
vn -1 0 0
|
||||||
|
vn -1 0 0
|
||||||
|
vn -1 0 0
|
||||||
|
vn -1 0 0
|
||||||
|
vn -1 0 0
|
||||||
|
vn -1 0 0
|
||||||
|
vn 0 1 0
|
||||||
|
vn 0 1 0
|
||||||
|
vn 0 1 0
|
||||||
|
vn 0 1 0
|
||||||
|
vn 0 1 0
|
||||||
|
vn 0 1 0
|
||||||
|
vn 0 -1 0
|
||||||
|
vn 0 -1 0
|
||||||
|
vn 0 -1 0
|
||||||
|
vn 0 -1 0
|
||||||
|
vn 0 -1 0
|
||||||
|
vn 0 -1 0
|
||||||
|
vn 0 0 1
|
||||||
|
vn 0 0 1
|
||||||
|
vn 0 0 1
|
||||||
|
vn 0 0 1
|
||||||
|
vn 0 0 1
|
||||||
|
vn 0 0 1
|
||||||
|
vn 0 0 -1
|
||||||
|
vn 0 0 -1
|
||||||
|
vn 0 0 -1
|
||||||
|
vn 0 0 -1
|
||||||
|
vn 0 0 -1
|
||||||
|
vn 0 0 -1
|
||||||
|
usemtl m_0
|
||||||
|
f 1/1/1 3/2/2 2/3/3
|
||||||
|
f 3/4/4 4/5/5 2/6/6
|
||||||
|
usemtl m_0
|
||||||
|
f 5/7/7 7/8/8 6/9/9
|
||||||
|
f 7/10/10 8/11/11 6/12/12
|
||||||
|
usemtl m_0
|
||||||
|
f 5/13/13 6/14/14 2/15/15
|
||||||
|
f 6/16/16 1/17/17 2/18/18
|
||||||
|
usemtl m_0
|
||||||
|
f 8/19/19 7/20/20 3/21/21
|
||||||
|
f 7/22/22 4/23/23 3/24/24
|
||||||
|
usemtl m_0
|
||||||
|
f 6/25/25 8/26/26 1/27/27
|
||||||
|
f 8/28/28 3/29/29 1/30/30
|
||||||
|
usemtl m_0
|
||||||
|
f 2/31/31 4/32/32 5/33/33
|
||||||
|
f 4/34/34 7/35/35 5/36/36
|
|
@ -0,0 +1,4 @@
|
||||||
|
# Made in Blockbench 3.7.4
|
||||||
|
newmtl m_0
|
||||||
|
map_Kd eri_painting.png
|
||||||
|
newmtl none
|
After Width: | Height: | Size: 1.5 MiB |
|
@ -0,0 +1,101 @@
|
||||||
|
# Made in Blockbench 3.7.4
|
||||||
|
mtllib carpet.mtl
|
||||||
|
o cube
|
||||||
|
v 1 0.0625 2
|
||||||
|
v 1 0.0625 -2
|
||||||
|
v 1 0 2
|
||||||
|
v 1 0 -2
|
||||||
|
v -1 0.0625 -2
|
||||||
|
v -1 0.0625 2
|
||||||
|
v -1 0 -2
|
||||||
|
v -1 0 2
|
||||||
|
vt 0.96875 1
|
||||||
|
vt 0.96875 0
|
||||||
|
vt 1 1
|
||||||
|
vt 0.96875 0
|
||||||
|
vt 1 0
|
||||||
|
vt 1 1
|
||||||
|
vt 0 1
|
||||||
|
vt 0 0
|
||||||
|
vt 0.03125 1
|
||||||
|
vt 0 0
|
||||||
|
vt 0.03125 0
|
||||||
|
vt 0.03125 1
|
||||||
|
vt 0 1
|
||||||
|
vt 0 0
|
||||||
|
vt 1 1
|
||||||
|
vt 0 0
|
||||||
|
vt 1 0
|
||||||
|
vt 1 1
|
||||||
|
vt 0 1
|
||||||
|
vt 0 0
|
||||||
|
vt 1 1
|
||||||
|
vt 0 0
|
||||||
|
vt 1 0
|
||||||
|
vt 1 1
|
||||||
|
vt 0 0.015625
|
||||||
|
vt 0 0
|
||||||
|
vt 1 0.015625
|
||||||
|
vt 0 0
|
||||||
|
vt 1 0
|
||||||
|
vt 1 0.015625
|
||||||
|
vt 0 1
|
||||||
|
vt 0 0.984375
|
||||||
|
vt 1 1
|
||||||
|
vt 0 0.984375
|
||||||
|
vt 1 0.984375
|
||||||
|
vt 1 1
|
||||||
|
vn 1 0 0
|
||||||
|
vn 1 0 0
|
||||||
|
vn 1 0 0
|
||||||
|
vn 1 0 0
|
||||||
|
vn 1 0 0
|
||||||
|
vn 1 0 0
|
||||||
|
vn -1 0 0
|
||||||
|
vn -1 0 0
|
||||||
|
vn -1 0 0
|
||||||
|
vn -1 0 0
|
||||||
|
vn -1 0 0
|
||||||
|
vn -1 0 0
|
||||||
|
vn 0 1 0
|
||||||
|
vn 0 1 0
|
||||||
|
vn 0 1 0
|
||||||
|
vn 0 1 0
|
||||||
|
vn 0 1 0
|
||||||
|
vn 0 1 0
|
||||||
|
vn 0 -1 0
|
||||||
|
vn 0 -1 0
|
||||||
|
vn 0 -1 0
|
||||||
|
vn 0 -1 0
|
||||||
|
vn 0 -1 0
|
||||||
|
vn 0 -1 0
|
||||||
|
vn 0 0 1
|
||||||
|
vn 0 0 1
|
||||||
|
vn 0 0 1
|
||||||
|
vn 0 0 1
|
||||||
|
vn 0 0 1
|
||||||
|
vn 0 0 1
|
||||||
|
vn 0 0 -1
|
||||||
|
vn 0 0 -1
|
||||||
|
vn 0 0 -1
|
||||||
|
vn 0 0 -1
|
||||||
|
vn 0 0 -1
|
||||||
|
vn 0 0 -1
|
||||||
|
usemtl m_0
|
||||||
|
f 1/1/1 3/2/2 2/3/3
|
||||||
|
f 3/4/4 4/5/5 2/6/6
|
||||||
|
usemtl m_0
|
||||||
|
f 5/7/7 7/8/8 6/9/9
|
||||||
|
f 7/10/10 8/11/11 6/12/12
|
||||||
|
usemtl m_0
|
||||||
|
f 5/13/13 6/14/14 2/15/15
|
||||||
|
f 6/16/16 1/17/17 2/18/18
|
||||||
|
usemtl m_0
|
||||||
|
f 8/19/19 7/20/20 3/21/21
|
||||||
|
f 7/22/22 4/23/23 3/24/24
|
||||||
|
usemtl m_0
|
||||||
|
f 6/25/25 8/26/26 1/27/27
|
||||||
|
f 8/28/28 3/29/29 1/30/30
|
||||||
|
usemtl m_0
|
||||||
|
f 2/31/31 4/32/32 5/33/33
|
||||||
|
f 4/34/34 7/35/35 5/36/36
|
|
@ -0,0 +1,4 @@
|
||||||
|
# Made in Blockbench 3.7.4
|
||||||
|
newmtl m_0
|
||||||
|
map_Kd texture.png
|
||||||
|
newmtl none
|
|
@ -0,0 +1 @@
|
||||||
|
{"meta":{"format_version":"3.6","creation_time":1615796434,"model_format":"free","box_uv":false},"name":"carpet","geometry_name":"","visible_box":[1,1,0],"resolution":{"width":16,"height":32},"elements":[{"name":"cube","from":[-16,0,-32],"to":[16,1,32],"autouv":0,"color":5,"locked":false,"origin":[0,0,0],"faces":{"north":{"uv":[0,0,16,0.5],"texture":0},"east":{"uv":[15.5,0,16,32],"texture":0},"south":{"uv":[0,31.5,16,32],"texture":0},"west":{"uv":[0,0,0.5,32],"texture":0},"up":{"uv":[0,0,16,32],"texture":0},"down":{"uv":[0,0,16,32],"texture":0}},"uuid":"a26d98c3-7faf-7a10-8f9b-c71086b96d3e"}],"outliner":["a26d98c3-7faf-7a10-8f9b-c71086b96d3e"],"textures":[{"path":"/home/maelys/Projects/Love2D/3d/objects/carpet/texture.png","name":"texture.png","folder":"carpet","namespace":"","id":"0","particle":false,"visible":true,"mode":"bitmap","saved":true,"uuid":"8fcbb96f-84a5-8132-d586-c7111d97fbfa","source":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAABACAYAAAB7jnWuAAACeUlEQVRoQ+1ZMU4EMQxcGjpAAtEgXoCERMNnqHkWNR9C4gWIBoEEdDQgR5po4rMTZ7lVtthr7va08YwdexInB7fTze808HPABK5PrwoqTx/P6fny5CL///L5mn4fHx4V7379fLvvenZlQCJwPp2lwW/Te/ruIQIWFknPDuMVBGCshwiHAdFpATNOngKwYoNRIr3AHO1EQMIHI3OIRD1mYGBmAvB8DhGMRdLWnNC5skMgSsTyOgrMGEUZMrsWEckPkBDPNTjyp2YzlyFq2qplj4hHIALMeEUEegWRI9A7Fu8nAsJIvNfhaiVkbQp0xmu9AGaOgKVkVlKxiLQIaGGzMMwyrAHDs2gVaGGrlqGE3ANHcllrhdYBea7ZAQnBKyLgEeCMt8C8BczTBZNAFBxqdz/dFYn/MD3urKSWPmAKd6Q4QkAMamBdfkKklZwS0YJATw1HCPTYK1ZDb87YowiB7gggHC0C4tliOSDGI3mwWBXUCLCsLqoDLRKWDHNEIgpqKqEYGboWrGI17KldvLu3/YCeAuSCfHu7JakYJsD6XhsH8thrJCESQ1YbxkSszYpFQAN4mxxgZgK6vq3NJBOKtG88rVbzIk7nHVHLoDaAiHn5oKfEs58IiL7zKsbMAaQTrrUc63HaJjDXQcDb0XB1LDoFPD9eNejsbuWM1pVqEg4vw+FCNEeGOW90SfbY21qzrTXbWrN1NCY9dRvpjHrsrSMCW2vG26ehRzRbazb0oLKndvfemq3msHrYcX0PsITfO7icfWERPZzwLrF0XxklUhzVto7ma83Lvy+txPic27JoA1qzvY6Ly+FXt1pYaocVi1xez1HBfY35A/pA4W5FQiY4AAAAAElFTkSuQmCC"}]}
|
After Width: | Height: | Size: 763 B |
|
@ -0,0 +1,299 @@
|
||||||
|
# Made in Blockbench 3.7.4
|
||||||
|
mtllib flower_pot-.mtl
|
||||||
|
o cube
|
||||||
|
v 0.125 0.3125 0.1875
|
||||||
|
v 0.125 0.3125 -0.125
|
||||||
|
v 0.125 0 0.1875
|
||||||
|
v 0.125 0 -0.125
|
||||||
|
v -0.1875 0.3125 -0.125
|
||||||
|
v -0.1875 0.3125 0.1875
|
||||||
|
v -0.1875 0 -0.125
|
||||||
|
v -0.1875 0 0.1875
|
||||||
|
vt 0 0.5625
|
||||||
|
vt 0 0.25
|
||||||
|
vt 0.3125 0.5625
|
||||||
|
vt 0 0.25
|
||||||
|
vt 0.3125 0.25
|
||||||
|
vt 0.3125 0.5625
|
||||||
|
vt 0 0.5625
|
||||||
|
vt 0 0.25
|
||||||
|
vt 0.3125 0.5625
|
||||||
|
vt 0 0.25
|
||||||
|
vt 0.3125 0.25
|
||||||
|
vt 0.3125 0.5625
|
||||||
|
vt 0 0.9375
|
||||||
|
vt 0 0.625
|
||||||
|
vt 0.3125 0.9375
|
||||||
|
vt 0 0.625
|
||||||
|
vt 0.3125 0.625
|
||||||
|
vt 0.3125 0.9375
|
||||||
|
vt 0 0.5625
|
||||||
|
vt 0 0.25
|
||||||
|
vt 0.3125 0.5625
|
||||||
|
vt 0 0.25
|
||||||
|
vt 0.3125 0.25
|
||||||
|
vt 0.3125 0.5625
|
||||||
|
vt 0 0.5625
|
||||||
|
vt 0 0.25
|
||||||
|
vt 0.3125 0.5625
|
||||||
|
vt 0 0.25
|
||||||
|
vt 0.3125 0.25
|
||||||
|
vt 0.3125 0.5625
|
||||||
|
vt 0 0.5625
|
||||||
|
vt 0 0.25
|
||||||
|
vt 0.3125 0.5625
|
||||||
|
vt 0 0.25
|
||||||
|
vt 0.3125 0.25
|
||||||
|
vt 0.3125 0.5625
|
||||||
|
vn 1 0 0
|
||||||
|
vn 1 0 0
|
||||||
|
vn 1 0 0
|
||||||
|
vn 1 0 0
|
||||||
|
vn 1 0 0
|
||||||
|
vn 1 0 0
|
||||||
|
vn -1 0 0
|
||||||
|
vn -1 0 0
|
||||||
|
vn -1 0 0
|
||||||
|
vn -1 0 0
|
||||||
|
vn -1 0 0
|
||||||
|
vn -1 0 0
|
||||||
|
vn 0 1 0
|
||||||
|
vn 0 1 0
|
||||||
|
vn 0 1 0
|
||||||
|
vn 0 1 0
|
||||||
|
vn 0 1 0
|
||||||
|
vn 0 1 0
|
||||||
|
vn 0 -1 0
|
||||||
|
vn 0 -1 0
|
||||||
|
vn 0 -1 0
|
||||||
|
vn 0 -1 0
|
||||||
|
vn 0 -1 0
|
||||||
|
vn 0 -1 0
|
||||||
|
vn 0 0 1
|
||||||
|
vn 0 0 1
|
||||||
|
vn 0 0 1
|
||||||
|
vn 0 0 1
|
||||||
|
vn 0 0 1
|
||||||
|
vn 0 0 1
|
||||||
|
vn 0 0 -1
|
||||||
|
vn 0 0 -1
|
||||||
|
vn 0 0 -1
|
||||||
|
vn 0 0 -1
|
||||||
|
vn 0 0 -1
|
||||||
|
vn 0 0 -1
|
||||||
|
usemtl m_0
|
||||||
|
f 1/1/1 3/2/2 2/3/3
|
||||||
|
f 3/4/4 4/5/5 2/6/6
|
||||||
|
usemtl m_0
|
||||||
|
f 5/7/7 7/8/8 6/9/9
|
||||||
|
f 7/10/10 8/11/11 6/12/12
|
||||||
|
usemtl m_0
|
||||||
|
f 5/13/13 6/14/14 2/15/15
|
||||||
|
f 6/16/16 1/17/17 2/18/18
|
||||||
|
usemtl m_0
|
||||||
|
f 8/19/19 7/20/20 3/21/21
|
||||||
|
f 7/22/22 4/23/23 3/24/24
|
||||||
|
usemtl m_0
|
||||||
|
f 6/25/25 8/26/26 1/27/27
|
||||||
|
f 8/28/28 3/29/29 1/30/30
|
||||||
|
usemtl m_0
|
||||||
|
f 2/31/31 4/32/32 5/33/33
|
||||||
|
f 4/34/34 7/35/35 5/36/36
|
||||||
|
o cube
|
||||||
|
v 0.08351506329462022 0.6875 -0.08253832729865353
|
||||||
|
v 0.08347086912079607 0.6875 -0.08258252147247767
|
||||||
|
v 0.08351506329462022 0.3125 -0.08253832729865353
|
||||||
|
v 0.08347086912079607 0.3125 -0.08258252147247767
|
||||||
|
v -0.1375 0.6875 0.13838834764831842
|
||||||
|
v -0.13745580582617586 0.6875 0.1384325418221426
|
||||||
|
v -0.1375 0.3125 0.13838834764831842
|
||||||
|
v -0.13745580582617586 0.3125 0.1384325418221426
|
||||||
|
vt 0 1
|
||||||
|
vt 0 0.625
|
||||||
|
vt 0 1
|
||||||
|
vt 0 0.625
|
||||||
|
vt 0 0.625
|
||||||
|
vt 0 1
|
||||||
|
vt 0 1
|
||||||
|
vt 0 0.625
|
||||||
|
vt 0 1
|
||||||
|
vt 0 0.625
|
||||||
|
vt 0 0.625
|
||||||
|
vt 0 1
|
||||||
|
vt 0 1
|
||||||
|
vt 0 1
|
||||||
|
vt 0.3125 1
|
||||||
|
vt 0 1
|
||||||
|
vt 0.3125 1
|
||||||
|
vt 0.3125 1
|
||||||
|
vt 0 1
|
||||||
|
vt 0 1
|
||||||
|
vt 0.3125 1
|
||||||
|
vt 0 1
|
||||||
|
vt 0.3125 1
|
||||||
|
vt 0.3125 1
|
||||||
|
vt 0.375 0.9375
|
||||||
|
vt 0.375 0.5625
|
||||||
|
vt 0.6875 0.9375
|
||||||
|
vt 0.375 0.5625
|
||||||
|
vt 0.6875 0.5625
|
||||||
|
vt 0.6875 0.9375
|
||||||
|
vt 0.375 0.9375
|
||||||
|
vt 0.375 0.5625
|
||||||
|
vt 0.6875 0.9375
|
||||||
|
vt 0.375 0.5625
|
||||||
|
vt 0.6875 0.5625
|
||||||
|
vt 0.6875 0.9375
|
||||||
|
vn 0.7071067811865475 0 -0.7071067811865476
|
||||||
|
vn 0.7071067811865475 0 -0.7071067811865476
|
||||||
|
vn 0.7071067811865475 0 -0.7071067811865476
|
||||||
|
vn 0.7071067811865475 0 -0.7071067811865476
|
||||||
|
vn 0.7071067811865475 0 -0.7071067811865476
|
||||||
|
vn 0.7071067811865475 0 -0.7071067811865476
|
||||||
|
vn -0.7071067811865475 0 0.7071067811865476
|
||||||
|
vn -0.7071067811865475 0 0.7071067811865476
|
||||||
|
vn -0.7071067811865475 0 0.7071067811865476
|
||||||
|
vn -0.7071067811865475 0 0.7071067811865476
|
||||||
|
vn -0.7071067811865475 0 0.7071067811865476
|
||||||
|
vn -0.7071067811865475 0 0.7071067811865476
|
||||||
|
vn 0 1 0
|
||||||
|
vn 0 1 0
|
||||||
|
vn 0 1 0
|
||||||
|
vn 0 1 0
|
||||||
|
vn 0 1 0
|
||||||
|
vn 0 1 0
|
||||||
|
vn 0 -1 0
|
||||||
|
vn 0 -1 0
|
||||||
|
vn 0 -1 0
|
||||||
|
vn 0 -1 0
|
||||||
|
vn 0 -1 0
|
||||||
|
vn 0 -1 0
|
||||||
|
vn 0.7071067811865476 0 0.7071067811865475
|
||||||
|
vn 0.7071067811865476 0 0.7071067811865475
|
||||||
|
vn 0.7071067811865476 0 0.7071067811865475
|
||||||
|
vn 0.7071067811865476 0 0.7071067811865475
|
||||||
|
vn 0.7071067811865476 0 0.7071067811865475
|
||||||
|
vn 0.7071067811865476 0 0.7071067811865475
|
||||||
|
vn -0.7071067811865476 0 -0.7071067811865475
|
||||||
|
vn -0.7071067811865476 0 -0.7071067811865475
|
||||||
|
vn -0.7071067811865476 0 -0.7071067811865475
|
||||||
|
vn -0.7071067811865476 0 -0.7071067811865475
|
||||||
|
vn -0.7071067811865476 0 -0.7071067811865475
|
||||||
|
vn -0.7071067811865476 0 -0.7071067811865475
|
||||||
|
usemtl m_0
|
||||||
|
f 9/37/37 11/38/38 10/39/39
|
||||||
|
f 11/40/40 12/41/41 10/42/42
|
||||||
|
usemtl m_0
|
||||||
|
f 13/43/43 15/44/44 14/45/45
|
||||||
|
f 15/46/46 16/47/47 14/48/48
|
||||||
|
usemtl m_0
|
||||||
|
f 13/49/49 14/50/50 10/51/51
|
||||||
|
f 14/52/52 9/53/53 10/54/54
|
||||||
|
usemtl m_0
|
||||||
|
f 16/55/55 15/56/56 11/57/57
|
||||||
|
f 15/58/58 12/59/59 11/60/60
|
||||||
|
usemtl m_0
|
||||||
|
f 14/61/61 16/62/62 9/63/63
|
||||||
|
f 16/64/64 11/65/65 9/66/66
|
||||||
|
usemtl m_0
|
||||||
|
f 10/67/67 12/68/68 13/69/69
|
||||||
|
f 12/70/70 15/71/71 13/72/72
|
||||||
|
o cube
|
||||||
|
v -0.13477497965033508 0.6875 -0.08262671564630182
|
||||||
|
v -0.13481917382415923 0.6875 -0.08258252147247767
|
||||||
|
v -0.13477497965033508 0.3125 -0.08262671564630182
|
||||||
|
v -0.13481917382415923 0.3125 -0.08258252147247767
|
||||||
|
v 0.08615169529663685 0.6875 0.13838834764831848
|
||||||
|
v 0.08619588947046103 0.6875 0.1383441534744943
|
||||||
|
v 0.08615169529663685 0.3125 0.13838834764831848
|
||||||
|
v 0.08619588947046103 0.3125 0.1383441534744943
|
||||||
|
vt 0 1
|
||||||
|
vt 0 0.625
|
||||||
|
vt 0 1
|
||||||
|
vt 0 0.625
|
||||||
|
vt 0 0.625
|
||||||
|
vt 0 1
|
||||||
|
vt 0 1
|
||||||
|
vt 0 0.625
|
||||||
|
vt 0 1
|
||||||
|
vt 0 0.625
|
||||||
|
vt 0 0.625
|
||||||
|
vt 0 1
|
||||||
|
vt 0 1
|
||||||
|
vt 0 1
|
||||||
|
vt 0.3125 1
|
||||||
|
vt 0 1
|
||||||
|
vt 0.3125 1
|
||||||
|
vt 0.3125 1
|
||||||
|
vt 0 1
|
||||||
|
vt 0 1
|
||||||
|
vt 0.3125 1
|
||||||
|
vt 0 1
|
||||||
|
vt 0.3125 1
|
||||||
|
vt 0.3125 1
|
||||||
|
vt 0.375 0.9375
|
||||||
|
vt 0.375 0.5625
|
||||||
|
vt 0.6875 0.9375
|
||||||
|
vt 0.375 0.5625
|
||||||
|
vt 0.6875 0.5625
|
||||||
|
vt 0.6875 0.9375
|
||||||
|
vt 0.375 0.9375
|
||||||
|
vt 0.375 0.5625
|
||||||
|
vt 0.6875 0.9375
|
||||||
|
vt 0.375 0.5625
|
||||||
|
vt 0.6875 0.5625
|
||||||
|
vt 0.6875 0.9375
|
||||||
|
vn -0.7071067811865475 0 -0.7071067811865477
|
||||||
|
vn -0.7071067811865475 0 -0.7071067811865477
|
||||||
|
vn -0.7071067811865475 0 -0.7071067811865477
|
||||||
|
vn -0.7071067811865475 0 -0.7071067811865477
|
||||||
|
vn -0.7071067811865475 0 -0.7071067811865477
|
||||||
|
vn -0.7071067811865475 0 -0.7071067811865477
|
||||||
|
vn 0.7071067811865475 0 0.7071067811865477
|
||||||
|
vn 0.7071067811865475 0 0.7071067811865477
|
||||||
|
vn 0.7071067811865475 0 0.7071067811865477
|
||||||
|
vn 0.7071067811865475 0 0.7071067811865477
|
||||||
|
vn 0.7071067811865475 0 0.7071067811865477
|
||||||
|
vn 0.7071067811865475 0 0.7071067811865477
|
||||||
|
vn 0 1 0
|
||||||
|
vn 0 1 0
|
||||||
|
vn 0 1 0
|
||||||
|
vn 0 1 0
|
||||||
|
vn 0 1 0
|
||||||
|
vn 0 1 0
|
||||||
|
vn 0 -1 0
|
||||||
|
vn 0 -1 0
|
||||||
|
vn 0 -1 0
|
||||||
|
vn 0 -1 0
|
||||||
|
vn 0 -1 0
|
||||||
|
vn 0 -1 0
|
||||||
|
vn 0.7071067811865477 0 -0.7071067811865475
|
||||||
|
vn 0.7071067811865477 0 -0.7071067811865475
|
||||||
|
vn 0.7071067811865477 0 -0.7071067811865475
|
||||||
|
vn 0.7071067811865477 0 -0.7071067811865475
|
||||||
|
vn 0.7071067811865477 0 -0.7071067811865475
|
||||||
|
vn 0.7071067811865477 0 -0.7071067811865475
|
||||||
|
vn -0.7071067811865477 0 0.7071067811865475
|
||||||
|
vn -0.7071067811865477 0 0.7071067811865475
|
||||||
|
vn -0.7071067811865477 0 0.7071067811865475
|
||||||
|
vn -0.7071067811865477 0 0.7071067811865475
|
||||||
|
vn -0.7071067811865477 0 0.7071067811865475
|
||||||
|
vn -0.7071067811865477 0 0.7071067811865475
|
||||||
|
usemtl none
|
||||||
|
f 17/73/73 19/74/74 18/75/75
|
||||||
|
f 19/76/76 20/77/77 18/78/78
|
||||||
|
usemtl none
|
||||||
|
f 21/79/79 23/80/80 22/81/81
|
||||||
|
f 23/82/82 24/83/83 22/84/84
|
||||||
|
usemtl none
|
||||||
|
f 21/85/85 22/86/86 18/87/87
|
||||||
|
f 22/88/88 17/89/89 18/90/90
|
||||||
|
usemtl none
|
||||||
|
f 24/91/91 23/92/92 19/93/93
|
||||||
|
f 23/94/94 20/95/95 19/96/96
|
||||||
|
usemtl m_0
|
||||||
|
f 22/97/97 24/98/98 17/99/99
|
||||||
|
f 24/100/100 19/101/101 17/102/102
|
||||||
|
usemtl m_0
|
||||||
|
f 18/103/103 20/104/104 21/105/105
|
||||||
|
f 20/106/106 23/107/107 21/108/108
|
|
@ -0,0 +1,4 @@
|
||||||
|
# Made in Blockbench 3.7.4
|
||||||
|
newmtl m_0
|
||||||
|
map_Kd texture.png
|
||||||
|
newmtl none
|
|
@ -0,0 +1 @@
|
||||||
|
{"meta":{"format_version":"3.6","creation_time":1615782816,"model_format":"free","box_uv":false},"name":"test","geometry_name":"","visible_box":[1,1,0],"resolution":{"width":16,"height":16},"elements":[{"name":"cube","from":[-3,0,-2],"to":[2,5,3],"autouv":0,"color":7,"locked":false,"origin":[-1,9,0],"faces":{"north":{"uv":[0,7,5,12],"texture":0},"east":{"uv":[0,7,5,12],"texture":0},"south":{"uv":[0,7,5,12],"texture":0},"west":{"uv":[0,7,5,12],"texture":0},"up":{"uv":[0,1,5,6],"texture":0},"down":{"uv":[0,7,5,12],"texture":0}},"uuid":"4d0300ac-09a2-afd9-72ee-36d03e2108f8"},{"name":"cube","from":[-3.2,5,1.7999999999999998],"to":[1.7999999999999998,11,1.7999999999999998],"autouv":0,"color":7,"locked":false,"rotation":[0,45,0],"origin":[-2.2,5,0.8],"faces":{"north":{"uv":[6,1,11,7],"texture":0},"east":{"uv":[0,0,0,6],"texture":0},"south":{"uv":[6,1,11,7],"texture":0},"west":{"uv":[0,0,0,6],"texture":0},"up":{"uv":[0,0,5,0],"texture":0},"down":{"uv":[0,0,5,0],"texture":0}},"uuid":"14571871-9d91-4674-8945-cd178018ffc0"},{"name":"cube","from":[-4.45,5,1.7999999999999998],"to":[0.5499999999999998,11,1.7999999999999998],"autouv":0,"color":7,"locked":false,"rotation":[0,135,0],"origin":[-1.4500000000000002,5,0.8],"faces":{"north":{"uv":[6,1,11,7],"texture":0},"east":{"uv":[0,0,0,6]},"south":{"uv":[6,1,11,7],"texture":0},"west":{"uv":[0,0,0,6]},"up":{"uv":[0,0,5,0]},"down":{"uv":[0,0,5,0]}},"uuid":"3c95e525-722d-ee73-e12f-8875d3877fa9"}],"outliner":["4d0300ac-09a2-afd9-72ee-36d03e2108f8","14571871-9d91-4674-8945-cd178018ffc0","3c95e525-722d-ee73-e12f-8875d3877fa9"],"textures":[{"path":"/home/maelys/Projects/Love2D/ERDD/texture.png","name":"texture.png","folder":"ERDD","namespace":"","id":"0","particle":false,"visible":true,"mode":"bitmap","saved":true,"uuid":"bfdebd64-874a-7025-93b8-ad46de1998a4","source":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAbElEQVQ4T2NkoBAwCnMx/0c34+23v4wgsf///8PlGBkZwWLogLABIH3//zOQbwDUSrIMAOv9z/CfgZEBq/NB0ni9QJQBOCMBZjM6jaaB0UxJECMWTt17j9PJGLEwagDu+CU2ixAd2rgMHHgDAM24QBFzHzMyAAAAAElFTkSuQmCC"}]}
|
After Width: | Height: | Size: 162 B |
|
@ -0,0 +1,101 @@
|
||||||
|
# Made in Blockbench 3.7.4
|
||||||
|
mtllib ground.mtl
|
||||||
|
o cube
|
||||||
|
v 0.5 0.0000625 0.5
|
||||||
|
v 0.5 0.0000625 -0.5
|
||||||
|
v 0.5 0 0.5
|
||||||
|
v 0.5 0 -0.5
|
||||||
|
v -0.5625 0.0000625 -0.5
|
||||||
|
v -0.5625 0.0000625 0.5
|
||||||
|
v -0.5625 0 -0.5
|
||||||
|
v -0.5625 0 0.5
|
||||||
|
vt 0 1
|
||||||
|
vt 0 1
|
||||||
|
vt 1 1
|
||||||
|
vt 0 1
|
||||||
|
vt 1 1
|
||||||
|
vt 1 1
|
||||||
|
vt 0 1
|
||||||
|
vt 0 1
|
||||||
|
vt 1 1
|
||||||
|
vt 0 1
|
||||||
|
vt 1 1
|
||||||
|
vt 1 1
|
||||||
|
vt 0 1
|
||||||
|
vt 0 0
|
||||||
|
vt 1 1
|
||||||
|
vt 0 0
|
||||||
|
vt 1 0
|
||||||
|
vt 1 1
|
||||||
|
vt 0 1
|
||||||
|
vt 0 0
|
||||||
|
vt 1 1
|
||||||
|
vt 0 0
|
||||||
|
vt 1 0
|
||||||
|
vt 1 1
|
||||||
|
vt 0 1
|
||||||
|
vt 0 1
|
||||||
|
vt 1 1
|
||||||
|
vt 0 1
|
||||||
|
vt 1 1
|
||||||
|
vt 1 1
|
||||||
|
vt 0 1
|
||||||
|
vt 0 1
|
||||||
|
vt 1 1
|
||||||
|
vt 0 1
|
||||||
|
vt 1 1
|
||||||
|
vt 1 1
|
||||||
|
vn 1 0 0
|
||||||
|
vn 1 0 0
|
||||||
|
vn 1 0 0
|
||||||
|
vn 1 0 0
|
||||||
|
vn 1 0 0
|
||||||
|
vn 1 0 0
|
||||||
|
vn -1 0 0
|
||||||
|
vn -1 0 0
|
||||||
|
vn -1 0 0
|
||||||
|
vn -1 0 0
|
||||||
|
vn -1 0 0
|
||||||
|
vn -1 0 0
|
||||||
|
vn 0 1 0
|
||||||
|
vn 0 1 0
|
||||||
|
vn 0 1 0
|
||||||
|
vn 0 1 0
|
||||||
|
vn 0 1 0
|
||||||
|
vn 0 1 0
|
||||||
|
vn 0 -1 0
|
||||||
|
vn 0 -1 0
|
||||||
|
vn 0 -1 0
|
||||||
|
vn 0 -1 0
|
||||||
|
vn 0 -1 0
|
||||||
|
vn 0 -1 0
|
||||||
|
vn 0 0 1
|
||||||
|
vn 0 0 1
|
||||||
|
vn 0 0 1
|
||||||
|
vn 0 0 1
|
||||||
|
vn 0 0 1
|
||||||
|
vn 0 0 1
|
||||||
|
vn 0 0 -1
|
||||||
|
vn 0 0 -1
|
||||||
|
vn 0 0 -1
|
||||||
|
vn 0 0 -1
|
||||||
|
vn 0 0 -1
|
||||||
|
vn 0 0 -1
|
||||||
|
usemtl none
|
||||||
|
f 1/1/1 3/2/2 2/3/3
|
||||||
|
f 3/4/4 4/5/5 2/6/6
|
||||||
|
usemtl none
|
||||||
|
f 5/7/7 7/8/8 6/9/9
|
||||||
|
f 7/10/10 8/11/11 6/12/12
|
||||||
|
usemtl m_0
|
||||||
|
f 5/13/13 6/14/14 2/15/15
|
||||||
|
f 6/16/16 1/17/17 2/18/18
|
||||||
|
usemtl m_0
|
||||||
|
f 8/19/19 7/20/20 3/21/21
|
||||||
|
f 7/22/22 4/23/23 3/24/24
|
||||||
|
usemtl none
|
||||||
|
f 6/25/25 8/26/26 1/27/27
|
||||||
|
f 8/28/28 3/29/29 1/30/30
|
||||||
|
usemtl none
|
||||||
|
f 2/31/31 4/32/32 5/33/33
|
||||||
|
f 4/34/34 7/35/35 5/36/36
|
|
@ -0,0 +1,4 @@
|
||||||
|
# Made in Blockbench 3.7.4
|
||||||
|
newmtl m_0
|
||||||
|
map_Kd texture
|
||||||
|
newmtl none
|
|
@ -0,0 +1 @@
|
||||||
|
{"meta":{"format_version":"3.6","creation_time":1615807761,"model_format":"free","box_uv":false},"name":"","geometry_name":"","visible_box":[1,1,0],"resolution":{"width":16,"height":16},"elements":[{"name":"cube","from":[-9,0,-8],"to":[8,0,8],"autouv":1,"color":3,"locked":false,"origin":[0,0,0],"faces":{"north":{"uv":[0,0,16,0]},"east":{"uv":[0,0,16,0]},"south":{"uv":[0,0,16,0]},"west":{"uv":[0,0,16,0]},"up":{"uv":[0,0,16,16],"texture":0},"down":{"uv":[0,0,16,16],"texture":0}},"uuid":"28a077e3-d74e-0c37-296d-aa08fa8ff180"}],"outliner":["28a077e3-d74e-0c37-296d-aa08fa8ff180"],"textures":[{"path":"","name":"texture","folder":"block","namespace":"","id":"0","particle":false,"visible":true,"mode":"bitmap","saved":false,"uuid":"009edd2c-05b2-2b02-3976-13c4215221dc","source":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAY0lEQVQ4T2MM1uP4L837nwEE/v35Caaff+cA0zCAT54xx5zhPxMLO1jt518o+hi4mSAG4pOnjgGkOBnkImQvgV1AkQGJpuyQEGRgIMrP6GHCSLEBFEcjxQaMpgMGyqNxwNMBADyyqbH2FrfXAAAAAElFTkSuQmCC"}]}
|
After Width: | Height: | Size: 156 B |
|
@ -0,0 +1,497 @@
|
||||||
|
# Made in Blockbench 3.7.4
|
||||||
|
mtllib stairs.mtl
|
||||||
|
o cube
|
||||||
|
v -0.4277133677773932 0.4883275019814831 0.0625
|
||||||
|
v -0.4277133677773932 0.4883275019814831 -0.0625
|
||||||
|
v 0.4592974654008285 0.026578888746449238 0.0625
|
||||||
|
v 0.4592974654008285 0.026578888746449238 -0.0625
|
||||||
|
v -0.4854319444317725 0.3774511478342054 -0.0625
|
||||||
|
v -0.4854319444317725 0.3774511478342054 0.0625
|
||||||
|
v 0.40157888874644926 -0.08429746540082847 -0.0625
|
||||||
|
v 0.40157888874644926 -0.08429746540082847 0.0625
|
||||||
|
vt 0.9375 1
|
||||||
|
vt 0.9375 0.5
|
||||||
|
vt 1 1
|
||||||
|
vt 0.9375 0.5
|
||||||
|
vt 1 0.5
|
||||||
|
vt 1 1
|
||||||
|
vt 0.9375 1
|
||||||
|
vt 0.9375 0.5
|
||||||
|
vt 1 1
|
||||||
|
vt 0.9375 0.5
|
||||||
|
vt 1 0.5
|
||||||
|
vt 1 1
|
||||||
|
vt 0.9375 0.8125
|
||||||
|
vt 0.9375 0.75
|
||||||
|
vt 1 0.8125
|
||||||
|
vt 0.9375 0.75
|
||||||
|
vt 1 0.75
|
||||||
|
vt 1 0.8125
|
||||||
|
vt 0.9375 0.8125
|
||||||
|
vt 0.9375 0.75
|
||||||
|
vt 1 0.8125
|
||||||
|
vt 0.9375 0.75
|
||||||
|
vt 1 0.75
|
||||||
|
vt 1 0.8125
|
||||||
|
vt 0.9375 1
|
||||||
|
vt 0.9375 0.5
|
||||||
|
vt 1 1
|
||||||
|
vt 0.9375 0.5
|
||||||
|
vt 1 0.5
|
||||||
|
vt 1 1
|
||||||
|
vt 0.9375 1
|
||||||
|
vt 0.9375 0.5
|
||||||
|
vt 1 1
|
||||||
|
vt 0.9375 0.5
|
||||||
|
vt 1 0.5
|
||||||
|
vt 1 1
|
||||||
|
vn 0.4617486132350339 0.8870108331782217 0
|
||||||
|
vn 0.4617486132350339 0.8870108331782217 0
|
||||||
|
vn 0.4617486132350339 0.8870108331782217 0
|
||||||
|
vn 0.4617486132350339 0.8870108331782217 0
|
||||||
|
vn 0.4617486132350339 0.8870108331782217 0
|
||||||
|
vn 0.4617486132350339 0.8870108331782217 0
|
||||||
|
vn -0.4617486132350339 -0.8870108331782217 0
|
||||||
|
vn -0.4617486132350339 -0.8870108331782217 0
|
||||||
|
vn -0.4617486132350339 -0.8870108331782217 0
|
||||||
|
vn -0.4617486132350339 -0.8870108331782217 0
|
||||||
|
vn -0.4617486132350339 -0.8870108331782217 0
|
||||||
|
vn -0.4617486132350339 -0.8870108331782217 0
|
||||||
|
vn -0.8870108331782217 0.4617486132350339 0
|
||||||
|
vn -0.8870108331782217 0.4617486132350339 0
|
||||||
|
vn -0.8870108331782217 0.4617486132350339 0
|
||||||
|
vn -0.8870108331782217 0.4617486132350339 0
|
||||||
|
vn -0.8870108331782217 0.4617486132350339 0
|
||||||
|
vn -0.8870108331782217 0.4617486132350339 0
|
||||||
|
vn 0.8870108331782217 -0.4617486132350339 0
|
||||||
|
vn 0.8870108331782217 -0.4617486132350339 0
|
||||||
|
vn 0.8870108331782217 -0.4617486132350339 0
|
||||||
|
vn 0.8870108331782217 -0.4617486132350339 0
|
||||||
|
vn 0.8870108331782217 -0.4617486132350339 0
|
||||||
|
vn 0.8870108331782217 -0.4617486132350339 0
|
||||||
|
vn 0 0 1
|
||||||
|
vn 0 0 1
|
||||||
|
vn 0 0 1
|
||||||
|
vn 0 0 1
|
||||||
|
vn 0 0 1
|
||||||
|
vn 0 0 1
|
||||||
|
vn 0 0 -1
|
||||||
|
vn 0 0 -1
|
||||||
|
vn 0 0 -1
|
||||||
|
vn 0 0 -1
|
||||||
|
vn 0 0 -1
|
||||||
|
vn 0 0 -1
|
||||||
|
usemtl m_0
|
||||||
|
f 1/1/1 3/2/2 2/3/3
|
||||||
|
f 3/4/4 4/5/5 2/6/6
|
||||||
|
usemtl m_0
|
||||||
|
f 5/7/7 7/8/8 6/9/9
|
||||||
|
f 7/10/10 8/11/11 6/12/12
|
||||||
|
usemtl m_0
|
||||||
|
f 5/13/13 6/14/14 2/15/15
|
||||||
|
f 6/16/16 1/17/17 2/18/18
|
||||||
|
usemtl m_0
|
||||||
|
f 8/19/19 7/20/20 3/21/21
|
||||||
|
f 7/22/22 4/23/23 3/24/24
|
||||||
|
usemtl m_0
|
||||||
|
f 6/25/25 8/26/26 1/27/27
|
||||||
|
f 8/28/28 3/29/29 1/30/30
|
||||||
|
usemtl m_0
|
||||||
|
f 2/31/31 4/32/32 5/33/33
|
||||||
|
f 4/34/34 7/35/35 5/36/36
|
||||||
|
o cube
|
||||||
|
v -0.1875 0.5 0.5
|
||||||
|
v -0.1875 0.5 -0.5
|
||||||
|
v -0.1875 0.4375 0.5
|
||||||
|
v -0.1875 0.4375 -0.5
|
||||||
|
v -0.5 0.5 -0.5
|
||||||
|
v -0.5 0.5 0.5
|
||||||
|
v -0.5 0.4375 -0.5
|
||||||
|
v -0.5 0.4375 0.5
|
||||||
|
vt 0 1
|
||||||
|
vt 0 0.5
|
||||||
|
vt 0.15625 1
|
||||||
|
vt 0 0.5
|
||||||
|
vt 0.15625 0.5
|
||||||
|
vt 0.15625 1
|
||||||
|
vt 0 1
|
||||||
|
vt 0 0.5
|
||||||
|
vt 0.15625 1
|
||||||
|
vt 0 0.5
|
||||||
|
vt 0.15625 0.5
|
||||||
|
vt 0.15625 1
|
||||||
|
vt 0 1
|
||||||
|
vt 0 0.5
|
||||||
|
vt 0.15625 1
|
||||||
|
vt 0 0.5
|
||||||
|
vt 0.15625 0.5
|
||||||
|
vt 0.15625 1
|
||||||
|
vt 0 1
|
||||||
|
vt 0 0.5
|
||||||
|
vt 0.15625 1
|
||||||
|
vt 0 0.5
|
||||||
|
vt 0.15625 0.5
|
||||||
|
vt 0.15625 1
|
||||||
|
vt 0 1
|
||||||
|
vt 0 0.5
|
||||||
|
vt 0.15625 1
|
||||||
|
vt 0 0.5
|
||||||
|
vt 0.15625 0.5
|
||||||
|
vt 0.15625 1
|
||||||
|
vt 0 1
|
||||||
|
vt 0 0.5
|
||||||
|
vt 0.15625 1
|
||||||
|
vt 0 0.5
|
||||||
|
vt 0.15625 0.5
|
||||||
|
vt 0.15625 1
|
||||||
|
vn 1 0 0
|
||||||
|
vn 1 0 0
|
||||||
|
vn 1 0 0
|
||||||
|
vn 1 0 0
|
||||||
|
vn 1 0 0
|
||||||
|
vn 1 0 0
|
||||||
|
vn -1 0 0
|
||||||
|
vn -1 0 0
|
||||||
|
vn -1 0 0
|
||||||
|
vn -1 0 0
|
||||||
|
vn -1 0 0
|
||||||
|
vn -1 0 0
|
||||||
|
vn 0 1 0
|
||||||
|
vn 0 1 0
|
||||||
|
vn 0 1 0
|
||||||
|
vn 0 1 0
|
||||||
|
vn 0 1 0
|
||||||
|
vn 0 1 0
|
||||||
|
vn 0 -1 0
|
||||||
|
vn 0 -1 0
|
||||||
|
vn 0 -1 0
|
||||||
|
vn 0 -1 0
|
||||||
|
vn 0 -1 0
|
||||||
|
vn 0 -1 0
|
||||||
|
vn 0 0 1
|
||||||
|
vn 0 0 1
|
||||||
|
vn 0 0 1
|
||||||
|
vn 0 0 1
|
||||||
|
vn 0 0 1
|
||||||
|
vn 0 0 1
|
||||||
|
vn 0 0 -1
|
||||||
|
vn 0 0 -1
|
||||||
|
vn 0 0 -1
|
||||||
|
vn 0 0 -1
|
||||||
|
vn 0 0 -1
|
||||||
|
vn 0 0 -1
|
||||||
|
usemtl m_0
|
||||||
|
f 9/37/37 11/38/38 10/39/39
|
||||||
|
f 11/40/40 12/41/41 10/42/42
|
||||||
|
usemtl m_0
|
||||||
|
f 13/43/43 15/44/44 14/45/45
|
||||||
|
f 15/46/46 16/47/47 14/48/48
|
||||||
|
usemtl m_0
|
||||||
|
f 13/49/49 14/50/50 10/51/51
|
||||||
|
f 14/52/52 9/53/53 10/54/54
|
||||||
|
usemtl m_0
|
||||||
|
f 16/55/55 15/56/56 11/57/57
|
||||||
|
f 15/58/58 12/59/59 11/60/60
|
||||||
|
usemtl m_0
|
||||||
|
f 14/61/61 16/62/62 9/63/63
|
||||||
|
f 16/64/64 11/65/65 9/66/66
|
||||||
|
usemtl m_0
|
||||||
|
f 10/67/67 12/68/68 13/69/69
|
||||||
|
f 12/70/70 15/71/71 13/72/72
|
||||||
|
o cube
|
||||||
|
v 0.0625 0.375 0.5
|
||||||
|
v 0.0625 0.375 -0.5
|
||||||
|
v 0.0625 0.3125 0.5
|
||||||
|
v 0.0625 0.3125 -0.5
|
||||||
|
v -0.1875 0.375 -0.5
|
||||||
|
v -0.1875 0.375 0.5
|
||||||
|
v -0.1875 0.3125 -0.5
|
||||||
|
v -0.1875 0.3125 0.5
|
||||||
|
vt 0.125 1
|
||||||
|
vt 0.125 0.5
|
||||||
|
vt 0.28125 1
|
||||||
|
vt 0.125 0.5
|
||||||
|
vt 0.28125 0.5
|
||||||
|
vt 0.28125 1
|
||||||
|
vt 0.125 1
|
||||||
|
vt 0.125 0.5
|
||||||
|
vt 0.28125 1
|
||||||
|
vt 0.125 0.5
|
||||||
|
vt 0.28125 0.5
|
||||||
|
vt 0.28125 1
|
||||||
|
vt 0.125 1
|
||||||
|
vt 0.125 0.5
|
||||||
|
vt 0.28125 1
|
||||||
|
vt 0.125 0.5
|
||||||
|
vt 0.28125 0.5
|
||||||
|
vt 0.28125 1
|
||||||
|
vt 0.125 1
|
||||||
|
vt 0.125 0.5
|
||||||
|
vt 0.28125 1
|
||||||
|
vt 0.125 0.5
|
||||||
|
vt 0.28125 0.5
|
||||||
|
vt 0.28125 1
|
||||||
|
vt 0.125 1
|
||||||
|
vt 0.125 0.5
|
||||||
|
vt 0.28125 1
|
||||||
|
vt 0.125 0.5
|
||||||
|
vt 0.28125 0.5
|
||||||
|
vt 0.28125 1
|
||||||
|
vt 0.125 1
|
||||||
|
vt 0.125 0.5
|
||||||
|
vt 0.28125 1
|
||||||
|
vt 0.125 0.5
|
||||||
|
vt 0.28125 0.5
|
||||||
|
vt 0.28125 1
|
||||||
|
vn 1 0 0
|
||||||
|
vn 1 0 0
|
||||||
|
vn 1 0 0
|
||||||
|
vn 1 0 0
|
||||||
|
vn 1 0 0
|
||||||
|
vn 1 0 0
|
||||||
|
vn -1 0 0
|
||||||
|
vn -1 0 0
|
||||||
|
vn -1 0 0
|
||||||
|
vn -1 0 0
|
||||||
|
vn -1 0 0
|
||||||
|
vn -1 0 0
|
||||||
|
vn 0 1 0
|
||||||
|
vn 0 1 0
|
||||||
|
vn 0 1 0
|
||||||
|
vn 0 1 0
|
||||||
|
vn 0 1 0
|
||||||
|
vn 0 1 0
|
||||||
|
vn 0 -1 0
|
||||||
|
vn 0 -1 0
|
||||||
|
vn 0 -1 0
|
||||||
|
vn 0 -1 0
|
||||||
|
vn 0 -1 0
|
||||||
|
vn 0 -1 0
|
||||||
|
vn 0 0 1
|
||||||
|
vn 0 0 1
|
||||||
|
vn 0 0 1
|
||||||
|
vn 0 0 1
|
||||||
|
vn 0 0 1
|
||||||
|
vn 0 0 1
|
||||||
|
vn 0 0 -1
|
||||||
|
vn 0 0 -1
|
||||||
|
vn 0 0 -1
|
||||||
|
vn 0 0 -1
|
||||||
|
vn 0 0 -1
|
||||||
|
vn 0 0 -1
|
||||||
|
usemtl m_0
|
||||||
|
f 17/73/73 19/74/74 18/75/75
|
||||||
|
f 19/76/76 20/77/77 18/78/78
|
||||||
|
usemtl m_0
|
||||||
|
f 21/79/79 23/80/80 22/81/81
|
||||||
|
f 23/82/82 24/83/83 22/84/84
|
||||||
|
usemtl m_0
|
||||||
|
f 21/85/85 22/86/86 18/87/87
|
||||||
|
f 22/88/88 17/89/89 18/90/90
|
||||||
|
usemtl m_0
|
||||||
|
f 24/91/91 23/92/92 19/93/93
|
||||||
|
f 23/94/94 20/95/95 19/96/96
|
||||||
|
usemtl m_0
|
||||||
|
f 22/97/97 24/98/98 17/99/99
|
||||||
|
f 24/100/100 19/101/101 17/102/102
|
||||||
|
usemtl m_0
|
||||||
|
f 18/103/103 20/104/104 21/105/105
|
||||||
|
f 20/106/106 23/107/107 21/108/108
|
||||||
|
o cube
|
||||||
|
v 0.3125 0.25 0.5
|
||||||
|
v 0.3125 0.25 -0.5
|
||||||
|
v 0.3125 0.1875 0.5
|
||||||
|
v 0.3125 0.1875 -0.5
|
||||||
|
v 0.0625 0.25 -0.5
|
||||||
|
v 0.0625 0.25 0.5
|
||||||
|
v 0.0625 0.1875 -0.5
|
||||||
|
v 0.0625 0.1875 0.5
|
||||||
|
vt 0.25 1
|
||||||
|
vt 0.25 0.5
|
||||||
|
vt 0.40625 1
|
||||||
|
vt 0.25 0.5
|
||||||
|
vt 0.40625 0.5
|
||||||
|
vt 0.40625 1
|
||||||
|
vt 0.25 1
|
||||||
|
vt 0.25 0.5
|
||||||
|
vt 0.40625 1
|
||||||
|
vt 0.25 0.5
|
||||||
|
vt 0.40625 0.5
|
||||||
|
vt 0.40625 1
|
||||||
|
vt 0.25 1
|
||||||
|
vt 0.25 0.5
|
||||||
|
vt 0.40625 1
|
||||||
|
vt 0.25 0.5
|
||||||
|
vt 0.40625 0.5
|
||||||
|
vt 0.40625 1
|
||||||
|
vt 0.25 1
|
||||||
|
vt 0.25 0.5
|
||||||
|
vt 0.40625 1
|
||||||
|
vt 0.25 0.5
|
||||||
|
vt 0.40625 0.5
|
||||||
|
vt 0.40625 1
|
||||||
|
vt 0.25 1
|
||||||
|
vt 0.25 0.5
|
||||||
|
vt 0.40625 1
|
||||||
|
vt 0.25 0.5
|
||||||
|
vt 0.40625 0.5
|
||||||
|
vt 0.40625 1
|
||||||
|
vt 0.25 1
|
||||||
|
vt 0.25 0.5
|
||||||
|
vt 0.40625 1
|
||||||
|
vt 0.25 0.5
|
||||||
|
vt 0.40625 0.5
|
||||||
|
vt 0.40625 1
|
||||||
|
vn 1 0 0
|
||||||
|
vn 1 0 0
|
||||||
|
vn 1 0 0
|
||||||
|
vn 1 0 0
|
||||||
|
vn 1 0 0
|
||||||
|
vn 1 0 0
|
||||||
|
vn -1 0 0
|
||||||
|
vn -1 0 0
|
||||||
|
vn -1 0 0
|
||||||
|
vn -1 0 0
|
||||||
|
vn -1 0 0
|
||||||
|
vn -1 0 0
|
||||||
|
vn 0 1 0
|
||||||
|
vn 0 1 0
|
||||||
|
vn 0 1 0
|
||||||
|
vn 0 1 0
|
||||||
|
vn 0 1 0
|
||||||
|
vn 0 1 0
|
||||||
|
vn 0 -1 0
|
||||||
|
vn 0 -1 0
|
||||||
|
vn 0 -1 0
|
||||||
|
vn 0 -1 0
|
||||||
|
vn 0 -1 0
|
||||||
|
vn 0 -1 0
|
||||||
|
vn 0 0 1
|
||||||
|
vn 0 0 1
|
||||||
|
vn 0 0 1
|
||||||
|
vn 0 0 1
|
||||||
|
vn 0 0 1
|
||||||
|
vn 0 0 1
|
||||||
|
vn 0 0 -1
|
||||||
|
vn 0 0 -1
|
||||||
|
vn 0 0 -1
|
||||||
|
vn 0 0 -1
|
||||||
|
vn 0 0 -1
|
||||||
|
vn 0 0 -1
|
||||||
|
usemtl m_0
|
||||||
|
f 25/109/109 27/110/110 26/111/111
|
||||||
|
f 27/112/112 28/113/113 26/114/114
|
||||||
|
usemtl m_0
|
||||||
|
f 29/115/115 31/116/116 30/117/117
|
||||||
|
f 31/118/118 32/119/119 30/120/120
|
||||||
|
usemtl m_0
|
||||||
|
f 29/121/121 30/122/122 26/123/123
|
||||||
|
f 30/124/124 25/125/125 26/126/126
|
||||||
|
usemtl m_0
|
||||||
|
f 32/127/127 31/128/128 27/129/129
|
||||||
|
f 31/130/130 28/131/131 27/132/132
|
||||||
|
usemtl m_0
|
||||||
|
f 30/133/133 32/134/134 25/135/135
|
||||||
|
f 32/136/136 27/137/137 25/138/138
|
||||||
|
usemtl m_0
|
||||||
|
f 26/139/139 28/140/140 29/141/141
|
||||||
|
f 28/142/142 31/143/143 29/144/144
|
||||||
|
o cube
|
||||||
|
v 0.5 0.125 0.5
|
||||||
|
v 0.5 0.125 -0.5
|
||||||
|
v 0.5 0.0625 0.5
|
||||||
|
v 0.5 0.0625 -0.5
|
||||||
|
v 0.3125 0.125 -0.5
|
||||||
|
v 0.3125 0.125 0.5
|
||||||
|
v 0.3125 0.0625 -0.5
|
||||||
|
v 0.3125 0.0625 0.5
|
||||||
|
vt 0.375 1
|
||||||
|
vt 0.375 0.5
|
||||||
|
vt 0.53125 1
|
||||||
|
vt 0.375 0.5
|
||||||
|
vt 0.53125 0.5
|
||||||
|
vt 0.53125 1
|
||||||
|
vt 0.375 1
|
||||||
|
vt 0.375 0.5
|
||||||
|
vt 0.53125 1
|
||||||
|
vt 0.375 0.5
|
||||||
|
vt 0.53125 0.5
|
||||||
|
vt 0.53125 1
|
||||||
|
vt 0.375 1
|
||||||
|
vt 0.375 0.5
|
||||||
|
vt 0.53125 1
|
||||||
|
vt 0.375 0.5
|
||||||
|
vt 0.53125 0.5
|
||||||
|
vt 0.53125 1
|
||||||
|
vt 0.375 1
|
||||||
|
vt 0.375 0.5
|
||||||
|
vt 0.53125 1
|
||||||
|
vt 0.375 0.5
|
||||||
|
vt 0.53125 0.5
|
||||||
|
vt 0.53125 1
|
||||||
|
vt 0.375 1
|
||||||
|
vt 0.375 0.5
|
||||||
|
vt 0.53125 1
|
||||||
|
vt 0.375 0.5
|
||||||
|
vt 0.53125 0.5
|
||||||
|
vt 0.53125 1
|
||||||
|
vt 0.375 1
|
||||||
|
vt 0.375 0.5
|
||||||
|
vt 0.53125 1
|
||||||
|
vt 0.375 0.5
|
||||||
|
vt 0.53125 0.5
|
||||||
|
vt 0.53125 1
|
||||||
|
vn 1 0 0
|
||||||
|
vn 1 0 0
|
||||||
|
vn 1 0 0
|
||||||
|
vn 1 0 0
|
||||||
|
vn 1 0 0
|
||||||
|
vn 1 0 0
|
||||||
|
vn -1 0 0
|
||||||
|
vn -1 0 0
|
||||||
|
vn -1 0 0
|
||||||
|
vn -1 0 0
|
||||||
|
vn -1 0 0
|
||||||
|
vn -1 0 0
|
||||||
|
vn 0 1 0
|
||||||
|
vn 0 1 0
|
||||||
|
vn 0 1 0
|
||||||
|
vn 0 1 0
|
||||||
|
vn 0 1 0
|
||||||
|
vn 0 1 0
|
||||||
|
vn 0 -1 0
|
||||||
|
vn 0 -1 0
|
||||||
|
vn 0 -1 0
|
||||||
|
vn 0 -1 0
|
||||||
|
vn 0 -1 0
|
||||||
|
vn 0 -1 0
|
||||||
|
vn 0 0 1
|
||||||
|
vn 0 0 1
|
||||||
|
vn 0 0 1
|
||||||
|
vn 0 0 1
|
||||||
|
vn 0 0 1
|
||||||
|
vn 0 0 1
|
||||||
|
vn 0 0 -1
|
||||||
|
vn 0 0 -1
|
||||||
|
vn 0 0 -1
|
||||||
|
vn 0 0 -1
|
||||||
|
vn 0 0 -1
|
||||||
|
vn 0 0 -1
|
||||||
|
usemtl m_0
|
||||||
|
f 33/145/145 35/146/146 34/147/147
|
||||||
|
f 35/148/148 36/149/149 34/150/150
|
||||||
|
usemtl m_0
|
||||||
|
f 37/151/151 39/152/152 38/153/153
|
||||||
|
f 39/154/154 40/155/155 38/156/156
|
||||||
|
usemtl m_0
|
||||||
|
f 37/157/157 38/158/158 34/159/159
|
||||||
|
f 38/160/160 33/161/161 34/162/162
|
||||||
|
usemtl m_0
|
||||||
|
f 40/163/163 39/164/164 35/165/165
|
||||||
|
f 39/166/166 36/167/167 35/168/168
|
||||||
|
usemtl m_0
|
||||||
|
f 38/169/169 40/170/170 33/171/171
|
||||||
|
f 40/172/172 35/173/173 33/174/174
|
||||||
|
usemtl m_0
|
||||||
|
f 34/175/175 36/176/176 37/177/177
|
||||||
|
f 36/178/178 39/179/179 37/180/180
|
|
@ -0,0 +1 @@
|
||||||
|
{"meta":{"format_version":"3.6","creation_time":1615797844,"model_format":"free","box_uv":false},"name":"","geometry_name":"","visible_box":[1,1,0],"resolution":{"width":32,"height":32},"elements":[{"name":"cube","from":[-8,7,-8],"to":[-3,8,8],"autouv":0,"color":4,"locked":false,"origin":[-8,0,7],"faces":{"north":{"uv":[0,0,5,16],"texture":0},"east":{"uv":[0,0,5,16],"texture":0},"south":{"uv":[0,0,5,16],"texture":0},"west":{"uv":[0,0,5,16],"texture":0},"up":{"uv":[0,0,5,16],"texture":0},"down":{"uv":[0,0,5,16],"texture":0}},"uuid":"2cedaf8d-362e-059e-8779-56d5adbe2a01"},{"name":"cube","from":[1,3,-8],"to":[5,4,8],"autouv":0,"color":2,"locked":false,"origin":[4,-2,0],"faces":{"north":{"uv":[8,0,13,16],"texture":0},"east":{"uv":[8,0,13,16],"texture":0},"south":{"uv":[8,0,13,16],"texture":0},"west":{"uv":[8,0,13,16],"texture":0},"up":{"uv":[8,0,13,16],"texture":0},"down":{"uv":[8,0,13,16],"texture":0}},"uuid":"e529f676-fc7e-7204-b503-6fc068454efd"},{"name":"cube","from":[5,1,-8],"to":[8,2,8],"autouv":0,"color":2,"locked":false,"origin":[0,0,0],"faces":{"north":{"uv":[12,0,17,16],"texture":0},"east":{"uv":[12,0,17,16],"texture":0},"south":{"uv":[12,0,17,16],"texture":0},"west":{"uv":[12,0,17,16],"texture":0},"up":{"uv":[12,0,17,16],"texture":0},"down":{"uv":[12,0,17,16],"texture":0}},"uuid":"3aa91135-750f-80a7-9156-923b7818b822"},{"name":"cube","from":[-3,5,-8],"to":[1,6,8],"autouv":0,"color":2,"locked":false,"origin":[0,0,0],"faces":{"north":{"uv":[4,0,9,16],"texture":0},"east":{"uv":[4,0,9,16],"texture":0},"south":{"uv":[4,0,9,16],"texture":0},"west":{"uv":[4,0,9,16],"texture":0},"up":{"uv":[4,0,9,16],"texture":0},"down":{"uv":[4,0,9,16],"texture":0}},"uuid":"756b7eb1-6f71-7eaf-2353-433942ce5fa1"},{"name":"cube","from":[5,-1,-1],"to":[7,15,1],"autouv":0,"color":6,"locked":false,"rotation":[0,0,62.5],"origin":[6,0,0],"faces":{"north":{"uv":[30,0,32,16],"texture":0},"east":{"uv":[30,0,32,16],"texture":0},"south":{"uv":[30,0,32,16],"texture":0},"west":{"uv":[30,0,32,16],"texture":0},"up":{"uv":[30,6,32,8],"texture":0},"down":{"uv":[30,6,32,8],"texture":0}},"uuid":"d7529930-b89f-6ba9-e7c2-c24f0b3b3313"}],"outliner":["2cedaf8d-362e-059e-8779-56d5adbe2a01","e529f676-fc7e-7204-b503-6fc068454efd","3aa91135-750f-80a7-9156-923b7818b822","756b7eb1-6f71-7eaf-2353-433942ce5fa1","d7529930-b89f-6ba9-e7c2-c24f0b3b3313"],"textures":[{"path":"","name":"texture","folder":"block","namespace":"","id":"0","particle":false,"visible":true,"mode":"bitmap","saved":false,"uuid":"683a3786-ddcb-48b1-7446-f9766ad24f21","source":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAABE0lEQVRYR2NUUpD7zzAAQPDXIwYBDgYGRpADePkF4U74/PE9A6l8mOa79x9i9YqyojyGuCLTI4YPP6joAFyW4wpcE2lGBmtFduqFADkOUBDhoI4DsFnuoswI9vyeu9iTGFVDgFTfgxzmr8PO8PT9L9qFAKGMBQoBaUG2gXNAvg0Hw9XnPwfOAaA0oi1JpVxAThoAOYBq5QA5DgClAaqVhOQ4IESfk+HBmx8DmwZAOYUqdQE5IQCKApqWhITKAZRESEgxIXlyQgCUBqR5/0OiAGQBOYYQchgx8nAHINfpoPob5iBkNjEGkqoG7ABcltHacnguwBUFdHHA////B6RNCIsqxlEHjIbAaAiMhsBoCAx0CAAAzp9RRvgB8VAAAAAASUVORK5CYII="}]}
|
|
@ -0,0 +1,4 @@
|
||||||
|
# Made in Blockbench 3.7.4
|
||||||
|
newmtl m_0
|
||||||
|
map_Kd texture
|
||||||
|
newmtl none
|
After Width: | Height: | Size: 329 B |
|
@ -0,0 +1,101 @@
|
||||||
|
# Made in Blockbench 3.7.4
|
||||||
|
mtllib wall.mtl
|
||||||
|
o cube
|
||||||
|
v 0.0000625 1 0.5
|
||||||
|
v 0.0000625 1 -0.5
|
||||||
|
v 0.0000625 0 0.5
|
||||||
|
v 0.0000625 0 -0.5
|
||||||
|
v 0 1 -0.5
|
||||||
|
v 0 1 0.5
|
||||||
|
v 0 0 -0.5
|
||||||
|
v 0 0 0.5
|
||||||
|
vt 0 1
|
||||||
|
vt 0 0
|
||||||
|
vt 1 1
|
||||||
|
vt 0 0
|
||||||
|
vt 1 0
|
||||||
|
vt 1 1
|
||||||
|
vt 0 1
|
||||||
|
vt 0 0
|
||||||
|
vt 1 1
|
||||||
|
vt 0 0
|
||||||
|
vt 1 0
|
||||||
|
vt 1 1
|
||||||
|
vt 0 1
|
||||||
|
vt 0 0
|
||||||
|
vt 0 1
|
||||||
|
vt 0 0
|
||||||
|
vt 0 0
|
||||||
|
vt 0 1
|
||||||
|
vt 0 1
|
||||||
|
vt 0 0
|
||||||
|
vt 0 1
|
||||||
|
vt 0 0
|
||||||
|
vt 0 0
|
||||||
|
vt 0 1
|
||||||
|
vt 0 1
|
||||||
|
vt 0 0
|
||||||
|
vt 0 1
|
||||||
|
vt 0 0
|
||||||
|
vt 0 0
|
||||||
|
vt 0 1
|
||||||
|
vt 0 1
|
||||||
|
vt 0 0
|
||||||
|
vt 0 1
|
||||||
|
vt 0 0
|
||||||
|
vt 0 0
|
||||||
|
vt 0 1
|
||||||
|
vn 1 0 0
|
||||||
|
vn 1 0 0
|
||||||
|
vn 1 0 0
|
||||||
|
vn 1 0 0
|
||||||
|
vn 1 0 0
|
||||||
|
vn 1 0 0
|
||||||
|
vn -1 0 0
|
||||||
|
vn -1 0 0
|
||||||
|
vn -1 0 0
|
||||||
|
vn -1 0 0
|
||||||
|
vn -1 0 0
|
||||||
|
vn -1 0 0
|
||||||
|
vn 0 1 0
|
||||||
|
vn 0 1 0
|
||||||
|
vn 0 1 0
|
||||||
|
vn 0 1 0
|
||||||
|
vn 0 1 0
|
||||||
|
vn 0 1 0
|
||||||
|
vn 0 -1 0
|
||||||
|
vn 0 -1 0
|
||||||
|
vn 0 -1 0
|
||||||
|
vn 0 -1 0
|
||||||
|
vn 0 -1 0
|
||||||
|
vn 0 -1 0
|
||||||
|
vn 0 0 1
|
||||||
|
vn 0 0 1
|
||||||
|
vn 0 0 1
|
||||||
|
vn 0 0 1
|
||||||
|
vn 0 0 1
|
||||||
|
vn 0 0 1
|
||||||
|
vn 0 0 -1
|
||||||
|
vn 0 0 -1
|
||||||
|
vn 0 0 -1
|
||||||
|
vn 0 0 -1
|
||||||
|
vn 0 0 -1
|
||||||
|
vn 0 0 -1
|
||||||
|
usemtl m_0
|
||||||
|
f 1/1/1 3/2/2 2/3/3
|
||||||
|
f 3/4/4 4/5/5 2/6/6
|
||||||
|
usemtl m_0
|
||||||
|
f 5/7/7 7/8/8 6/9/9
|
||||||
|
f 7/10/10 8/11/11 6/12/12
|
||||||
|
usemtl none
|
||||||
|
f 5/13/13 6/14/14 2/15/15
|
||||||
|
f 6/16/16 1/17/17 2/18/18
|
||||||
|
usemtl none
|
||||||
|
f 8/19/19 7/20/20 3/21/21
|
||||||
|
f 7/22/22 4/23/23 3/24/24
|
||||||
|
usemtl none
|
||||||
|
f 6/25/25 8/26/26 1/27/27
|
||||||
|
f 8/28/28 3/29/29 1/30/30
|
||||||
|
usemtl none
|
||||||
|
f 2/31/31 4/32/32 5/33/33
|
||||||
|
f 4/34/34 7/35/35 5/36/36
|
|
@ -0,0 +1 @@
|
||||||
|
{"meta":{"format_version":"3.6","creation_time":1615809646,"model_format":"free","box_uv":false},"name":"","geometry_name":"","visible_box":[1,1,0],"resolution":{"width":16,"height":16},"elements":[{"name":"cube","from":[0,0,-8],"to":[0,16,8],"autouv":1,"color":3,"locked":false,"origin":[0,0,1],"faces":{"north":{"uv":[0,0,0,16]},"east":{"uv":[0,0,16,16],"texture":0},"south":{"uv":[0,0,0,16]},"west":{"uv":[0,0,16,16],"texture":0},"up":{"uv":[0,0,0,16]},"down":{"uv":[0,0,0,16]}},"uuid":"063ae540-6223-a3ae-1505-e3591ab9d4f6"}],"outliner":["063ae540-6223-a3ae-1505-e3591ab9d4f6"],"textures":[{"path":"","name":"texture","folder":"block","namespace":"","id":"0","particle":false,"visible":true,"mode":"bitmap","saved":false,"uuid":"20ad34b4-f554-edc7-f5fe-479a2e424655","source":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAIUlEQVQ4T2P8+PHjfwYKAOP///9HDRgNg9F0wMAwDMIAAHrEP6ecDBTxAAAAAElFTkSuQmCC"}]}
|
After Width: | Height: | Size: 90 B |
|
@ -0,0 +1,4 @@
|
||||||
|
# Made in Blockbench 3.7.4
|
||||||
|
newmtl m_0
|
||||||
|
map_Kd texture.png
|
||||||
|
newmtl none
|