SP4CEBAR 2023-01-25 10:12 (Edited)
Thanks to @nathanielbabiak for compressing the Utah Teapot OBJ file so that the NX program is below 128 Kilobytes and can be posted
The Utah teapot file is way bigger than I thought it would be
I loaded the teapot with the string trick, but that made the NX project like 450 Kilobytes in size, so I had to cut most data out to be able to post it (an the NX file may not exceed 128Kb). So there are no faces for now, so it won't draw anything. I could try to reduce the complexity of the file in Blender
I can't rotate it yet so it may not be clear from whatever angle this is, it looks like the handle of the teapot is right and the nozzle, or whatever it's called, is left
nathanielbabiak 2023-01-25 15:41
This is incredibly cool and very promising! But right now it stops loading at 1900 or so... can you fix it so that the screenshot loads?
SP4CEBAR 2023-01-25 19:15 (Edited)
I can only upload 128Kb to here, so I removed most of the file, there are no faces left so it can't draw anything, I need a smaller file so I probably need to reduce the number of vertices it in blender
McPepic 2023-01-25 19:21
I did some tests on the program to find out where it was getting hung up. When 'COUNT' is 1919 and 'I' is 58280, the program gets stuck in the loop after 'WORD$=""'. At this point, READ_TEXT will continue to return ascii character 0, which is null. I hope this helps @SP4CEBAR!
SP4CEBAR 2023-01-25 19:24 (Edited)
@McPepic, thanks for the effort, the truth is... I broke it on purpose: the teapot file is incomplete, I removed most of it to be able to post it here (there's a 128Kb limit)
SP4CEBAR 2023-01-25 19:30 (Edited)
If you want to complete the file for yourself, you can go to this online hex converter, untick both boxes, upload any OBJ file to convert it to hex, and copy the hex data to the big hex string in my program (inside the subprogram called LOAD_DATA)
nathanielbabiak 2023-01-26 01:14 (Edited)
What obj file are you using? One available online?
This one's smaller than Utah's.
SP4CEBAR 2023-01-26 09:06 (Edited)
@nathanielbabiak yes... I found it again: (this URL downloads the file instantly) https://graphics.stanford.edu/courses/cs148-10-summer/as3/code/as3/teapot.obj
SP4CEBAR 2023-01-26 10:13 (Edited)
If it doesn't appear right you can search for "X=VERTEX(0)+6" in my program to change the X,Y, and Z offsets (in this case the X offset is "+6") I should put this into the matrix at some point
If you want to rotate it, you need to search for "CALL ROTX_MATRIX(M(), 0.6*PI, 2)" and uncomment it, it has two parameters: the first one is the angle to rotate, and the second one is the dimension: 0 (rotate around x), 1 (rotate around y), or 2 (rotate around z), it may not rotate the direction you think it should rotate, and the starting direction (A=0) may not be where you think it is, (I may have put the sine, cosine, and -sine, and another cosine in the wrong order) but it will rotate just fine
I updated the program to add the rotation logic
GAMELEGEND 2023-01-26 13:09
I got a model of a dragon, and it made the file 23,094 KB XD
SP4CEBAR 2023-01-26 16:26 (Edited)
@gamelegend You can try to load it, you won't be able to post it, but it should work (the program uses the infinite memory in a string trick)
Also, it may be scaled too big, coordinates in the thousands are probably not seen by the camera
GAMELEGEND 2023-01-26 16:49 (Edited)
I got an index out of bounds error.
nathanielbabiak 2023-01-26 19:47 (Edited)
I've taken the teapot dataset and organized all the values. The attachment on this post does a few things described below, ultimately allowing the full dataset to be uploaded in 120 kB. You'll have 8 kB remaining for code.
For the vertices, each coordinate is now represented as a fixed-point 16-bit value (neither a float nor an integer). The min and max values are -4.00000 and +3.99988. (If you look at the hex dump, interpreting those values as signed integers, it'd be -32768 and +32767. These are "special" values you might find familiar.) This allows each XYZ point to be represented as twelve hex digits (rather than approx. 60).
For the faces, each index is now represented as a unsigned 16-bit integer. This allows each triple to be represented as twelve hex digits (rather than approx. 30).
The downside of this approach is: loading native obj files (ASCII) won't be possible unless they're "organized" into this format. I used Excel to do it. But, since obj files are already too large to load, it's kind'a moot, right?
Anyway, could you incorporate into your original post, or help me understand where I should look in your code to do that? You just need to set your global array of points and faces where I've indicated in the attached comments. It'd be like 100 times faster if you did than me, since you're more familiar with how to do it...
SP4CEBAR 2023-01-26 21:29
@gamelegend, I didn't think about that, the array sizes are tuned for the teapot, so you could just search for DIM, and replace every big number with an even bigger number
SP4CEBAR 2023-01-26 21:31
@nathanielbabiak, thank you, I'll look into it, and organize and document my code a bit
SP4CEBAR 2023-01-26 22:28 (Edited)
Done, the smaller file size made it much faster
SP4CEBAR 2023-01-26 22:36 (Edited)
Here's a version with filled triangles, the triangles seem to shoot out a bit too much, maybe the pixels need to be clamped (relatively flat lines make inaccuracies of the line direction value noticeable)
SP4CEBAR 2023-01-26 23:16
Points look way better than lines
McPepic 2023-01-27 00:00
Cool stuff! Are there any plans to write a converter in order to use other models?
nathanielbabiak 2023-01-27 01:44 (Edited)
McPepic, not easily. If Spacebar makes a console tool (he's already written an obj file reader), it would be limited to 5461 entries (combined total of vertices and faces). (Each vertex or face would take 6 bytes, it'd be just below the 32 kB limit.) From a quick Google search, there does not appear to be an easy way to change the triangle mesh size unless you have a 3D modeling program.
The organization still requires use of the infinite memory trick, which cannot be edited with a console "tool". You can use Excel, Google Sheets, Open Office, or Libre Office to do it though! Here's how to do it. Vertices are first, then faces:
#1. Import the obj. file into the spreadsheet software, three rows (one per dimension) and many columns (one per vertex/face). Separate the vertex and face data into separate spreadsheets.
#2. (This step ensures there won't be a data overflow error in the next step.)
Determine the min/max coordinate of each axis (using the MIN and MAX functions).
The teapot's values are -3.000 to 3.434 among all axes. Ensure the values are within the range of -3.99999 to +3.99999. If any are out-of-range, either delete those points or normalize all the data (i.e., divide everything consistently by a scaling factor).
#3. (This step converts from floating point to fixed point, it'll show up as integers.) Create a new table with the formula ROUND(X*8192,0) and do the same for Y and Z columns. Round to zero decimal places.
#4. (This step encodes integer data.) Create a new table with the formula =HEX(X,4) and do the same for the Y and Z columns. Ensure every value gets four hex digits. Create another new table, this time only one column wide, and concatenate the hex digits of each vertex dimension, use the formula =X&Y&Z.
#5. Copy-paste the table into your preferred console source code text editor, then delete the carriage returns at the end of every line to concatenate all the vertices into one long string. Now you've got the hex data!
#6. Take note of the number of vertices and faces, you'll need to plug these numbers in also. (The organized format doesn't track those two values in hex code, it becomes part of the console source code.)
You can repeat the steps above for the faces. But, since the faces are already integers (not floating point), skip steps #2 and #3 since this data will be encoded directly as integers in step #4.
McPepic 2023-01-27 01:57
I realize that you can't use a tool in NX to convert the .obj.
I was thinking that it would be possible to program a converter in a separate programming language that would output the formatted data.
I was thinking of trying for myself to get a tool like that working and wanted to make sure no one else was doing it already.
nathanielbabiak 2023-01-27 02:00
I've been editing my response. Re-read the intro, it's possible but limited.
To your point, yes, it's not a really bad set of steps to follow... Good luck! :-)
SP4CEBAR 2023-01-27 09:17 (Edited)
You can make a tool that does it, you just can't post it with the original teapot file due to the 128KB limit, edit: oh wait, there's no easy way to output the file, you have to do it with one disk at a time
SP4CEBAR 2023-01-27 09:56
@nathanielbabiak To make an NX program for the conversion I interpreted your steps like this:
2. IF VALUE>=-3.99999 AND VALUE<=3.99999 THEN
3. VALUE=INT(VALUE*8192 +0.5)
5. the program has already filtered the line breaks out
6. It just needs to store the loop iteration value when it's done
SP4CEBAR 2023-01-27 10:13 (Edited)
v$=v$+value$ gets slower over time, so I use mid$(v$,count*4,4)=value$ instead, in the beginning v$ is loaded with 10000 spaces:
SP4CEBAR 2023-01-27 10:27
@mcpepic thanks for the testing you did in this post, I just fixed it and it will now terminate the loop when there's no more data to read
SP4CEBAR 2023-01-27 10:48
My converter made data that looks like this:
Instead of this:
SP4CEBAR 2023-01-27 10:55 (Edited)
It looks like this is caused by the order of POKEW, because PEEKW is able to reconstruct the data
now I see it: If the first set is AABBAABBAABB, the second set is BBAABBAABBAA (in the previous post)
SP4CEBAR 2023-01-27 11:22 (Edited)
It now looks like this:
Which has some rounding errors compared to this:
Interestingly the previous attempt didn't have these rounding errors:
SP4CEBAR 2023-01-27 11:36
Running V=VV AND $FFFF before splitting the value into bytes fixed it
SP4CEBAR 2023-01-27 11:57
@nathanielbabiak you don't need to manually define the sizes, this also works: