User:Paradox-01/Blender/Research: Difference between revisions

From OniGalore
Jump to navigation Jump to search
mNo edit summary
m (link fix; not sure if this addon is gone in Blender 4.2, but the docs page for it sure is)
 
(12 intermediate revisions by 2 users not shown)
Line 2: Line 2:
  C:\Program Files\Blender Foundation
  C:\Program Files\Blender Foundation
where each bigger version gets its own folder
where each bigger version gets its own folder
...
  Blender 3.1
  Blender 3.1
  Blender 2.93
  Blender 2.93
  Blender 2.83
  Blender 2.83
...


==Blender horror reloaded==
<span style="font-size: 32pt;">'''Blender horror reloaded'''</span>
===Random session #1===
 
====Script log====
==Random session #1==
===Script log===
Almost all actions in Blender get logged. You need to '''open the "info" window''' to see it.
Almost all actions in Blender get logged. You need to '''open the "info" window''' to see it.
  bpy.ops.mesh.primitive_cube_add(size=2, enter_editmode=False, align='WORLD', location=(0, 0, 0), scale=(1, 1, 1))
  bpy.ops.mesh.primitive_cube_add(size=2, enter_editmode=False, align='WORLD', location=(0, 0, 0), scale=(1, 1, 1))


====Python console====
===Python console===
Logged commands can be copied into the python console. Press enter key to execute.
Logged commands can be copied into the python console. Press enter key to execute.


Line 23: Line 24:
You can translate file paths you get from Explorer's address bar by turning "\" into "\\".  
You can translate file paths you get from Explorer's address bar by turning "\" into "\\".  


====Text editor window====
===Text editor window===
You can collected logged commands in a python file if you use the text editor.
You can collected logged commands in a python file if you use the text editor.


Line 42: Line 43:
  bpy.ops.mesh.primitive_cube_add(size=2, enter_editmode=False, align='WORLD', location=(0, 0, 0), scale=(1, 1, 1))
  bpy.ops.mesh.primitive_cube_add(size=2, enter_editmode=False, align='WORLD', location=(0, 0, 0), scale=(1, 1, 1))


====No drag and drop support====
===No drag and drop support===
Unbelievable, but after all these years drag and drop support is almost zero.
Unbelievable, but after all these years drag and drop support is almost zero.


Line 114: Line 115:
  # https://blender.stackexchange.com/questions/44382/blender-python-select-an-object-with-the-sequence-of-letters-in-a-name
  # https://blender.stackexchange.com/questions/44382/blender-python-select-an-object-with-the-sequence-of-letters-in-a-name


====Outliner====
===Outliner===
When click the second icon (Display Mode) of the Outliner you can change the Layer View to Data API. This might be helpful for logging one or another command by toying around in properties.
When click the second icon (Display Mode) of the Outliner you can change the Layer View to Data API. This might be helpful for logging one or another command by toying around in properties.


===Random session #2===
==Random session #2==
====More Python====
===More Python===
Remember to ... Edit > Preferences
Remember to ... Edit > Preferences


Line 124: Line 125:




====Python-generated UI====
===Python-generated UI===


Reading for later:
Reading for later:
Line 138: Line 139:
[...]
[...]


