Jump to content

Josh

Staff
  • Posts

    23,058
  • Joined

  • Last visited

Everything posted by Josh

  1. I'm using zlib / minizip. There's a lot of details. Zip files aren't actually designed to allow deletion of a single file. You can only create a new archive, and copy every existing file into the new archive, minus the one you wanted to delete.
  2. I don't have a release date in mind yet. Most of the work is being done on the asset browser / asset editor interfaces. This is necessary because: Ultra imports and exports many file formats and supports a plugin system. Ultra supports packages, not just for the finished game, but can save and edit packages as you are developing the game. The package system also works with plugins, which makes the engine useful for modding as well. Given the scriptable nature of the new editor, I have to go more carefully and try to anticipate the ways people will try to use it, as best as I can. Ultra Engine early access is currently available on a subscription at $7.99 / mo. I don't plan raise that price for active plans if the price goes up at the final release. There are currently a few people who are paying $1.99 because their subscription carried over from Ultra App Kit, and their willingness to take a chance on the subscription model was very helpful in getting this all set up. I do not know if the price will go up at all at the final release. $9.99 is a nice round number that still seems small, but $7.99 comes in at just under $99 / year, which is also a nice place to be. It probably depends on whether I am comparing it to a $99 annual option, and whether I would prefer to nudge people towards monthly or annual. Right now I actually prefer monthly because I can see steady daily sales and it removes a lot of fear and uncertainty from my life. However, I do not like to make promises about future plans because changing conditions sometimes require a change in actions, so it does not make sense to lock myself in with promises when I don't know what the future holds. Here are a few things that could happen: I might have to adjust the price for future inflation, if it becomes significant. There could be a technical problem that requires me to change the pricing for all plans at once. This has not happened yet, and I don't know how it would, but anything is possible. Some possibility comes up to significantly improve what I am delivering to you, if I raise prices and use the extra funds for some purpose. Everyone complained when Netflix raised their price from $9.99 to $14.99, but it allowed them to add better content to their service. No one is asking now to go back to pay $9.99 a month so they can only watch bad foreign indie movies. I don't plan for any of that to happen, and I don't think it will, but those are some possible hypothetical scenarios I can imagine.
  3. This happens to me when I am working too much / too hard. Some of my biggest wastes of time were when I was in crunch mode and I went in a wrong direction. You might also want to check out the cubesphere shape: https://www.ultraengine.com/learn/CreateCubeSphere?lang=cpp
  4. The last major stepping stone to work out will be to figure out how file saving in packages is supposed to work. I think having that will be extremely useful though, especially for people making mods for other games.
  5. Did you get this from Steam?
  6. So currently this is a design decision, not a bug. As long as I say this is the way it is supposed to be, it it not a bug. If I say that color should affect images, then there is a bug on Linux, which can't really be fixed due to the limitations of the platform.
  7. So it would be something like Pixmap::Invalidate() or Refresh()?
  8. There is a pixels member that is a buffer. You can use Buffer::Poke to set all the pixel data at once. Or maybe even better, just use Pixmap->pixels->Data() to get the memory pointer and use that for whatever functions is writing to a block of memory.
  9. This is da wey const EventId EVENT_TEST1 = ALLOCEVENTID; void main(int argc, const char* argv[]) { int i = 3; switch (i) { case EVENT_TEST1: break; } EmitEvent(EVENT_TEST1); Print(EVENT_TEST1); Print(EVENT_TEST1); }
  10. I have not run your example yet but I think I know what you are referring to. For some reason I had this commented out in the source in WritePixel...
  11. If I break off the asset browser and asset manager, that might be a decent standalone app that can be released first, before the full editor. That would allow me to get a visual tool out to the people faster, and get started testing it sooner.
  12. Wait, so what is doing rhe rendering to the pixmap? GDI, or does Scintillia have that capability built into it?
  13. I'm doing the same thing for 3D rendering viewports. It works very well, but the pixmap approach you are showing here is very cool.
  14. This shows how an extension can be written that adds custom data to models and other asset files.
  15. I use these for my own programs and they are continually being improved. Go crazy: https://github.com/UltraEngine/Extras/tree/main/Code/C%2B%2B/CustomWidgets These types of things are not built into the default widget set because the behavior of these is not as well-defined as the basic widgets, and different applications may need different features. If the basic widgets are the building blocks, then these are examples of cool things you can make with them.
  16. You can use an enum like this. The only problem is you have to cast your own custom events to the EventId enum. I don't know how to make it so CustomEventId gets automatically cast to EventId: enum CustomEventId { EVENT_RENDER = ALLOCEVENTID, EVENT_PROGRAMSTART = ALLOCEVENTID, EVENT_CONSOLEEXECUTE = ALLOCEVENTID, EVENT_THUMBNAILLOADED = ALLOCEVENTID, EVENT_OBJECTTEMPLATESELECT = ALLOCEVENTID, EVENT_RESETLAYOUT = ALLOCEVENTID };
  17. Ha...this actually increments the value each time it appears in the code. This needs modification to work right... #define EVENT_TEST ALLOCEVENTID void main(int argc, const char* argv[]) { Print(String(EVENT_TEST)); Print(String(EVENT_TEST)); return; } Prints: 10001 10002
  18. Lots of model stats. Some of this is good for quickly spotting problems. For example, if you see a model that uses 100 meshes you probably want to optimize that.
  19. I will add sliders. Right now I am trying to get the basic structure down. Now using a property grid in the side panel. This lets me fit more stuff into the interface, and it also will make it easy to add new functionality with an extension. For example, you could add a "Quake Texture" group for files loaded from a Quake WAD package, and add special Quake-specific properties to be edited there.
  20. Yeah, the problem is that only enums and defines can be used in switch statements, and even if you use if/else if you also an ugly situation before event IDs are initialized.
  21. This will assign new event Ids at compile time. This avoids the unpleasant situation where you need to assign the value of an event Id at startup, while still ensuring each ID is unique: #define ALLOCEVENTID EventId(10001 + __COUNTER__) #define EVENT_TEST1 ALLOCEVENTID #define EVENT_TEST2 ALLOCEVENTID You can use ALLOCEVENTID anywhere, across different files, so you don't need to worry about making sure your custom event IDs are all different. The Event Ids above can be used in switch statements since they are constant.
  22. I've got embedded assets displaying now. You can open a material or texture that is packed into a model file, view, and modify it. glTF and OBJ supports embedded materials, glTF supports embedded textures, and there are some other obscure formats like Quake MDL that do this as well. Embedded files show their name in square brackets and link back to the file they are embedded in. You can use this to modify materials embedded in a glTF, or use it to extract materials and textures from a model and save them as a standalone file.
×
×
  • Create New...