• Content count

  • Joined

  • Last visited

  • Days Won


Krycztij last won the day on September 20 2015

Krycztij had the most liked content!

Community Reputation

2 Neutral

About Krycztij

  • Rank
  • Birthday 09/05/1981
  1. Could this be a multi-GPU issue? E.g. the main GPU offloading to the integrated GPU for power saving or due to a driver error?
  2. No time either. I was holding my breath in hope for some simple patterns to emerge … now I guess this will require disassembly
  3. Is there a way to find out all values without flying to these points in the game? If I had a table with all 400×400 actual indices, I could compare that to the raw indices and pattern matching could be as easy as looking at the diff image.
  4. Happy New Year everybody!
  5. While you’re editing: In TFXplorer.cpp (1807), replace if(supershapesToRasterize) { with if(supershapesToRasterize) { // Draw one quad per tile in ground color (160 in TFX 3 palette). This is a quick-and-dirty solution to transparent ground // in TFX 1 levels. auto const y000 = floatx4Zero() - x000From(yInTFXUnits(eyePoint)); auto toNextJob = supershapesToRasterize.toBeginning; auto index = 0; do { // From XZ and Y, interleave XYZ: Geo::XYZ_float_reg eyeSpaceOffset = { interleavedXY(load(toNextJob->offsetFromEye).xy__, y000) }; auto const objectToEye = preTranslated(eyeSpaceOffset, worldToEye); auto const a = Geo::transformed(Geo::xyzFrom(-1024.0f, 32.0f, -1024.0f), objectToEye); auto const b = Geo::transformed(Geo::xyzFrom(-1024.0f, 32.0f, 1024.0f), objectToEye); auto const c = Geo::transformed(Geo::xyzFrom( 1024.0f, 32.0f, 1024.0f), objectToEye); auto const d = Geo::transformed(Geo::xyzFrom( 1024.0f, 32.0f, -1024.0f), objectToEye); rasterizeFlatShadedTriangle(myRasterizer.tfx, a, b, c, 160); nextVertex(myRasterizer.tfx, d, 160); if(0 == index % 512) { myRasterizer.tfx.flushCommandList(); // prevent overruns } } while(++index, ++toNextJob < supershapesToRasterize.toEnd); myRasterizer.tfx.flushCommandList(); Which really is a big waste of CPU time with TFX 2 and TFX 3, but it looks so incredibly good with TFX 1 …
  6. The cloud files should load with the above fixes. At least they shouldn’t crash TFXplorer any more. Thanks a lot for sorting out the whole stuff. I just checked out Libya in-game, and you did a fantastic job with it! Regarding the missing run-way numbers … I found them: Look a kilometer away! (Probably a transformation opcode has different meanings in TFX 1 & 3, or variables are initialized differently.)
  7. Investigating a different crash. Mike, how many LODs does 3\CLOUD2.3 have? In TFX Shape.cpp (691), please replace UCount const numberOfLODs = 1; while(0x0000 != *toWord && 0x7FFF != *toWord && Shape::maximalNumberOfLODs > numberOfLODs) { with while(0x0000 != *toWord && 0x7FFF != *toWord && toEndOfLODs < toCapacityEndOf(lods)) { Because I hard-coded a limit of 4 LODs (TFX 2 and TFX 3 never use more) and the buffer runs over with said file. Furthermore, in TFX Supershape.cpp (451), replace case 0x0014: case 0x001A: case 0x001B: case 0x004A: { with case 0x004A: { if(6 > sizeOf(block)) { return "file too short"; } struct OffsetObject { UInt2B shapeIndex; UInt2B positionIndex; UInt2B twentyOne; }; auto const & information = read<OffsetObject>(block); if(header.numberOfShapes <= information.shapeIndex) { return "block 4 pointer 1 opcode 004a: bad shape index"; } if(header.numberOfPositions <= information.positionIndex) { return "block 4 pointer 1 opcode 004a: bad position index"; } auto & shape = block6.shapes[information.shapeIndex]; auto & newObject = *shapes.toEnd++; newObject.indexInShapeList = shape.indexInShapeList; newObject.scale = shape.scale; newObject.yaw = shape.yaw; newObject.pitch = shape.pitch; newObject.roll = shape.roll; = block3[information.positionIndex]; } goto readNext; case 0x0014: case 0x001A: case 0x001B: { which is an ugly copy-paste solution from the block above, but it should work for now
  8. Yes, I meant the origin, not the center. ThreeView SupershapeSession.cpp (83): Replace with auto const worldToEye = computeWorldToEye(); Replace the call in line 91 with: supershape.prepareEntireRasterization( shapeRasterizeJobs.toEnd, timeOfDay, zeroParameters, rotationOf(worldToEye), 1.0f, transformed(offsetOf(worldToEye), transposed(rotationOf(worldToEye))) );
  9. Oh, that’s a mean one. We ran out of stack space (it doesn’t grow infinitely). Right-click 3View -> Properties -> Linker -> System -> Stack Reserve Size -> enter 2000000 I think that fix is already done in the 32-bit versions, but since I never distributed a 64-bit version of 3View, I missed that one. There are other issues as well; I’m checking them now. Update: Two more crashes: Go to TFX Supershape.cpp (1456) and change the initial value of “greatestDistance” from 0.0f to -1.0f. Do the same in line 1553. Otherwise, while sorting the shapes by distance for rendering, no closest shape would ever be chosen if the viewer is exactly at the center. And that’s the next issue: For some reason, you’re always placed in the center. I’m at it.
  10. In the Solution Explorer, right-click 3View and select “Set as Startup Project”. Very interesting to hear about the unknown TMs. I was looking for anything that could be a texture list in the unknown files, but my search turned out empty. Whatever you find in that direction, tell me and I can implement it in 3View/TFXplorer. Please tell me the name of the SSD that doesn’t load with the current version and I’ll investigate …
  11. Fantastic! In case you have problems with the format conversion: You can copy a SPR image via Lean Viewer, then paste it into an image manipulation program of your choice. This destroys the palette, though (I can work around this if it’s a matter). Due to time restrictions, I always only implemented the bare minimum to get the original game working. I have to work my way through the other files. Please give me a list of the most urgent cases so I can prioritize. I need to take a look in the debugger (too long ago to have an idea right away).
  12. Oh, the “ground is drawn via background color” approach. I know this one from the first Ace Combat. This will take me some time because the ground does not always fill the screen up to the horizon. BTW you can display 3View’s run-time interpretation of the bytecode by hitting F12 (or was it F10/F11?) and looking at the console window.
  13. For next steps, I suggest: identify tiles with missing pieces (no ground etc.) identify the according .3 shapes analyze their instruction sequence via 3View enhance the renderer to handle the missing pieces enjoy full-quality TFX 1 terrains Mike, this is incredible work. Just incredible!
  14. Sneak peek: It would be great if you tried your own decoding approach and compared it to my results. It might be possible that I have missed half of the bytes and just don't find the error in my own code … P.S.: Updated for correct color palette display. Right now I'm limiting the number of frames to 64 in order to avoid false positives with other file types. Now I find some files that contain entire alphanumeric fonts. I should probably lift the limit to 128.
  15. FWSEXPL.SPR, last frame, 3300 B, 30×55. My above algorithm generates a 60×55 (3,300 pixels) image from it, and I think it also picks 3,300 different bytes for that, so that fits well. Honestly I don't know why they stored half the width in the file. It could be because they used the format for larger images (maps; animations?) and tried to avoid overflowing the 0…255 range for each dimension. I'll try the TFX palette now.