===Random session #3===
==Random session #3==
====Dynamic context menus====
===Dynamic context menus===
The idea is to give [[XML:File_types#BINA.2FOBJC|function objects (CJBO)]] a dynamic context menu, either by analyzing its given collection name and/or further tags/properties given to the object.
The idea is to give [[XML:File_types#BINA.2FOBJC|function objects (CJBO)]] a dynamic context menu, either by analyzing its given collection name and/or further tags/properties given to the object.


Reading for later:
Reading for later:


* https://docs.blender.org/manual/en/latest/addons/interface/context_menu.html
* https://docs.blender.org/manual/en/4.1/addons/interface/context_menu.html#dynamic-context-menu
* https://blenderartists.org/t/context-sensitive-menu-in-blender/515689
* https://blenderartists.org/t/context-sensitive-menu-in-blender/515689


[...]
[...]


===Building Blender===
==Build Blender==
  https://wiki.blender.org/wiki/Building_Blender
  https://developer.blender.org/docs/handbook/building_blender/
  https://wiki.blender.org/wiki/Building_Blender/Windows
  https://developer.blender.org/docs/handbook/building_blender/windows/


* https://www.youtube.com/watch?v=eCvuQHlKPEk
* https://www.youtube.com/watch?v=eCvuQHlKPEk
Line 159: Line 160:
update files
update files
  make update  
  make update  
(re)create build, the first build will take a couple of minutes, further builds take about a minute or less
(re)build, the first build takes a couple of good minutes, further builds take about a minute
  make
  make
Final executable will be saved to
C:\blender-git\build_windows_Full_x64_vc17_Release\bin\Debug
If there is not enough disk space this fails almost silently. (Progress visible in CMD will simply stop.)
==Build Blender with Visual Studio==
cd C:\blender-git\blender
make full nobuild
In solution explorer open "CMakePredefinedTargets", right-click "INSTALL", click "build" ("Erstellen" in German).
==Proof of concept==
Unorthodox but could be effective.
Blender, drag'n'drop event of an oni file ->
context aware conversion manager.exe ->
OniSplit.exe ->
Blender continues to run, converted files get read by python scripts, these are chosen based on what four letter file prefix the oni file had
For example this would greatly automate level modding.
Objects would be tagged and placed on suitable layers. (CJBO management.)
This could replace the outdated XSI workflow and its addon.


===wm_window.c ===
===wm_window.c ===
blender-with-libraries-3.1.0\blender-3.1.0\source\blender\windowmanager\intern\wm_window.c
C:\blender-git\blender\source\blender\windowmanager\intern\wm_window.c


By default only one file of dropped ones will be detected.
By default only one file of dropped ones will be detected.
Line 169: Line 195:
system(processFile); could be used but then Blender hangs until the child has process finished.
system(processFile); could be used but then Blender hangs until the child has process finished.


Therefore let's use [https://docs.microsoft.com/de-de/windows/win32/procthread/creating-processes CreateProcess].
Therefore let's use [https://learn.microsoft.com/de-de/windows/win32/procthread/creating-processes CreateProcess].


  #include <windows.h>
  #include <windows.h> // CreateProcess
#include "BPY_extern_run.h" // run py scripts


   char processFile[255];
   char processFile[255];
  char fn[255]; // py file (the more python, the less C)
   
   
  STARTUPINFO si;
  PROCESS_INFORMATION pi;
  ZeroMemory( &si, sizeof(si) );
  si.cb = sizeof(si);
  ZeroMemory( &pi, sizeof(pi) );
 
   if (ddd->dataType == GHOST_kDragnDropTypeFilenames) {
   if (ddd->dataType == GHOST_kDragnDropTypeFilenames) {
           GHOST_TStringArray *stra = ddd->data;
           GHOST_TStringArray *stra = ddd->data;
Line 199: Line 234:
   
   
             // Wait until child process exits.
             // Wait until child process exits.
             // (in our case this is exactly what we don't want)
             // wait for onisplit to convert files ?
             // WaitForSingleObject(pi.hProcess, INFINITE);
             WaitForSingleObject(pi.hProcess, INFINITE);
   
   
             // Close process and thread handles.
             // Close process and thread handles.
Line 206: Line 241:
             CloseHandle(pi.hThread);
             CloseHandle(pi.hThread);
   
   
             printf("file was processed");
            strcpy(fn, "C:\\blender-git\\oni.py");
            // C (context) looks like some crazy voodoo, this shouldn't even work right now, but it does
            // for Blender specific stuff a context is needed otherwise the program will crash
            // https://developer.blender.org/docs/features/core/context/
            bool ok;
            ok = BPY_run_filepath(C, fn, NULL);
             printf("file was processed\n");
  ...
  ...
  }
  }


====Todo====
===Todo===
1) replace notepad with own exe (writing more code in C is a pain)
1) replace notepad with own exe (writing more code in C is a pain)


2) research path reading in C (get folder/file/extension) so own exe can use relative path when it is place alongside Blender
2) research path reading in C (get folder/file/extension) so own exe can use relative path when it is placed alongside Blender
 
