Blender Add-on: PapyNR

Joined
Oct 17, 2025
Posts
33
Reaction score
19
Points
8
(May 14, 2026) --- Blender Add-on: PapyNR --- v.0.0.5 --- (W.I.P.)
https://www.mediafire.com/file/qdn2nbwu279wamt/260514_papynr2003.zip/file

*** RELEASE NOTES ***
v.0.0.5 (May 14, 2026)
-- ui, panel⠀⠀⠀⠀⠀⠀ / corrects mapping of PSG sub-rgns; UI issues with VtxGrp selection
-- ui, menu⠀⠀⠀⠀⠀⠀/ corrects output of generated PSG:TRANSFORM
-- ui, panel⠀⠀⠀⠀⠀⠀/ adds wizard to split parts from RgnMorph objects (using Mask)

*** INSTALLATION ***
Run Blender > [topmost menubar] Edit > Preferences > [LH panel] Add-ons > [top RH] Install… > select downloaded .zip
Extraction to reside in:⠀⠀%appdata%\Blender Foundation\Blender\2.92\scripts\addons
The add-on has its own menu at top of 3D viewport.
---WARNING---The import of .3DO files (tdo_imp.py) causes Blender 5.0.1 to crash.

*** CREDITS ***
Burnout3D, 2024, initial PAS Exporter
⠀⠀https://github.com/Burnout3d/NR2003-PAS-Exporter-For-Blender
⠀⠀http://stunodracing.net/index.php?threads/pas-exporter-for-blender-alpha.17136/
⠀⠀https://burnout3d.com/
WhiteFalcon (Fred Anderson), 2003, 3DO file structure (tdo2xml_2k3_06.php)
⠀⠀(3do_php.zip)⠀⠀http://www.theuspits.com/files/n2003/mods/n2003_editing_tools.zip
⠀⠀(Freddy's other stuff from ancient times)⠀⠀http://www.speedcircuit.com/modelx/files.cfm
⠀⠀(ancient "papyrus scroll" by Freddy et al.)⠀⠀http://www.speedcircuit.com/modelx/devTrack.cfm

*** THANKS TO ***
Mystical for his testing, preparations, investigations, debug, background info on content, etc.

*** PREVIOUS VERSIONS ***
v.0.0.4 (May 4, 2026)
-- ui, panel⠀⠀⠀⠀⠀⠀/ adds wizard to create RgnMorph dest. objects (using Lattices)​
-- PAS export⠀⠀⠀⠀/ corrects the data in SHAPE:TRANSFORM section (row-major matrix)​
-- PAS export⠀⠀⠀⠀/ adds option to apply object scale to exported vertex coords​
-- PAS export⠀⠀⠀⠀/ adds option to smooth all faces (can help with RgnMorph meshes)​
-- PAS export⠀⠀⠀⠀/ adds option to nominate a material as donor for paintjobs' config​
-- ui, menu⠀⠀⠀⠀⠀ / adds item to generate PSG:TRANSFORM commands for selected objects​
-- ui, menu⠀⠀⠀⠀⠀ / adds item to generate PAS:XFORM_ANIMATION section from sel. objs​
-- ui, menu⠀⠀⠀⠀⠀ / adds user presets for overview dialogs' Y pos., width, max. rows​
-- ui, general⠀⠀⠀⠀/ reduces visibility of addon-internal datablocks (ui selectables)​
-- PAS exp. log⠀⠀ / corrects material names in the scratch PSG lines​
v.0.0.3 (March 2, 2026)
-- PAS export⠀⠀⠀⠀/ adds scratch PSG for meshes within PAS; see Summary of PAS output​
-- PAS export⠀⠀⠀⠀/ supports Sharp Edges: mesh is split at authored sharp edges​
-- ui, PAS export⠀⠀/ adds Collections and custom assignment to selection of objects​
-- 3DO and PAS⠀⠀ / improves handling of normals​
-- 3DO import⠀⠀⠀ / supports <RegionMorphVertexListDescriptor> (damage mesh)​
v.0.0.2 (Jan. 16, 2026) initial release
⠀⠀-- imports mesh from .3DO⠀⠀⠀⠀-- exports mesh to .PAS

Best regards,
C.W.
<discord>⠀⠀⠀⠀tshirt_sr__05771
 
Last edited:
A huge day in NR2003. Super happy to see the initial release, we're essentially able to cut out having to use 3DS MAX 8 for modding in NR2003 thanks to @Burnout3D WhiteFalcon, and @TShirt expansion with the blender PAS addon.

I look forward to the future and will definitely do a tutorial for the tool in the future.
 
As someone who has tried to get into NR2003 modding, but always got stuck at the 3dsmax process, I'm all ears to see how this works :D

Yeah it will definitely make the modding process easier. One less program to install and also don't have to port models over to 3ds max, it can just stay in your blender project files.
 
Importing 3do's got my attention. That is huge. I take it you read through that 3do PHP and figured out how to convert it to Python? That was giving me a headache when I was trying to figure that out. So glad you did something with that script I made. Thank you for contributing hugely to the modding community.
 
Burnout3D---Well thanks a lot for your initial script as the release of it made me aware of .PAS being text-based files after all. (very important given certain intricacies in 3DO's structure)

So you got me here and I confess: I was not fully alone in "scoring" as a chatbot assisted in the basic syntax conversion. After that I could reasonably quickly compare and improve line by line, and then transfer data to blender API.
 
Try on ver. 2.80 need new 2003_material for this version of blender it start to work.
 
demonic 53---it is all scripted on blender v. 2.92 (a version which could be okay for you it seems)

Generally and barring big internal changes, I'd always try to have scripts running on versions higher than 2.92; however, ultimately I am dependent on others to test any attempt.
(I vaguely recall (~2019?) last big internal change was with v. 2.86 or 2.87)
 
@TShirt think I found new crash (using Blender 5.0.1)

- importing 3do's crashes blender, here's the blender crash stack:

Code:
# Blender 5.0.1, Commit date: 2025-12-15 16:36, Hash a3db93c5b259
bpy.ops.object.delete(use_global=False, confirm=False)  # Operator
Deleted 1 object(s)  # Info
bpy.context.space_data.system_folders_active = 2  # Property
bpy.context.space_data.system_folders_active = 2  # Property

# backtrace
/home/mystical/PROGRAMS/Design/Blender/Blender Versions/5.0.1/blender() [0xfacea0]
/home/mystical/PROGRAMS/Design/Blender/Blender Versions/5.0.1/blender() [0x762df5]
/usr/lib/libc.so.6(+0x44900) [0x7f057a644900]
/home/mystical/PROGRAMS/Design/Blender/Blender Versions/5.0.1/blender() [0x8cd1d7]
/home/mystical/PROGRAMS/Design/Blender/Blender Versions/5.0.1/blender() [0x8cdb0e]
/home/mystical/PROGRAMS/Design/Blender/Blender Versions/5.0.1/blender() [0x19e058b]
/home/mystical/PROGRAMS/Design/Blender/Blender Versions/5.0.1/blender() [0x1903272]
/home/mystical/PROGRAMS/Design/Blender/Blender Versions/5.0.1/blender() [0x1b8a6fa]
/home/mystical/PROGRAMS/Design/Blender/Blender Versions/5.0.1/blender(PyObject_Vectorcall+0x34) [0x66f1894]
/home/mystical/PROGRAMS/Design/Blender/Blender Versions/5.0.1/blender(_PyEval_EvalFrameDefault+0x3805) [0x755a55]
/home/mystical/PROGRAMS/Design/Blender/Blender Versions/5.0.1/blender() [0x67b48a1]
/home/mystical/PROGRAMS/Design/Blender/Blender Versions/5.0.1/blender() [0x1b8b253]
/home/mystical/PROGRAMS/Design/Blender/Blender Versions/5.0.1/blender() [0x1b37934]
/home/mystical/PROGRAMS/Design/Blender/Blender Versions/5.0.1/blender() [0x12cddb9]
/home/mystical/PROGRAMS/Design/Blender/Blender Versions/5.0.1/blender() [0x12d2cdf]
/home/mystical/PROGRAMS/Design/Blender/Blender Versions/5.0.1/blender() [0x12d3a8d]
/home/mystical/PROGRAMS/Design/Blender/Blender Versions/5.0.1/blender() [0x12d4426]
/home/mystical/PROGRAMS/Design/Blender/Blender Versions/5.0.1/blender() [0x12c70d0]
/home/mystical/PROGRAMS/Design/Blender/Blender Versions/5.0.1/blender() [0x6e35e2]
/usr/lib/libc.so.6(+0x27b8b) [0x7f057a627b8b]
/usr/lib/libc.so.6(__libc_start_main+0x8b) [0x7f057a627c4b]
/home/mystical/PROGRAMS/Design/Blender/Blender Versions/5.0.1/blender() [0x75deae]

# Python backtrace
  File "/home/mystical/PROGRAMS/Design/Blender/Blender Versions/5.0.1/portable/scripts/addons/papynr2003/tdo_imp.py", line 1070 in bl_do_nml_b
  File "/home/mystical/PROGRAMS/Design/Blender/Blender Versions/5.0.1/portable/scripts/addons/papynr2003/tdo_imp.py", line 980 in bl_mk_obj
  File "/home/mystical/PROGRAMS/Design/Blender/Blender Versions/5.0.1/portable/scripts/addons/papynr2003/tdo_imp.py", line 884 in get_shape_descriptor
  File "/home/mystical/PROGRAMS/Design/Blender/Blender Versions/5.0.1/portable/scripts/addons/papynr2003/tdo_imp.py", line 213 in grab_class
  File "/home/mystical/PROGRAMS/Design/Blender/Blender Versions/5.0.1/portable/scripts/addons/papynr2003/tdo_imp.py", line 284 in ign_group_descriptor
  File "/home/mystical/PROGRAMS/Design/Blender/Blender Versions/5.0.1/portable/scripts/addons/papynr2003/tdo_imp.py", line 213 in grab_class
  File "/home/mystical/PROGRAMS/Design/Blender/Blender Versions/5.0.1/portable/scripts/addons/papynr2003/tdo_imp.py", line 307 in ign_lod_switch_descriptor
  File "/home/mystical/PROGRAMS/Design/Blender/Blender Versions/5.0.1/portable/scripts/addons/papynr2003/tdo_imp.py", line 213 in grab_class
  File "/home/mystical/PROGRAMS/Design/Blender/Blender Versions/5.0.1/portable/scripts/addons/papynr2003/tdo_imp.py", line 354 in get_state_switch_descriptor
  File "/home/mystical/PROGRAMS/Design/Blender/Blender Versions/5.0.1/portable/scripts/addons/papynr2003/tdo_imp.py", line 213 in grab_class
  File "/home/mystical/PROGRAMS/Design/Blender/Blender Versions/5.0.1/portable/scripts/addons/papynr2003/tdo_imp.py", line 343 in get_state_switch_descriptor
  File "/home/mystical/PROGRAMS/Design/Blender/Blender Versions/5.0.1/portable/scripts/addons/papynr2003/tdo_imp.py", line 213 in grab_class
  File "/home/mystical/PROGRAMS/Design/Blender/Blender Versions/5.0.1/portable/scripts/addons/papynr2003/tdo_imp.py", line 349 in get_state_switch_descriptor
  File "/home/mystical/PROGRAMS/Design/Blender/Blender Versions/5.0.1/portable/scripts/addons/papynr2003/tdo_imp.py", line 213 in grab_class
  File "/home/mystical/PROGRAMS/Design/Blender/Blender Versions/5.0.1/portable/scripts/addons/papynr2003/tdo_imp.py", line 177 in the_import
  File "/home/mystical/PROGRAMS/Design/Blender/Blender Versions/5.0.1/portable/scripts/addons/papynr2003/ui_main.py", line 198 in execute
 
Ran into a problem this is the issue I have. The texture part does not work
 

Attachments

  • clp1.jpg
    clp1.jpg
    142.9 KB · Views: 14
Last edited:
demonic 53---that file was output from the old pas exporter, not PapyNR---use new PapyNR from its own menu in 3d viewport, it covers all tasks from material config to pas export
(A) check out how to install blender addons; (B) act the same on PapyNR; (C) activate it (..oh yeah..); (D) check if menu button appears
---(I'll add clarity to the opening comment in pas; currently reads only # Papyrus ASCII Blender PAS Exporter by Burnout3D, C.W.)
 
Won't work on my computer so I just deleted it go find something else
 
Won't work on my computer so I just deleted it go find something else

You should see the tool on the top like this:

1770594828259.png

the plugin works with all recent version of blender, since its python inside blender there shouldn't be any exterior requisites. I'm on Linux for example and it works perfect.

Is there a reason you cannot upgrade to a new blender version? You can have multiple installs of blender on the same pc too. I generally keep a 'stable' version of blender where all my plugins work and won't move to a new blender version until I see they do.

As for other options there isn't another option except 3DS Max 8 and its papy plugin but its very old and can be even more difficult to get working on modern hardware.
 
No it's says it is on this is the version that I have because my video sucks 😞
 

Attachments

  • IMG_20260208_190910.jpg
    IMG_20260208_190910.jpg
    1 MB · Views: 12
Last edited:
You don't open the plugin, open a blank new scene, go to preferences > addons, install the zip file for the pluign then ensure it is checked:

1770602108948.png
 
I say that it's you will need blender version 4.0 or higher to use this . I don't have a good video card so I can't make mods for this game so I'm going to try a different game.
 
I found a new bug with the PapyNR plugin I forwarded to TShirt. It looks like any sharp edges you apply to a mesh is not respected on export. aka: your mesh will appear smooth in NR2003 regardless. I somehow missed this in initial testing but on more complex meshes its more apparent to me now that I'm getting new car mod meshes into the game with this plugin. If anyone sees results that differ please let me know, or if you see same results that will help confirm the issue.

I tested it in both exporting a cube in blender with marked sharp edges in Blender 3.6 LTS and 5.0, then compared a cube that was sharp from 3ds max 8 papy plugin and the pas file looks to be missing extra vertex, face, and normal list lines compared to the 3ds export.

Going into my PAS files via text editor I confirmed the smoothing groups are all default to 1:


Code:
FACE_NORMAL 0: 1 0.10128    -0.63083    0.76929
                VERTEX_NORMAL 0    0.0    -0.63409    0.77326
                VERTEX_NORMAL 49    0.24449    -0.32815    0.91244
                VERTEX_NORMAL 48    -0.0    -0.32816    0.94462
            FACE_NORMAL 1: 1 0.29693    -0.63083    0.71686
                VERTEX_NORMAL 1    0.20013    -0.63409    0.74691
                VERTEX_NORMAL 50    0.47231    -0.32815    0.81807
                VERTEX_NORMAL 49    0.24449    -0.32815    0.91244
            FACE_NORMAL 2: 1 0.47235    -0.63083    0.61558
                VERTEX_NORMAL 2    0.38663    -0.63409    0.66966
                VERTEX_NORMAL 51    0.66795    -0.32815    0.66795
                VERTEX_NORMAL 50    0.47231    -0.32815    0.81807
            FACE_NORMAL 3: 1 0.61558    -0.63083    0.47235
                VERTEX_NORMAL 3    0.54678    -0.63409    0.54678
                VERTEX_NORMAL 52    0.81807    -0.32815    0.47231
                VERTEX_NORMAL 51    0.66795    -0.32815    0.66795
            FACE_NORMAL 4: 1 0.71686    -0.63083    0.29693
                VERTEX_NORMAL 4    0.66966    -0.63409    0.38663
                VERTEX_NORMAL 53    0.91244    -0.32815    0.24449
                VERTEX_NORMAL 52    0.81807    -0.32815    0.47231
            FACE_NORMAL 5: 1 0.76929    -0.63083    0.10128
                VERTEX_NORMAL 5    0.74691    -0.63409    0.20014
                VERTEX_NORMAL 54    0.94463    -0.32815    -0.0
                VERTEX_NORMAL 53    0.91244    -0.32815    0.24449


If I open up a mod I made in 3ds max like my 2020 ICR Mod you can see the smoothing groups use the full 1-32 smoothing groups bitmask in 3ds max (it skips 32 technically a 32nd bit is treated as a "Sign Bit." If the bitmask reaches 2147483648, the compiler might interpret it as a negative number and throw an error.)

Code:
FACE_NORMAL 566: 1073741824 0.20401    0.00000    0.97897
                VERTEX_NORMAL 409    0.20401    0.00000    0.97897
                VERTEX_NORMAL 406    0.36798    0.00000    0.92983
                VERTEX_NORMAL 408    0.20401    0.00000    0.97897
            FACE_NORMAL 567: 1073741824 0.20401    0.00000    0.97897
                VERTEX_NORMAL 409    0.20401    0.00000    0.97897
                VERTEX_NORMAL 403    0.40094    0.00000    0.91610
                VERTEX_NORMAL 406    0.36798    0.00000    0.92983
            FACE_NORMAL 568: 1 -0.21545    -0.96183    0.16871
                VERTEX_NORMAL 398    -0.28852    -0.93602    0.20155
                VERTEX_NORMAL 405    -0.12751    -0.97667    0.17278
                VERTEX_NORMAL 404    -0.26317    -0.93878    0.22233
            FACE_NORMAL 569: 1 -0.03805    -0.98425    0.17264
                VERTEX_NORMAL 405    -0.12751    -0.97667    0.17278
                VERTEX_NORMAL 406    -0.07420    -0.98169    0.17544
                VERTEX_NORMAL 404    -0.26317    -0.93878    0.22233

Long story short you see FACE_NORMAL all shows '1' instead of different numbers like the second black shows a FACE_NORMAL using 1073741824 (smoothing group 31). Essentially all your meshes will all be in group 1 which means they are all smooth all the time. Different groups are used to create the sharpness between them where you define sharp edges on a mesh. You can open your pas files created with the blender papy export to see the same result.
 
Last edited:
Back
Top