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.
Files changed (36) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -1
  3. data/README.md +21 -9
  4. data/bin/glitch3d +1 -1
  5. data/fixtures/base.blend +0 -0
  6. data/fixtures/{osl-shaders → osl_shaders}/glass.osl +0 -0
  7. data/fixtures/{osl-shaders → osl_shaders}/gold.osl +0 -0
  8. data/fixtures/{osl-shaders → osl_shaders}/green_marble.osl +0 -0
  9. data/fixtures/{osl-shaders → osl_shaders}/turbulent.osl +0 -0
  10. data/fixtures/{osl-shaders → osl_shaders}/veined_marble.osl +0 -0
  11. data/fixtures/{text → texts}/strings.txt +0 -0
  12. data/lib/glitch3d.rb +75 -22
  13. data/lib/glitch3d/bpy/canvas/aether.py +22 -58
  14. data/lib/glitch3d/bpy/canvas/dreamatorium.py +3 -9
  15. data/lib/glitch3d/bpy/canvas/empty.py +8 -0
  16. data/lib/glitch3d/bpy/canvas/fernandez.py +36 -10
  17. data/lib/glitch3d/bpy/canvas/lyfe.py +1 -3
  18. data/lib/glitch3d/bpy/canvas/metaballs.py +11 -7
  19. data/lib/glitch3d/bpy/canvas/sphere.py +23 -38
  20. data/lib/glitch3d/bpy/canvas/waves.py +15 -41
  21. data/lib/glitch3d/bpy/helpers.py +70 -40
  22. data/lib/glitch3d/bpy/main.py +219 -193
  23. data/lib/glitch3d/bpy/post-processing/average.py +8 -10
  24. data/lib/glitch3d/bpy/post-processing/mosaic.py +1 -1
  25. data/lib/glitch3d/bpy/post-processing/optimize.py +3 -6
  26. data/lib/glitch3d/bpy/post-processing/palette.py +3 -4
  27. data/lib/glitch3d/bpy/render_settings.py +35 -23
  28. data/lib/glitch3d/objects/vertex.rb +1 -1
  29. data/lib/glitch3d/strategies/default.rb +10 -8
  30. data/lib/glitch3d/strategies/duplication.rb +14 -12
  31. data/lib/glitch3d/strategies/find_and_replace.rb +19 -16
  32. data/lib/glitch3d/strategies/localized.rb +28 -18
  33. data/lib/glitch3d/strategies/none.rb +7 -5
  34. data/lib/glitch3d/version.rb +1 -1
  35. metadata +9 -9
  36. data/lib/glitch3d/bpy/canvas/particles.py +0 -33
@@ -1,14 +1,13 @@
1
- # Use Pillow fork with Python3
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
- path = os.environ['RENDER_PATH']
11
- files = sys.argv[1:]
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 signatures
39
- for i in range(0,5):
40
- font = random.choice(range(0, 7))
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(path + "average.png")
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 = [path + f for f in os.listdir(path) if (os.path.isfile(os.path.join(path, f)) and os.path.join(path, f).endswith(".png"))]
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
- path = os.environ['RENDER_PATH']
9
-
10
- res_x = int(sys.argv[1])
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(sys.argv[-1], 20)
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), make_tuple(color))))
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
- bpy.context.scene.render.layers[0].use = False
46
- chunks = chunk_it(bpy.data.objects, 3)
47
- for chunk_index in range(len(chunks)):
48
- for obj in chunks[chunk_index]:
49
- obj.layers[chunk_index + 1] = True
50
- obj.layers[0] = False
51
- for l in bpy.context.scene.render.layers[1:4]:
52
- l.use = True
53
- for obj in bpy.data.objects:
54
- assert obj.layers[0] == False
55
- assert len([i for i, x in enumerate(list(obj.layers)) if x]) == 1 # Only 1 layer activated
56
- assert bpy.context.scene.render.layers[0].use == False
57
- assert bpy.context.scene.render.layers[1].use == True
58
- bpy.context.scene.layers[1] = True
59
- bpy.context.scene.layers[2] = True
60
- bpy.context.scene.layers[3] = True
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
- # if debug == False:
79
- # for l in bpy.context.scene.render.layers:
80
- # l.cyles.use_denoising = True
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 / 50)
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) && vertex.y.send(y) && vertex.y.send(z)
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
- module Default
4
- def alter_vertices(vertices_objects_array)
5
- (VERTEX_GLITCH_ITERATION_RATIO * vertices_objects_array.size).to_i.times do |_|
6
- random_element(vertices_objects_array).fuck
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
- def alter_faces(faces_objects_array, vertex_objects_array)
12
- faces_objects_array
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
- def alter_vertices(vertices_objects_array)
5
- shuffle_vertices(vertices_objects_array)
6
- end
4
+ class << self
5
+ def alter_vertices(vertices_objects_array)
6
+ shuffle_vertices(vertices_objects_array)
7
+ end
7
8
 