3) research Blender import and let the exe decide what py script to use (for example ONCC*.oni -> import_ONCC.py)
blender --background --python myscript.py
https://blender.stackexchange.com/questions/1365/how-can-i-run-blender-from-command-line-or-a-python-script-without-opening-a-gui


:: Edit: Then again ... Looks like [https://stackoverflow.com/questions/36360876/how-do-i-run-a-python-script-using-an-already-running-blender Blender cannot accept new inputs?] <span style="font-size:16pt;">ರ_ರ .................. (ノಠ益ಠ)ノ彡┻━┻</span>
3) '''Looks like [https://stackoverflow.com/questions/36360876/how-do-i-run-a-python-script-using-an-already-running-blender Blender cannot accept new inputs?]''' <span style="font-size:16pt;">ರ_ರ .................. (ノಠ益ಠ)ノ彡┻━┻</span>


:: Possible workarounds:
This means some part of the analysis has to be done in C.
::: 1) Blender Server, '''[https://blender.stackexchange.com/questions/41533/how-to-remotely-run-a-python-script-in-an-existing-blender-instance sockets]'''.
::: 2) Add a '''new start arg''' and let Blender run as '''[https://www.youtube.com/watch?v=_i9HkIT0Atg single-instance application]'''
::: 3) A '''timer''' that checks every second for '''[https://github.com/zeffii/bpy_externall new commands inside a file]'''.


4) Deciding how to distribute this Blender variant.
4) Deciding how to distribute this Blender variant.


