/ 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          }