8
- def alter_faces(faces_objects_array, vertex_objects_array)
9
- faces_objects_array
10
- end
9
+ def alter_faces(faces_objects_array, vertex_objects_array)
10
+ faces_objects_array
11
+ end
11
12
 
12
- def shuffle_vertices(array)
13
- rand(3).times do
14
- rand_index1 = rand(0..array.size - 1)
15
- rand_index2 = rand(0..array.size - 1)
16
- array[rand_index1], array[rand_index2] = array[rand_index2], array[rand_index1]
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
- def alter_vertices(vertices_objects_array)
5
- @target = rand(9).to_s
6
- @replacement = rand(9).to_s
7
- vertices_objects_array.each do |v|
8
- find_and_replace(v)
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
- def alter_faces(faces_objects_array, vertices_objects_array)
14
- faces_objects_array.sample(3) do |face|
15
- face.v1 = rand(0..vertices_objects_array.size - 1)
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
- def find_and_replace(vertex)
21
- vertex.x = vertex.x.to_s.tr(@target, @replacement).to_f
22
- vertex.y = vertex.y.to_s.tr(@target, @replacement).to_f
23
- vertex.z = vertex.z.to_s.tr(@target, @replacement).to_f
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
- def alter_vertices(vertices_objects_array)
5
- sorted_array = vertices_objects_array.sort do |v1, v2|
6
- rand_attr = v1.rand_attr
7
- v1.send(rand_attr) <=> v2.send(rand_attr)
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
- (VERTEX_GLITCH_ITERATION_RATIO * sorted_array.size).to_i.times do |_|
10
- random_element(target(sorted_array)).fuck
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
- def alter_faces(faces_objects_array, vertices_objects_array)
16
- (FACE_GLITCH_ITERATION_RATIO * faces_objects_array.count).to_i.times do |_|
17
- random_element(faces_objects_array).fuck(random_element(target(vertices_objects_array)))
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
- def selected_area(vertices_objects_array)
23
- Vertex.subset(x: :positive?, y: :positive?, z: :positive?, vertex_list: vertices_objects_array)
24
- end
31
+ def random_particularity
32
+ [:positive?, :negative?].sample
33
+ end
25
34
 
26
- def target(vertices_objects_array)
27
- @target ||= selected_area(vertices_objects_array)
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
- def alter_vertices(vertices_objects_array)
5
- vertices_objects_array
6
- end
4
+ class << self
5
+ def alter_vertices(vertices_objects_array)
6
+ vertices_objects_array
7
+ end
7
8
 
8
- def alter_faces(faces_objects_array, _)
9
- faces_objects_array
9
+ def alter_faces(faces_objects_array, _)
10
+ faces_objects_array
11
+ end
10
12
  end
11
13
  end
12
14
  end
@@ -1,4 +1,4 @@
1
1
  # frozen_string_literal: true
2
2
  module Glitch3d
3
- VERSION = '0.5.0.0'
3
+ VERSION = '0.5.0.1'
4
4
  end
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.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: 2018-05-17 00:00:00.000000000 Z
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/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/text/strings.txt
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
-