init
This commit is contained in:
parent
3cb8961d6e
commit
cdc2b263f4
40
__init__.py
Normal file
40
__init__.py
Normal file
@ -0,0 +1,40 @@
|
||||
__addon_enabled__ = False # Default state, Blender will manage this
|
||||
|
||||
bl_info = {
|
||||
"name": "Virtual Painter",
|
||||
"author": "Andrin Honegger",
|
||||
"version": (0, 1, 0),
|
||||
"blender": (4, 3, 2),
|
||||
"location": "3D Viewport > Tool Shelf > Tool",
|
||||
"description": "",
|
||||
"warning": "",
|
||||
"category": "Paint",
|
||||
}
|
||||
|
||||
from . import (
|
||||
paintListener,
|
||||
paintModifier,
|
||||
ui,
|
||||
preferences,
|
||||
)
|
||||
|
||||
import bpy # Blender Python API
|
||||
|
||||
# Register and Unregister Classes
|
||||
module_tuple = (
|
||||
#paintListener,
|
||||
#paintModifier,
|
||||
ui,
|
||||
#preferences,
|
||||
)
|
||||
|
||||
def register():
|
||||
for item in module_tuple:
|
||||
item.register()
|
||||
|
||||
def unregister():
|
||||
for item in module_tuple:
|
||||
item.unregister()
|
||||
|
||||
if __name__ == "__main__":
|
||||
register()
|
16
blender_manifest.toml
Normal file
16
blender_manifest.toml
Normal file
@ -0,0 +1,16 @@
|
||||
schema_version = "1.0.0"
|
||||
|
||||
id = "virtual_painter"
|
||||
version = "0.1.0"
|
||||
name = "Virtual Painter"
|
||||
tagline = "Painting extension for painting normals for a painted style"
|
||||
maintainer = "Andrin Honegger"
|
||||
type = "add-on"
|
||||
|
||||
tags = ["Paint"]
|
||||
|
||||
blender_version_min = "4.3.2"
|
||||
|
||||
license = [
|
||||
"SPDX:GPL-3.0-or-later",
|
||||
]
|
7
paintListener.py
Normal file
7
paintListener.py
Normal file
@ -0,0 +1,7 @@
|
||||
import bpy
|
||||
|
||||
def register():
|
||||
pass
|
||||
|
||||
def unregister():
|
||||
pass
|
7
paintModifier.py
Normal file
7
paintModifier.py
Normal file
@ -0,0 +1,7 @@
|
||||
import bpy
|
||||
|
||||
def register():
|
||||
pass
|
||||
|
||||
def unregister():
|
||||
pass
|
7
preferences.py
Normal file
7
preferences.py
Normal file
@ -0,0 +1,7 @@
|
||||
import bpy
|
||||
|
||||
def register():
|
||||
pass
|
||||
|
||||
def unregister():
|
||||
pass
|
134
ui.py
Normal file
134
ui.py
Normal file
@ -0,0 +1,134 @@
|
||||
import bpy
|
||||
|
||||
class vPainterSetting(bpy.types.PropertyGroup):
|
||||
is_vPainter_enabled: bpy.props.BoolProperty(
|
||||
name="Addon Enabled",
|
||||
description="Enable / disable the virtual Painter",
|
||||
default=False,
|
||||
update=lambda self, context: toggle_operator(context)
|
||||
)
|
||||
texture_panel_state: bpy.props.BoolProperty(
|
||||
name="Textures",
|
||||
default=False,
|
||||
description="Textures used for painting"
|
||||
)
|
||||
|
||||
def toggle_operator(context):
|
||||
"""Start or stop the modal operator based on the checkbox."""
|
||||
if context.scene.vPainter_settings.is_vPainter_enabled:
|
||||
# Start the operator
|
||||
bpy.ops.paint.virtual_painter('INVOKE_DEFAULT')
|
||||
|
||||
class textureSelection(bpy.types.PropertyGroup):
|
||||
texture: bpy.props.PointerProperty(
|
||||
name="Texture",
|
||||
type=bpy.types.Image,
|
||||
description="Select a texture",
|
||||
)
|
||||
color: bpy.props.FloatVectorProperty(
|
||||
name="Color",
|
||||
subtype='COLOR',
|
||||
size=4,
|
||||
min=0.0,
|
||||
max=1.0,
|
||||
default=(1.0, 1.0, 1.0, 1.0),
|
||||
description="Select a color (RGBA)",
|
||||
)
|
||||
|
||||
class VIEW3D_PT_ToolActiveToolPanel(bpy.types.Panel):
|
||||
bl_space_type = 'VIEW_3D'
|
||||
bl_region_type = 'UI'
|
||||
bl_category = "Tool"
|
||||
bl_label = "Virtual Painter"
|
||||
bl_idname = "VIEW3D_PT_virtual_Painter"
|
||||
|
||||
def draw(self, context):
|
||||
layout = self.layout
|
||||
tool_settings = context.scene.vPainter_settings
|
||||
normal_texture = context.scene.normal_texture_settings
|
||||
texture_collection = context.scene.texture_collection_settings
|
||||
|
||||
# Add the checkbox to toggle the operator
|
||||
layout.prop(
|
||||
tool_settings,
|
||||
"is_vPainter_enabled",
|
||||
text="DISABLE" if tool_settings.is_vPainter_enabled else "ENABLE",
|
||||
toggle=True,
|
||||
invert_checkbox=True
|
||||
)
|
||||
|
||||
# Collapsible section of used textures
|
||||
layout.prop(
|
||||
tool_settings,
|
||||
"texture_panel_state",
|
||||
emboss=False,
|
||||
icon="DOWNARROW_HLT" if tool_settings.texture_panel_state else "RIGHTARROW",
|
||||
toggle=True
|
||||
)
|
||||
if tool_settings.texture_panel_state:
|
||||
section = layout.box()
|
||||
section.label(text="Normal Texture")
|
||||
|
||||
# Normal texture selection
|
||||
section.prop(normal_texture, "texture", text="", icon="TEXTURE")
|
||||
|
||||
section.separator(type='LINE')
|
||||
|
||||
# Custom texture selection
|
||||
section.label(text="Custom Texture")
|
||||
|
||||
# Display all items in the collection
|
||||
for index, item in enumerate(texture_collection):
|
||||
box = section.box()
|
||||
box.prop(item, "texture", text="", icon="TEXTURE")
|
||||
box.prop(item, "color", text="", icon="COLOR")
|
||||
box.operator("custom_texture.remove_item", text="", icon="X").index = index
|
||||
section.operator("custom_texture.add_item", icon="ADD")
|
||||
|
||||
# Operator to add new items to the collection
|
||||
class IMAGE_OT_AddItem(bpy.types.Operator):
|
||||
bl_idname = "custom_texture.add_item"
|
||||
bl_label = "Add New"
|
||||
bl_description = "Add a new texture"
|
||||
|
||||
def execute(self, context):
|
||||
texture_collection = context.scene.texture_collection_settings
|
||||
texture_collection.add()
|
||||
return {'FINISHED'}
|
||||
|
||||
# Operator to remove items from the collection
|
||||
class IMAGE_OT_RemoveItem(bpy.types.Operator):
|
||||
bl_idname = "custom_texture.remove_item"
|
||||
bl_label = ""
|
||||
bl_description = "Remove this texture"
|
||||
|
||||
index: bpy.props.IntProperty()
|
||||
|
||||
def execute(self, context):
|
||||
texture_collection = context.scene.texture_collection_settings
|
||||
if 0 <= self.index < len(texture_collection):
|
||||
texture_collection.remove(self.index)
|
||||
return {'FINISHED'}
|
||||
|
||||
|
||||
def register():
|
||||
bpy.utils.register_class(vPainterSetting)
|
||||
bpy.utils.register_class(textureSelection)
|
||||
bpy.utils.register_class(VIEW3D_PT_ToolActiveToolPanel)
|
||||
bpy.utils.register_class(IMAGE_OT_AddItem)
|
||||
bpy.utils.register_class(IMAGE_OT_RemoveItem)
|
||||
|
||||
bpy.types.Scene.vPainter_settings = bpy.props.PointerProperty(type=vPainterSetting)
|
||||
bpy.types.Scene.normal_texture_settings = bpy.props.PointerProperty(type=textureSelection)
|
||||
bpy.types.Scene.texture_collection_settings = bpy.props.CollectionProperty(type=textureSelection)
|
||||
|
||||
def unregister():
|
||||
bpy.utils.unregister_class(vPainterSetting)
|
||||
bpy.utils.unregister_class(textureSelection)
|
||||
bpy.utils.unregister_class(VIEW3D_PT_ToolActiveToolPanel)
|
||||
bpy.utils.unregister_class(IMAGE_OT_AddItem)
|
||||
bpy.utils.unregister_class(IMAGE_OT_RemoveItem)
|
||||
|
||||
del bpy.types.Scene.vPainter_settings
|
||||
del bpy.types.Scene.normal_texture_settings
|
||||
del bpy.types.Scene.texture_collection_settings
|
Loading…
Reference in New Issue
Block a user