glitch3d 0.5.0.0 → 0.5.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.gitignore +1 -1
- data/README.md +21 -9
- data/bin/glitch3d +1 -1
- data/fixtures/base.blend +0 -0
- data/fixtures/{osl-shaders → osl_shaders}/glass.osl +0 -0
- data/fixtures/{osl-shaders → osl_shaders}/gold.osl +0 -0
- data/fixtures/{osl-shaders → osl_shaders}/green_marble.osl +0 -0
- data/fixtures/{osl-shaders → osl_shaders}/turbulent.osl +0 -0
- data/fixtures/{osl-shaders → osl_shaders}/veined_marble.osl +0 -0
- data/fixtures/{text → texts}/strings.txt +0 -0
- data/lib/glitch3d.rb +75 -22
- data/lib/glitch3d/bpy/canvas/aether.py +22 -58
- data/lib/glitch3d/bpy/canvas/dreamatorium.py +3 -9
- data/lib/glitch3d/bpy/canvas/empty.py +8 -0
- data/lib/glitch3d/bpy/canvas/fernandez.py +36 -10
- data/lib/glitch3d/bpy/canvas/lyfe.py +1 -3
- data/lib/glitch3d/bpy/canvas/metaballs.py +11 -7
- data/lib/glitch3d/bpy/canvas/sphere.py +23 -38
- data/lib/glitch3d/bpy/canvas/waves.py +15 -41
- data/lib/glitch3d/bpy/helpers.py +70 -40
- data/lib/glitch3d/bpy/main.py +219 -193
- data/lib/glitch3d/bpy/post-processing/average.py +8 -10
- data/lib/glitch3d/bpy/post-processing/mosaic.py +1 -1
- data/lib/glitch3d/bpy/post-processing/optimize.py +3 -6
- data/lib/glitch3d/bpy/post-processing/palette.py +3 -4
- data/lib/glitch3d/bpy/render_settings.py +35 -23
- data/lib/glitch3d/objects/vertex.rb +1 -1
- data/lib/glitch3d/strategies/default.rb +10 -8
- data/lib/glitch3d/strategies/duplication.rb +14 -12
- data/lib/glitch3d/strategies/find_and_replace.rb +19 -16
- data/lib/glitch3d/strategies/localized.rb +28 -18
- data/lib/glitch3d/strategies/none.rb +7 -5
- data/lib/glitch3d/version.rb +1 -1
- metadata +9 -9
- data/lib/glitch3d/bpy/canvas/particles.py +0 -33
@@ -1,14 +1,13 @@
|
|
1
|
-
|
1
|
+
import sys
|
2
2
|
from PIL import Image
|
3
3
|
from PIL import ImageChops
|
4
4
|
from PIL import ImageEnhance
|
5
5
|
import numpy as np
|
6
|
-
import random
|
7
|
-
import sys, os, cv2, code
|
6
|
+
import random, os, cv2, code, uuid
|
8
7
|
|
9
8
|
print("Averaging and signing 💁🏻♀️")
|
10
|
-
|
11
|
-
files
|
9
|
+
files = RENDER_OUTPUT_PATHS
|
10
|
+
print("Will average the following files: " + str(files))
|
12
11
|
average_image = None
|
13
12
|
old_image = None
|
14
13
|
|
@@ -35,9 +34,8 @@ for file in files:
|
|
35
34
|
if random.randint(0,1) == 1:
|
36
35
|
image = Image.fromarray(cv2.bitwise_not(np.asarray(current_image)))
|
37
36
|
|
38
|
-
# add
|
39
|
-
|
40
|
-
|
41
|
-
average_image = Image.fromarray(cv2.putText(np.asarray(average_image), random.choice(["PSKL"]), (random.choice(range(0, average_image.size[0])), random.choice(range(0, average_image.size[1]))), font, random.uniform(0.8, 3), random.choice([(255, 255, 255), (0,0,0)]), random.choice(range(1, 3)), random.choice(range(1,8))))
|
37
|
+
# add signature
|
38
|
+
font = random.choice(range(0, 7))
|
39
|
+
average_image = Image.fromarray(cv2.putText(np.asarray(average_image), random.choice(["PSKL"]), (random.choice(range(0, average_image.size[0])), random.choice(range(0, average_image.size[1]))), font, random.uniform(0.8, 3), random.choice([(255, 255, 255), (0,0,0)]), random.choice(range(1, 3)), random.choice(range(1,8))))
|
42
40
|
|
43
|
-
average_image.save(
|
41
|
+
average_image.save(os.environ['RENDER_PATH'] + "average_" + str(uuid.uuid1()) + ".png")
|
@@ -3,7 +3,7 @@ import os, sys
|
|
3
3
|
from PIL import Image
|
4
4
|
|
5
5
|
path = os.environ['RENDER_PATH']
|
6
|
-
files =
|
6
|
+
files = RENDER_OUTPUT_PATHS
|
7
7
|
images = list(map(Image.open, files))
|
8
8
|
widths, heights = zip(*(i.size for i in images))
|
9
9
|
|
@@ -5,12 +5,9 @@ from PIL import Image
|
|
5
5
|
|
6
6
|
print("Optimizing size of files")
|
7
7
|
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
res_y = int(sys.argv[2])
|
12
|
-
files = sys.argv[3:]
|
13
|
-
|
8
|
+
res_x = bpy.context.scene.render.resolution_x
|
9
|
+
res_y = bpy.context.scene.render.resolution_y
|
10
|
+
files = RENDER_OUTPUT_PATHS
|
14
11
|
for img in files:
|
15
12
|
print("file being optimized -> " + img)
|
16
13
|
image = Image.open(img)
|
@@ -6,14 +6,13 @@ from PIL import Image
|
|
6
6
|
from PIL import ImageDraw
|
7
7
|
from PIL import ImageFont
|
8
8
|
|
9
|
-
COLORS = sys.argv[1: -2]
|
10
9
|
SLOT_WIDTH = 400
|
11
10
|
img = Image.new('RGBA', (len(COLORS) * SLOT_WIDTH, SLOT_WIDTH), (255,255,255,255))
|
12
11
|
draw_context = ImageDraw.Draw(img)
|
13
|
-
font = ImageFont.truetype(
|
12
|
+
font = ImageFont.truetype(FONT_FOLDER_PATH + 'helvetica_neue.ttf', 20)
|
14
13
|
|
15
|
-
for idx, color in enumerate(COLORS):
|
16
|
-
actual_color = list((map(lambda x: int(x * 255),
|
14
|
+
for idx, color in enumerate(map(tuple, COLORS)):
|
15
|
+
actual_color = list((map(lambda x: int(x * 255), color)))
|
17
16
|
draw_context.rectangle((((SLOT_WIDTH * idx), 0), (SLOT_WIDTH * idx + SLOT_WIDTH, SLOT_WIDTH)), fill=tuple(actual_color), outline=None)
|
18
17
|
draw_context.text((SLOT_WIDTH * idx, 10), str(actual_color), font=font, fill=(255,255,255,255))
|
19
18
|
|
@@ -41,25 +41,35 @@ def isometric_camera():
|
|
41
41
|
FIXED_CAMERA = True
|
42
42
|
|
43
43
|
# Split rendering into 3 rendering layers
|
44
|
-
def split_into_render_layers():
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
44
|
+
def split_into_render_layers(debug=False):
|
45
|
+
if debug:
|
46
|
+
bpy.context.scene.render.layers[0].use = False
|
47
|
+
bpy.context.scene.render.layers[1].use = True
|
48
|
+
bpy.context.scene.render.layers[2].use = False
|
49
|
+
bpy.context.scene.render.layers[3].use = False
|
50
|
+
for obj in bpy.data.objects:
|
51
|
+
obj.layers[0] = False
|
52
|
+
obj.layers[1] = True
|
53
|
+
return None
|
54
|
+
else:
|
55
|
+
bpy.context.scene.render.layers[0].use = False
|
56
|
+
chunks = chunk_it(bpy.data.objects, 3)
|
57
|
+
for chunk_index in range(len(chunks)):
|
58
|
+
for obj in chunks[chunk_index]:
|
59
|
+
obj.layers[chunk_index + 1] = True
|
60
|
+
obj.layers[0] = False
|
61
|
+
for l in bpy.context.scene.render.layers[1:4]:
|
62
|
+
l.use = True
|
63
|
+
for obj in bpy.data.objects:
|
64
|
+
assert obj.layers[0] == False
|
65
|
+
assert len([i for i, x in enumerate(list(obj.layers)) if x]) == 1 # Only 1 layer activated
|
66
|
+
assert bpy.context.scene.render.layers[0].use == False
|
67
|
+
assert bpy.context.scene.render.layers[1].use == True
|
68
|
+
bpy.context.scene.layers[1] = True
|
69
|
+
bpy.context.scene.layers[2] = True
|
70
|
+
bpy.context.scene.layers[3] = True
|
61
71
|
|
62
|
-
def render_settings(animate, mode, normals, width, height):
|
72
|
+
def render_settings(animate, mode, normals, width, height, debug):
|
63
73
|
for layer in bpy.context.scene.render.layers:
|
64
74
|
layer.use_pass_ambient_occlusion = True
|
65
75
|
bpy.context.scene.render.resolution_x = width
|
@@ -69,24 +79,26 @@ def render_settings(animate, mode, normals, width, height):
|
|
69
79
|
bpy.context.scene.cycles.samples = 20
|
70
80
|
bpy.context.scene.cycles.max_bounces = 1
|
71
81
|
CAMERA.data.dof_distance = (SUBJECT.location - CAMERA.location).length
|
82
|
+
CAMERA.data.dof_object = SUBJECT
|
72
83
|
bpy.context.scene.cycles.shading_system = OSL_ENABLED
|
73
84
|
bpy.context.scene.cycles.min_bounces = 1
|
74
85
|
bpy.context.scene.cycles.caustics_reflective = False
|
75
86
|
bpy.context.scene.cycles.caustics_refractive = False
|
76
87
|
bpy.context.scene.cycles.film_transparent = True
|
77
88
|
bpy.context.scene.render.image_settings.color_mode ='RGBA'
|
78
|
-
|
79
|
-
|
80
|
-
|
89
|
+
if not debug:
|
90
|
+
bpy.context.scene.render.layers[1].cycles.use_denoising = True
|
91
|
+
bpy.context.scene.render.layers[2].cycles.use_denoising = True
|
92
|
+
bpy.context.scene.render.layers[3].cycles.use_denoising = True
|
81
93
|
bpy.context.scene.view_settings.view_transform = "Filmic"
|
82
94
|
bpy.context.scene.view_settings.look = "Filmic - High Contrast"
|
83
|
-
tile_size = int(width /
|
95
|
+
tile_size = int(width / 30)
|
84
96
|
bpy.context.scene.render.tile_x = tile_size
|
85
97
|
bpy.context.scene.render.tile_y = tile_size
|
86
98
|
if normals:
|
87
99
|
render_normals() # 1 render layer
|
88
100
|
else:
|
89
|
-
split_into_render_layers()
|
101
|
+
split_into_render_layers(debug)
|
90
102
|
if animate:
|
91
103
|
bpy.context.scene.render.image_settings.file_format='AVI_RAW'
|
92
104
|
else:
|
@@ -50,7 +50,7 @@ class Vertex
|
|
50
50
|
# Pass functions like :negative? or :positive?
|
51
51
|
def self.subset(x:, y:, z:, vertex_list:)
|
52
52
|
vertex_list.select do |vertex|
|
53
|
-
vertex.x.send(x)
|
53
|
+
vertex.x.send(x) || vertex.y.send(y) || vertex.y.send(z)
|
54
54
|
end
|
55
55
|
end
|
56
56
|
end
|
@@ -1,15 +1,17 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
module Glitch3d
|
3
|
-
|
4
|
-
|
5
|
-
(
|
6
|
-
|
3
|
+
class Default
|
4
|
+
class << self
|
5
|
+
def alter_vertices(vertices_objects_array)
|
6
|
+
(VERTEX_GLITCH_ITERATION_RATIO * vertices_objects_array.size).to_i.times do |_|
|
7
|
+
vertices_objects_array.sample.fuck
|
8
|
+
end
|
9
|
+
vertices_objects_array
|
7
10
|
end
|
8
|
-
vertices_objects_array
|
9
|
-
end
|
10
11
|
|
11
|
-
|
12
|
-
|
12
|
+
def alter_faces(faces_objects_array, vertex_objects_array)
|
13
|
+
faces_objects_array
|
14
|
+
end
|
13
15
|
end
|
14
16
|
end
|
15
17
|
end
|
@@ -1,21 +1,23 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
module Glitch3d
|
3
3
|
module Duplication
|
4
|
-
|
5
|
-
|
6
|
-
|
4
|
+
class << self
|
5
|
+
def alter_vertices(vertices_objects_array)
|
6
|
+
shuffle_vertices(vertices_objects_array)
|
7
|
+
end
|
7
8
|
|
8
|
-
|
9
|
-
|
10
|
-
|
9
|
+
def alter_faces(faces_objects_array, vertex_objects_array)
|
10
|
+
faces_objects_array
|
11
|
+
end
|
11
12
|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
13
|
+
def shuffle_vertices(array)
|
14
|
+
rand(3..10).times do
|
15
|
+
rand_index1 = rand(0..array.size - 1)
|
16
|
+
rand_index2 = rand(0..array.size - 1)
|
17
|
+
array[rand_index1], array[rand_index2] = array[rand_index2], array[rand_index1]
|
18
|
+
end
|
19
|
+
array
|
17
20
|
end
|
18
|
-
array
|
19
21
|
end
|
20
22
|
end
|
21
23
|
end
|
@@ -1,26 +1,29 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
module Glitch3d
|
3
3
|
module FindAndReplace
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
4
|
+
class << self
|
5
|
+
def alter_vertices(vertices_objects_array)
|
6
|
+
@target = rand(9).to_s
|
7
|
+
@replacement = rand(9).to_s
|
8
|
+
vertices_objects_array.each do |v|
|
9
|
+
find_and_replace(v)
|
10
|
+
end
|
11
|
+
vertices_objects_array
|
9
12
|
end
|
10
|
-
vertices_objects_array
|
11
|
-
end
|
12
13
|
|
13
|
-
|
14
|
-
|
15
|
-
|
14
|
+
def alter_faces(faces_objects_array, vertices_objects_array)
|
15
|
+
(FACE_GLITCH_ITERATION_RATIO * faces_objects_array.count)
|
16
|
+
faces_objects_array.sample(3) do |face|
|
17
|
+
face.v1 = rand(0..vertices_objects_array.size - 1)
|
18
|
+
end
|
19
|
+
faces_objects_array
|
16
20
|
end
|
17
|
-
faces_objects_array
|
18
|
-
end
|
19
21
|
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
22
|
+
def find_and_replace(vertex)
|
23
|
+
vertex.x = vertex.x.to_s.tr(@target, @replacement).to_f
|
24
|
+
vertex.y = vertex.y.to_s.tr(@target, @replacement).to_f
|
25
|
+
vertex.z = vertex.z.to_s.tr(@target, @replacement).to_f
|
26
|
+
end
|
24
27
|
end
|
25
28
|
end
|
26
29
|
end
|
@@ -1,30 +1,40 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
module Glitch3d
|
3
3
|
module Localized
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
4
|
+
class NilSubSetError < StandardError; end
|
5
|
+
|
6
|
+
class << self
|
7
|
+
def alter_vertices(vertices_objects_array)
|
8
|
+
sorted_array = vertices_objects_array.sort do |v1, v2|
|
9
|
+
rand_attr = v1.rand_attr
|
10
|
+
v1.send(rand_attr) <=> v2.send(rand_attr)
|
11
|
+
end
|
12
|
+
(VERTEX_GLITCH_ITERATION_RATIO * sorted_array.size).to_i.times do |_|
|
13
|
+
target(sorted_array).sample.fuck
|
14
|
+
end
|
15
|
+
sorted_array
|
8
16
|
end
|
9
|
-
|
10
|
-
|
17
|
+
|
18
|
+
def alter_faces(faces_objects_array, vertices_objects_array)
|
19
|
+
(FACE_GLITCH_ITERATION_RATIO * faces_objects_array.count).to_i.times do |_|
|
20
|
+
faces_objects_array.sample.fuck(target(vertices_objects_array).sample)
|
21
|
+
end
|
22
|
+
faces_objects_array
|
11
23
|
end
|
12
|
-
sorted_array
|
13
|
-
end
|
14
24
|
|
15
|
-
|
16
|
-
|
17
|
-
|
25
|
+
def selected_area(vertices_objects_array)
|
26
|
+
area = Vertex.subset(x: random_particularity, y: random_particularity, z: random_particularity, vertex_list: vertices_objects_array)
|
27
|
+
raise NilSubSetError if area.nil? || area.empty?
|
28
|
+
area
|
18
29
|
end
|
19
|
-
faces_objects_array
|
20
|
-
end
|
21
30
|
|
22
|
-
|
23
|
-
|
24
|
-
|
31
|
+
def random_particularity
|
32
|
+
[:positive?, :negative?].sample
|
33
|
+
end
|
25
34
|
|
26
|
-
|
27
|
-
|
35
|
+
def target(vertices_objects_array)
|
36
|
+
selected_area(vertices_objects_array)
|
37
|
+
end
|
28
38
|
end
|
29
39
|
end
|
30
40
|
end
|
@@ -1,12 +1,14 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
module Glitch3d
|
3
3
|
module None
|
4
|
-
|
5
|
-
vertices_objects_array
|
6
|
-
|
4
|
+
class << self
|
5
|
+
def alter_vertices(vertices_objects_array)
|
6
|
+
vertices_objects_array
|
7
|
+
end
|
7
8
|
|
8
|
-
|
9
|
-
|
9
|
+
def alter_faces(faces_objects_array, _)
|
10
|
+
faces_objects_array
|
11
|
+
end
|
10
12
|
end
|
11
13
|
end
|
12
14
|
end
|
data/lib/glitch3d/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: glitch3d
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.5.0.
|
4
|
+
version: 0.5.0.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- pskl
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2019-01-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -80,12 +80,12 @@ files:
|
|
80
80
|
- fixtures/models/polyhedron.obj
|
81
81
|
- fixtures/models/skull.obj
|
82
82
|
- fixtures/models/woman_body.obj
|
83
|
-
- fixtures/
|
84
|
-
- fixtures/
|
85
|
-
- fixtures/
|
86
|
-
- fixtures/
|
87
|
-
- fixtures/
|
88
|
-
- fixtures/
|
83
|
+
- fixtures/osl_shaders/glass.osl
|
84
|
+
- fixtures/osl_shaders/gold.osl
|
85
|
+
- fixtures/osl_shaders/green_marble.osl
|
86
|
+
- fixtures/osl_shaders/turbulent.osl
|
87
|
+
- fixtures/osl_shaders/veined_marble.osl
|
88
|
+
- fixtures/texts/strings.txt
|
89
89
|
- fixtures/textures/checkered_texture.jpg
|
90
90
|
- glitch3d.gemspec
|
91
91
|
- lib/glitch3d.rb
|
@@ -94,11 +94,11 @@ files:
|
|
94
94
|
- lib/glitch3d/bpy/canvas/aether.py
|
95
95
|
- lib/glitch3d/bpy/canvas/canvas.py
|
96
96
|
- lib/glitch3d/bpy/canvas/dreamatorium.py
|
97
|
+
- lib/glitch3d/bpy/canvas/empty.py
|
97
98
|
- lib/glitch3d/bpy/canvas/fernandez.py
|
98
99
|
- lib/glitch3d/bpy/canvas/frame.py
|
99
100
|
- lib/glitch3d/bpy/canvas/lyfe.py
|
100
101
|
- lib/glitch3d/bpy/canvas/metaballs.py
|
101
|
-
- lib/glitch3d/bpy/canvas/particles.py
|
102
102
|
- lib/glitch3d/bpy/canvas/sphere.py
|
103
103
|
- lib/glitch3d/bpy/canvas/waves.py
|
104
104
|
- lib/glitch3d/bpy/helpers.py
|
@@ -1,33 +0,0 @@
|
|
1
|
-
import bpy, sys, code, random, os, math, canvas, operator, mathutils
|
2
|
-
|
3
|
-
sys.path.append(os.path.dirname(os.path.dirname(__file__)))
|
4
|
-
import helpers
|
5
|
-
|
6
|
-
class Particles(canvas.Canvas):
|
7
|
-
def render(self):
|
8
|
-
bpy.ops.mesh.primitive_cube_add(location=(0, 0, 100),radius=1)
|
9
|
-
cube = bpy.context.object
|
10
|
-
helpers.assign_material(cube, helpers.random_material(self.MATERIALS_NAMES))
|
11
|
-
self.spawn_particles_system(self.SUBJECT, cube)
|
12
|
-
|
13
|
-
for f in range(self.NUMBER_OF_FRAMES):
|
14
|
-
bpy.context.scene.frame_set(f)
|
15
|
-
self.SUBJECT.particle_systems["ParticleSystem"].seed += 1
|
16
|
-
self.SUBJECT.scale += mathutils.Vector((0.1,0.1,0.1))
|
17
|
-
helpers.add_frame([self.SUBJECT], ['particle_systems["ParticleSystem"].seed', 'scale'])
|
18
|
-
|
19
|
-
def spawn_particles_system(self, base, obj):
|
20
|
-
base.modifiers.new("Particles", type='PARTICLE_SYSTEM')
|
21
|
-
settings = bpy.data.particles[-1]
|
22
|
-
settings.emit_from = 'VERT'
|
23
|
-
settings.physics_type = 'NO'
|
24
|
-
settings.count = 2000 # default 1000
|
25
|
-
settings.particle_size = 0.01
|
26
|
-
settings.render_type = 'OBJECT'
|
27
|
-
settings.dupli_object = obj
|
28
|
-
settings.show_unborn = True
|
29
|
-
settings.use_dead = True
|
30
|
-
settings.size_random = 0.5
|
31
|
-
bpy.ops.object.duplicates_make_real()
|
32
|
-
|
33
|
-
|