/ materials.py
materials.py
1 from abc import ABC, abstractmethod 2 from DreamTalk.constants import WHITE, SPLINE_THICKNESS 3 import c4d 4 5 6 class Material(ABC): 7 8 def __init__(self, name=None): 9 self.name = name 10 self.document = c4d.documents.GetActiveDocument() # get document 11 self.linked_tag = None # define attribute for tag 12 self.specify_material_type() 13 self.insert_to_document() 14 self.set_name() 15 self.set_unique_desc_ids() 16 17 def __repr__(self): 18 """sets the string representation for printing""" 19 return f"{self.__class__.__name__} of {self.linked_tag.linked_object}" 20 21 def insert_to_document(self): 22 self.document.InsertMaterial(self.obj) 23 24 def set_name(self): 25 if self.name: 26 self.obj.SetName(self.name) 27 28 @abstractmethod 29 def specify_material_type(self): 30 pass 31 32 @abstractmethod 33 def set_material_properties(self): 34 pass 35 36 37 class SketchMaterial(Material): 38 39 def __init__(self, color=WHITE, arrow_start=False, arrow_end=False, draw_order=None, stroke_width=None, **kwargs): 40 self.color = color 41 self.arrow_start = arrow_start 42 self.arrow_end = arrow_end 43 self.draw_order = draw_order 44 self.stroke_width = stroke_width 45 super().__init__(**kwargs) 46 self.set_material_properties() 47 48 def specify_material_type(self): 49 self.obj = c4d.BaseMaterial(1011014) # create sketch material 50 51 def set_material_properties(self): 52 # set properties 53 self.obj[c4d.OUTLINEMAT_COLOR] = self.color 54 if self.arrow_start: 55 self.obj[c4d.OUTLINEMAT_LINESTART] = 4 56 if self.arrow_end: 57 self.obj[c4d.OUTLINEMAT_LINEEND] = 4 58 # set constants 59 self.obj[c4d.OUTLINEMAT_STARTCAP_WIDTH] = 7 60 self.obj[c4d.OUTLINEMAT_STARTCAP_HEIGHT] = 5 61 self.obj[c4d.OUTLINEMAT_ENDCAP_WIDTH] = 7 62 self.obj[c4d.OUTLINEMAT_ENDCAP_HEIGHT] = 5 63 self.obj[c4d.OUTLINEMAT_ANIMATE_AUTODRAW] = True # draw mode 64 self.obj[c4d.OUTLINEMAT_THICKNESS] = SPLINE_THICKNESS 65 if self.stroke_width: # customise stroke width 66 self.obj[c4d.OUTLINEMAT_THICKNESS] = self.stroke_width 67 self.obj[c4d.OUTLINEMAT_FILTER_STROKES] = False 68 draw_orders = { 69 "long_to_short": 0, 70 "short_to_long": 1, 71 "top_to_bottom": 2, 72 "bottom_to_top": 3, 73 "left_to_right": 4, 74 "right_to_left": 5, 75 "random": 6 76 } 77 self.obj[c4d.OUTLINEMAT_ANIMATE_STROKES] = draw_orders[self.draw_order] # draw order 78 # draw speed to completion 79 self.obj[c4d.OUTLINEMAT_ANIMATE_STROKE_SPEED_TYPE] = 2 80 # strokes independent of screen 81 self.obj[c4d.OUTLINEMAT_STOKECLIP_TOSCREEN] = False 82 83 84 def set_unique_desc_ids(self): 85 self.desc_ids = { 86 "draw_completion": c4d.DescID(c4d.DescLevel(c4d.OUTLINEMAT_ANIMATE_STROKE_SPEED_COMPLETE, c4d.DTYPE_REAL, 0)), 87 "opacity": c4d.DescID(c4d.DescLevel(c4d.OUTLINEMAT_OPACITY, c4d.DTYPE_REAL, 0)), 88 "color": c4d.DescID(c4d.DescLevel(c4d.OUTLINEMAT_COLOR, c4d.DTYPE_COLOR, 0)) 89 } 90 91 92 class FillMaterial(Material): 93 94 def __init__(self, fill=0, glow=0, color=WHITE, **kwargs): 95 self.fill = fill 96 self.glow = glow 97 self.color = color 98 super().__init__(**kwargs) 99 self.set_material_properties() 100 101 def specify_material_type(self): 102 self.obj = c4d.BaseMaterial(c4d.Mmaterial) # create fill material 103 104 def set_material_properties(self): 105 # set properties 106 self.obj[c4d.MATERIAL_LUMINANCE_COLOR] = self.color 107 self.obj[c4d.MATERIAL_TRANSPARENCY_BRIGHTNESS] = 1 - self.fill 108 # set constants 109 self.obj[c4d.MATERIAL_USE_REFLECTION] = False 110 self.obj[c4d.MATERIAL_USE_COLOR] = False 111 self.obj[c4d.MATERIAL_USE_LUMINANCE] = True 112 self.obj[c4d.MATERIAL_USE_TRANSPARENCY] = True 113 self.obj[c4d.MATERIAL_USE_GLOW] = True 114 self.obj[c4d.MATERIAL_GLOW_BRIGHTNESS] = self.glow 115 self.obj[c4d.MATERIAL_GLOW_USEMATERIALCOLOR] = False 116 self.obj[c4d.MATERIAL_GLOW_INNERSTRENGTH] = 0 117 self.obj[c4d.MATERIAL_TRANSPARENCY_REFRACTION] = 1 118 119 def set_unique_desc_ids(self): 120 self.desc_ids = { 121 "transparency": c4d.DescID(c4d.DescLevel(c4d.MATERIAL_TRANSPARENCY_BRIGHTNESS, c4d.DTYPE_REAL, 0)), 122 "glow_brightness": c4d.DescID(c4d.DescLevel(c4d.MATERIAL_GLOW_BRIGHTNESS, c4d.DTYPE_REAL, 0)) 123 }