Long-term goals could be to include Delano's addon and provide a way to automate the updating of Blender with these extras.
Long-term goals could be to include Delano's addon and provide a way to automate the updating of Blender with these extras.
==Notes for further customizations==
* Catching getActive Events would be interesting.
* '''[https://blender.stackexchange.com/questions/41533/how-to-remotely-run-a-python-script-in-an-existing-blender-instance Blender Server]'''
* Globals are located in
BKE_global.h
The files close to main would need to be edited if Blender shall became a [https://www.youtube.com/watch?v=_i9HkIT0Atg single-instance application]. If started with hypothetical "singleInstance" arg, that would allow a permanent ''command line communication''.
C:\blender-git\blender\source\creator
creator_intern.h
creator.c
creator_args.c
* Pipe communication.
[[Category:Userspace]]

Latest revision as of 23:15, 20 October 2024

The default install path on Windows is

C:\Program Files\Blender Foundation

where each bigger version gets its own folder

...
Blender 3.1
Blender 2.93
Blender 2.83

Blender horror reloaded

Random session #1

Script log

Almost all actions in Blender get logged. You need to open the "info" window to see it.

bpy.ops.mesh.primitive_cube_add(size=2, enter_editmode=False, align='WORLD', location=(0, 0, 0), scale=(1, 1, 1))

Python console

Logged commands can be copied into the python console. Press enter key to execute.

Actual script files can be run like this but look out for pitfalls.

filename = "/full/path/to/myscript.py"
exec(compile(open(filename).read(), filename, 'exec'))

You can translate file paths you get from Explorer's address bar by turning "\" into "\\".

Text editor window

You can collected logged commands in a python file if you use the text editor.

What to test it? Pressing the play button. Ups, it gave an error? But where is the fricking System Console to see the actual error?

A google search later:

Window > Toggle System Console
Traceback (most recent call last):
 File "\cube.py", line 1, in <module>
NameError: name 'bpy' is not defined
Error: Python script failed, check the message in the system console

It might by kind of counter intuitive because you are already in Blender but - as this error shows - you need to import any library used by the code.

import bpy
bpy.ops.mesh.primitive_cube_add(size=2, enter_editmode=False, align='WORLD', location=(0, 0, 0), scale=(1, 1, 1))

No drag and drop support

Unbelievable, but after all these years drag and drop support is almost zero.

If you try to drop a DAE or OBJ into the viewport it shows a plus icon but nothing will happen after the drop.


Actually dropped files are detected as the System Concole shows.
drop file filePath
So in theory it is possible to edit the Blender source code to add an dnd file importer.
It seems BLEND is currently the only file type where dnd is truly supported. This could give a hint where to look into the source and add more types.
The string "drop file" is found two times in source:
blender-with-libraries-3.1.0\blender-3.1.0\source\blender\windowmanager\intern\wm_playanim.c
blender-with-libraries-3.1.0\blender-3.1.0\source\blender\windowmanager\intern\wm_window.c
The simplest thing possible might be to pass the detected file to a Python script and let it handle the import.
Test: modify string, compile to an exe and see whether that's the correct file at all.

Would it be reasonable to program a workflow using another GUI and targeting Blender via command line?

Let's see... The idea with XSI was to sort "functional" objects under different layers.

Unfortunately Blender doesn't log that. When you hide/show a layer (nowadays a.k.a. "collection") you will see this:

bpy.data.scenes["Scene"].(null) = True
bpy.data.scenes["Scene"].(null) = False

Yea what an useless log. Documentation where are you? https://docs.blender.org/manual/en/latest/scene_layout/object/properties/instancing/collection.html?highlight=collection#basic-usage

No helpful for scripting. Google? https://blender.stackexchange.com/questions/158998/how-to-hide-one-level-for-all-collections-with-python

Oh wait, there's the scripting ... only a little more useful ... https://docs.blender.org/api/current/bpy.types.LayerCollection.html#bpy.types.LayerCollection.hide_viewport

import bpy
bpy.context.layer_collection.children['Collection'].hide_viewport = True

So far so good.

To place an object on a specific layer into a specific collection we have to create it or set it active.

create obj on new layer
import bpy
collection = bpy.data.collections.new('My Collection3')
bpy.context.scene.collection.children.link(collection)
# NOTE the use of 'collection.name' to account for potential automatic renaming
layer_collection = bpy.context.view_layer.layer_collection.children[collection.name]
bpy.context.view_layer.active_layer_collection = layer_collection
bpy.ops.mesh.primitive_plane_add(enter_editmode=False, align='WORLD', location=(0, 0, 0), scale=(1, 1, 1))
create obj on existing layer
import bpy
layer_collection = bpy.context.view_layer.layer_collection.children["Collection9"]
bpy.context.view_layer.active_layer_collection = layer_collection
bpy.ops.mesh.primitive_plane_add(enter_editmode=False, align='WORLD', location=(0, 0, 0), scale=(1, 1, 1))
just get the active collection
import bpy
print(bpy.context.view_layer.active_layer_collection.collection)
#<bpy_struct, Collection("Collection9") at 0x000001E090E84B88>
# geez... next stop regex to get content betwee the quote signs
# https://blender.stackexchange.com/questions/44382/blender-python-select-an-object-with-the-sequence-of-letters-in-a-name

Outliner

When click the second icon (Display Mode) of the Outliner you can change the Layer View to Data API. This might be helpful for logging one or another command by toying around in properties.

Random session #2

More Python

Remember to ... Edit > Preferences

Interface: Display: Edit[x] Python Tooltips


Python-generated UI

Reading for later:

windows, tabs, panels

UI:

Scripting:

[...]

Random session #3

Dynamic context menus

The idea is to give function objects (CJBO) a dynamic context menu, either by analyzing its given collection name and/or further tags/properties given to the object.

Reading for later:

[...]

Build Blender

https://developer.blender.org/docs/handbook/building_blender/
https://developer.blender.org/docs/handbook/building_blender/windows/
cd C:\blender-git\blender

update files

make update 

(re)build, the first build takes a couple of good minutes, further builds take about a minute

make

Final executable will be saved to

C:\blender-git\build_windows_Full_x64_vc17_Release\bin\Debug

If there is not enough disk space this fails almost silently. (Progress visible in CMD will simply stop.)

Build Blender with Visual Studio

cd C:\blender-git\blender
make full nobuild

In solution explorer open "CMakePredefinedTargets", right-click "INSTALL", click "build" ("Erstellen" in German).

Proof of concept

Unorthodox but could be effective.

Blender, drag'n'drop event of an oni file ->
context aware conversion manager.exe ->
OniSplit.exe ->
Blender continues to run, converted files get read by python scripts, these are chosen based on what four letter file prefix the oni file had

For example this would greatly automate level modding.

Objects would be tagged and placed on suitable layers. (CJBO management.)

This could replace the outdated XSI workflow and its addon.

wm_window.c

C:\blender-git\blender\source\blender\windowmanager\intern\wm_window.c

By default only one file of dropped ones will be detected.

system(processFile); could be used but then Blender hangs until the child has process finished.

Therefore let's use CreateProcess.

#include <windows.h> // CreateProcess
#include "BPY_extern_run.h" // run py scripts
 char processFile[255];
 char fn[255]; // py file (the more python, the less C)

 STARTUPINFO si;
 PROCESS_INFORMATION pi;

 ZeroMemory( &si, sizeof(si) );
 si.cb = sizeof(si);
 ZeroMemory( &pi, sizeof(pi) );
 
 if (ddd->dataType == GHOST_kDragnDropTypeFilenames) {
         GHOST_TStringArray *stra = ddd->data;
         for (int a = 0; a < stra->count; a++) {
           printf("drop file %s\n", stra->strings[a]);

           strcpy(processFile, "C:\\Windows\\system32\\notepad.exe ");
           strcat(processFile, stra->strings[a]);

           // Start the child process.
           CreateProcess(
               // visual studio create only successful code if "L" is used before the strings
               // don't use L with blender
               "C:\\Windows\\system32\\notepad.exe",  // No module name (use command line)
               processFile,                           // Command line
               NULL,   // Process handle not inheritable
               NULL,   // Thread handle not inheritable
               FALSE,  // Set handle inheritance to FALSE
               0,      // No creation flags
               NULL,   // Use parent's environment block
               NULL,   // Use parent's starting directory
               &si,    // Pointer to STARTUPINFO structure
               &pi);   // Pointer to PROCESS_INFORMATION structure

           // Wait until child process exits.
           // wait for onisplit to convert files ?
           WaitForSingleObject(pi.hProcess, INFINITE);

           // Close process and thread handles.
           CloseHandle(pi.hProcess);
           CloseHandle(pi.hThread);

            strcpy(fn, "C:\\blender-git\\oni.py");
           // C (context) looks like some crazy voodoo, this shouldn't even work right now, but it does
           // for Blender specific stuff a context is needed otherwise the program will crash
           // https://developer.blender.org/docs/features/core/context/
           bool ok;
           ok = BPY_run_filepath(C, fn, NULL);

           printf("file was processed\n");
...
}

Todo

1) replace notepad with own exe (writing more code in C is a pain)

2) research path reading in C (get folder/file/extension) so own exe can use relative path when it is placed alongside Blender

3) Looks like Blender cannot accept new inputs? ರ_ರ .................. (ノಠ益ಠ)ノ彡┻━┻

This means some part of the analysis has to be done in C.

4) Deciding how to distribute this Blender variant.

Long-term goals could be to include Delano's addon and provide a way to automate the updating of Blender with these extras.

Notes for further customizations

  • Catching getActive Events would be interesting.
  • Blender Server
  • Globals are located in
BKE_global.h

The files close to main would need to be edited if Blender shall became a single-instance application. If started with hypothetical "singleInstance" arg, that would allow a permanent command line communication.

C:\blender-git\blender\source\creator
creator_intern.h
creator.c
creator_args.c
  • Pipe communication.