BIG FEATURES: - Animation editor - Texture paint - Help system - Height map editing - Multiple active views - Multi-document editing - Lighting upgrade (point falloff, spotlights, ambient occlusion, normal mapping, PBR, shadows) - Interactive tutorials - Blender plug-in for stem3D, and/or .blend file I/O - FBX data export - Collision detection TODO: --- (release) - Basic texture painting: Pencil tool that maps from 3D view click and drag to draw on texture image --- - Quick and easy way in UIColorPickerView to select integer hue values (red, yellow, green, cyan, blue, magenta). Clickable tick marks aligned with hue slider? - Redo UI of PropertiesTextureEditRow (reduce button count; hide some options in More... button) - File path editing for non-embedded textures (absolute and relative) - Also applicable to image overlays - During obj export, handle spaces in material and texture names (material partially done in obj, but not mtl) - Current obj handling nonideal; don't squish upper case letters - obj I/O uses strtof and %f; not locale safe; use parseDecimalString() and memnappend_double() instead (also affects Obj3DModelIO) - Add reorder stepper for textures, materials, partitions, etc. --- - Collapse properties/inspector subviews - Image export presets - Create generic preset API as part of uielementcollection and/or document - Select which texture to view in background of MeshEditTextureMapView - Highlight texture seams - Use texture map identifier in partition for texture region packing - Zoom texture map view toward cursor - Item inspector for all three screens: Full list of vertices, faces, bones, pose bones, mesh instances; with ability to inspect and modify properties, select, etc. - Log window for file status message history - Keyboard navigation for menus --- - PBR rendering - Image map texture in ShaderEnvironmentParameters - https://en.wikipedia.org/wiki/Bidirectional_reflectance_distribution_function - Additional texture image formats (compressed? mipmaps?) - Modifier key with insert vertex to also create a face using it - Right click each mesh operation menu item for submenu with "Help" item, which shows a description of how to use it in a help window - When importing mesh geometry (mergeMeshGeometry), give options for importing textures, materials, partitions - Quitting while editing a text field ignores changes if document wasn't already dirty; should unfocus in confirmQuit handler? - Exporting posed/mirrored armature sets wrong bone base orientation; cannot invert pose to recover base orientation. Debug quaternion math and fix. - After reimporting exported pose, mirrored bones don't show when applied to unmirrored model. How to reconcile? - Calculator window improvements - Add something more useful where load button used to be (other outputs, stats, file name? Maybe file name in window title?) - Warn on quit with unsaved formula - Overscroll? (Allow scroll position to go beyond normal range when adjusted, then retract when scrolling away from overscroll direction) - Show some sort of labels to identify inputs - Highlight outputs compatible with input being dragged - Drag from input to output - Different cursor for input rollover - Apply formula to any vector or quaternion - Apply formula operation for selected vertices (position, and attributes?) (also bone, pose bone, mesh instance) - Input bindings (vertex attributes) - To visualize rotations, draw lines of motion, anchored to prominent points on model being rotated - Pose animation editor - Display deformations on pose editor screen - New way of editing deformation display: Pop-up view to assign weights, activate all/deactivate all buttons, presets - Deformation sequencing with keyframes? - Cursor indicating that camera can be moved (scene mesh thumbnail, MeshEditView) - Cursor for clickable geometry rollover (MeshEditView) - Height map mesh type in scene - Command-line tools for inspecting MeshDataBundle (probably in 3dmodelio) - Print vertex format, armature info, material, texture image count, etc. - Add zoom buttons and zoom level display to image export preview - Clicking "Sync ratio" checkbox in image export window after editing width or height feels bad because it causes ratio sync to already happen; somehow interrupt sync if unchecking checkbox? - Cheat sheet: User-editable/orderable list of keyboard shortcuts, mapping from function name to key combination (opposite of keyboard shortcut viewer) - Full list, favorites float to top and are reorderable, show favorites only checkbox - Check math in MeshEdit3DView_viewSelected; why does Quaternion_forwardInverseLevel() need reversed x and y inputs (and why doesn't Quaternion_forwardLevel() work)? - Mode to display bone weight colors - For one selected bone at a time, use weight of that bone for each vertex's color - Mode to display normals as colors - Responsive mouseover states for vector and quaternion controls - Dynamic help text somewhere explaining how to use widgets - Help system: Run local HTTP server and open browser link serving HTML pages? - Multiple active views - Layouts: Single, double both orientations, triple all orientations, quadruple - Split ratios - Further file format support - glTF specularity (KHR_materials_specular) - Check other expected glTF extensions - glTF armatures - glTF deformations - glTF animations (future) - glTF scene I/O - FBX support (https://code.blender.org/2013/08/fbx-binary-file-format-specification/) - Make slice geometry operation correct for concave faces - Add menu item for add/remove armature - Check for operations that require using the mouse, and provide keyboard alternatives - Gamepad support? --- - Use libpng and libjpeg for image export; stb_image's compression is poor - Allow specifying to export an image as JPEG, even if it wasn't imported as one - Controls for JPEG export quality - Lossless JPEG vertical flip for glTF export (see jpegtran.c in libjpeg source) - Shader selection affecting only whether normals are posed or not feels bad; see if a better solution can be found - Less Blenderlike bone appearance - Emphasize joint position more than bone - Multiple different styles in preferences: Current, actual bone, plain stretched cube, plain stretched capsule - Show inclusive mode item in select mode quick menu (need to be able to show check marks in UIPopUpMenu) - Use IOUtilities number formatting for all number fields instead of sprintf/sscanf - floatArithmeticInterpreterCallback in UIUtilities.c - Finish implementing all primitive types for selection tools: Bone, bone endpoint, mesh instance, light - Implement split operation in texture map view, somehow? Runtime tag for face edges that aren't connected? Perturb texture coordinates a tiny bit to break equality? - Pose bone anchor to pivot doesn't rotate correctly; either needs to be removed, or to perform some operations on the bone's base orientation to align - Merging face/edge delete - Interactive tutorials: - Built-in starting file, set of instructions for demonstrating a particular feature or operation - Track features used, with frequency and last used date - Track tutorials viewed - "Show me something I didn't know" and "Show me something I've forgotten" buttons using above tracked data - User profiles --- TEST FEEDBACK: - Tab keypresses after pressing enter on an inspector text field should go to next field instead of changing mesh selection? - Split 3D view (multiple camera angles at once) - Movable split between views (geometry/texture map) - Extrude was unintuitive (up/down motion) - Draw arrows onscreen for all operations showing direction of mouse movement, updating when moved that direction - Some way to snap to pixel boundaries in texture editor - Snap to grid during extrude - Wanted for all operations; snap delta, not resulting position - Vertex selection order for face creation should take more thought; maybe can use surrounding geometry or camera orientation, or choose the order that's most planar (modifier key to override) - Binary operations to subtract one model from another - Toolbar for view modes and stuff - Save recovery file in case of crashes - For translate, rotate, and scale operations, add detach key that splits selected geometry during interactive operation --- - Lasso tool - Some way to visually inspect how each non-triangle face is being triangulated during rendering (show triangulation lines view setting?) - Side panel view mapping out adjacencies to current selection, from selection's perspective (clickable) - Maybe a magnifier view that appears while using GeometryNavigationOverlay - Some way to partially select vertices? Want some sort of proportional editing, somehow - Keyboard geometry navigation for texture map view - Key shortcut remapping - All menu items - Edit/selection operation shortcuts - Adjustable non-positional drag ratios (DRAG_ROTATE_RATIO, etc.) - Axis invert preferences for keyboard camera control - Bone workflow issue: After extruding, usually want to move tail endpoint rather than entire bone, but entire bone is selected - In bone selection mode, flood fill failure message doesn't make sense - Swappable model pieces - Maybe don't need an explicit system for this? However, being able to show a model for reference while working on another would help - Some way to select vertices and blend their color with another color (want to darken an area of different colors without adjusting each one individually) - Second control next to color well that pops up a color blend panel similar to tile editor? Needs its own color selector since no back color exists - Edge subdivide iterates over every face in the model; should only consider set of faces touching selected edges (may be due for full rewrite anyway to allow for multiple divisions) - Hold D key to start subdivide operation, scroll wheel or arrow keys to control division count, release key to commit? - Onscreen controls reminder (mouse/camera controls, mouseover number swap) - Available select modes - Highlighted clickable icons in corner of screen somewhere - Modifier keys that change operation behavior - Flood fill shortcut - Manipulator shortcuts - Face/edge loop modifiers - Visual feedback for mirror clipping on/off, probably also elements shown/hidden - New bevel operation - Work at edge of geometry - Multiple divisions - For edge flow coherence issue, start with one selected edge and walk along it to build a directional chain (looping possible) - Mirror clipping for vertex slide operation (and inflate?) - Edge highlights would be better with some sense of depth; widen the end closer to the camera with some sort of parameters. Same with face highlight edge thickness? Maybe just do it in 3D space? - Maybe also want to represent the angle of faces touching edge (convexity/concavity) - Need quad interpolation for edge highlight with different radius at each end, or a shader that does it a different way - Should texture map view use larger vertex and edge highlights to match geometry view? - Adjustible vertex/edge highlight size in preferences? - Manipulator scale handles? --- - Fog in main shader (have environment parameters but no render implementation) - Handle poses in scene editor - Mesh instance setting in scene editor to show all hidden faces - Scene export (see TODO in SceneEditorScreen_menuItemAction) - Turntable mode on scene and pose screens - Turntable direction setting in image export dialog - Replace detailed PropertiesShaderLightInfoEditRow with inspector panel, which takes the place of InspectorFaceEdgeEditView or InspectorBoneEditView in light select mode - Identify which light is which in PropertiesShaderLightInfoEditRow, show whether it's selected, and select/deselect from panel - Implement select more/less on pose editor screen (and for bone selection on geometry screen, if not already done?) - Update translate operation to have region options like rotate and scale? (Does this even make sense? Axis constraints? Have move-only extrude already) - Some way to freely slide a vertex over its adjacent geometry (like vertex slide but not constrained to edges) - Some sort of topology guide/template for creatures? Place a prebuilt mesh with basic shapes (limbs, torso, head), move handles around to shape, then build details on top of that base geometry. Could also include armature. --- - Multipass rendering for more precise edge index query (render face index in one pass, use as input for second pass to render edges with no depth offset by discriminating based on face index) - Swept selection for circle select - Collision detection (inflate, translate, etc.) - Pose modifications (relax shoulder until hand meets hip, etc.) - Snap objects placed in scene to floors/walls - Scene animation - Timeline control for parameter changes: - Lights - Camera - Poses/pose animations - Mesh instance transforms - Do a fresh query on mouseover geometry element for flood fill instead of using MeshEditGeometryView ivars - SSAO - https://learnopengl.com/Advanced-Lighting/SSAO - http://john-chapman-graphics.blogspot.com/2013/01/ssao-tutorial.html - PBR - https://learnopengl.com/PBR/Theory - Geometric boolean operations - Geometry copy/paste - Angle visualization (along a chain of edges, see how much each vertex bends in a direction?) - Multiple environments in scene editor - Face select mode that includes adjacent face corners - Manual interpolation for anchor to pivot and fit to curve - Some way to perform instantly? Modifier key convention? (Can default also to 1.0 like spherify) - Set defaults for mesh operations (pivot/zero point, axis, etc), for convenient chaining of operations without having to change modes every time - Improve rigging: - Non-pose bone rotation should include options for local and global axis rotation, and probably default to local - Operation to commit pose transformation to armature and/or mesh (is this already implemented?) - Operation to take posed model, apply inverse of pose, preserve ability to reapply pose matching original model (this is mostly already implemented) - Use case: Transform a model that's already posed into an unposed one, retaining the ability to reapply original pose and apply other poses - Vertex bevel - Edge slide/extrude/? axis value target - Some way to aim for a specific reference point during operations other than translate; maybe a guide, maybe anchor/pivot, maybe a typed number? Need to specify which moving part and which stationary part are trying to line up, and along what axis. Probably pivot/anchor, but how to bind one of those to moving part? - Headless mode that can operate on a mesh noninteractively and save the result - Test suite for mesh operations (or maybe just unit tests) --- - Hole punch operation? - Extrude a face inward beyond the other side of geometry, and join it to the other side somehow - Maybe this is just boolean geometric operations? - Handle axis lock for curved edge straighten - Some way to even the spacing of selected vertices (maybe also along a curve?) - This is an edge operation similar to edge slide; for a set of selected edges with shared faces, adjust the distance between pairs of edges to be equal to average of all selected - Add radius to pivot/anchor? - Snap mode during extrude, translate, slide, etc., where when one vertex or edge snaps to a guide, everything else moving matches - Implement snap to grid on scene editor screen - BoxPivotCenter equivalent for 2D translate/rotate/scale operations --- - Texture paint - Use overlay image as stencil - Solid color brushes - Patterns (voronoi and other) (or maybe can be external? Create image with another tool and use as stencil) - Allow numpad camera adjustment during edit operations? - Rotate camera with mouse during all edit operations? (Not currently designed for this, but could change) - Use custom number formatter everywhere %f is used (especially operation status text) - If file dialog for image export is canceled, return to export dialog instead of closing - Color shown normals to match face edge selection - Scene editor - Mouseover and selection rendering - Expand camera angle data structure: Camera angle, environment parameters (lighting), set of hidden meshes, export settings (width/height/multisample), exported file name - Camera splines, with animated export - Remember last used directory for file open dialog on relaunch (also applies to tile editor, audiolab) --- - Animations - Animation editor screen - Create pose from animation frame - Layered poses and animations? (Display multiple at the same time) - Could implement in pose properties panel on MeshEditorScreen - Bug: Scene meshes aren't getting released when scene is unloaded - Edge extrude normal calculation is wonky; planar vertices don't go at a right angle - Operation to automatically create shadow mesh by flattening model (optionally at an angle) and simplifying contour - Companion tool to extrude and soften edge - Armatures - Option to highlight vertices weighted to selected/moused over bones - Circle/rectangle selection - Improve appearance of moused-over bones and bone endpoints - Handle selection of overlapping endpoints for non-connected bones - Toon shader with secondary vertex color for outlines --- - Type numbers for operations that involve subdivision count (loop cut, insert cylinder, insert sphere, eventually bevel) - Reverse order of open dialog and save before closing prompt (also applies to tile editor) - Improve image overlay settings: - Want to be able to size by pixels - Nearest neighbor filtering option (implemented, but save to MeshData; requires format change that's best rolled in with other stuff like material and environment parameters) - Select menu items: Nonplanar faces, non-texture-mapped face edges (all texture coordinates = 0), faces with winding opposite their neighbors, by vertex color - Visual feedback for VectorPositionControl and VectorDirectionControl - Extrude along anchor or pivot normal (is this already implemented?) - Merging vertex/edge/face delete (also listed above) - Parse connectivity for edge slide, and slide all connected edges in same direction relative to each other - Flat list of all vertices and faces somewhere (properties panel?) --- - UV unwrapping - Implementation would be compatible with seam marking; how? Maybe as an extra edge attribute? Separate list of edges stored somewhere? Want more permanent than operation state - Selective unwrap (only affect selected faces) - Display option in texture map view to visualize distortion - Other aspect ratios than 1:1 (later) - TextureManager may dispose texture when changing, and immediately recreate when undo node is created; check and reorder if true - Texture leak found while investigating: Load texture 1, load texture 2, undo, load texture 3; texture 2 is never disposed because undo doesn't change its reference count beyond UndoStateDelta's own retain - Better interactive vertex placement tool; choose edge to add to and create faces automatically, with snapping preview - Subwindow positions should adjust for main window size (move up and right in fullscreen and they're off the edge in windowed mode; temporary fix to clamp to max drag bounds on show) --- - Camera angle thumbnails in properties panel - Show snap grid - Guides in texture map view - Edge, face, and face edge select for MeshEditSelectionTool_rectangle - RenderTarget with depth attachment and uint32 readback for face selection with selection tools - Zoom to mouse position in texture map editor view - Press numpad period to focus on selection in texture map editor view - Edge hit detection/selection for texture map editor view (pair of face edge pairs) - Multiple texture maps - Vertex format editor window - Bug: Tab keypress when editing attribute name goes through to geometry view behind window - Specify mapping between MeshEditData format and display format (translation object? ex. might have multiple color fields, or want to display bone weight as color) - Bevel vertex - Bug: Bevel edge copies the wrong set of edge attributes for added faces in some situations (try coloring 3 cube faces differently and beveling 2 of those edges) --- - Smooth operation - Smoothing subdivide? - Something to reference when implementing scenes: https://docs.godotengine.org/en/stable/contributing/development/file_formats/tscn.html - User-defined color palette --- - Improve overlay image UI - Number label (index in array) (also applicable to guides and grid window) - Collapse ImageOverlayRows? Only edit parameters of one at a time? (also applicable to guides and grid window) - Show file path - Allow embedding - Export button - Optional interpolation animations for edit operations (texture packing might be especially fun) - Status message display in split mode is confusing; should have just one status message? Updating one view reset the other? Also text doesn't fit well; may want word wrapping - Text outline for visibility on white backgrounds - Highlight entire moused over texture map region while holding alt instead of just face - Interpolate camera movement from changing view angle - Test and handle self-intersecting loop cuts - Handle trying to solidify an already-solid face - Allow toggling guide/grid snapping during translate operation (key event to use menu item currently doesn't go through due to MeshEditOperation getting all keyDown events) - Subdivision count > 1 (some UI and/or keybinds to control number after starting subdivide operation) - Edge slide needs different behavior; move edges in same direction relative to each other in connected regions (how? Follow edge loop and note handedness, choosing matching target handedness when possible?) - Change parameters of single step edit operation after application - Edit alpha for color attributes in face edge inspector using color picker pop-up (facility for premultiplied alpha?) --- - Copy/paste for attribute numbers, entire attribute list - Copy/paste for geometry - Alternate menu item display while holding modifier key (merge vertices with shift or alt held; requires UIMenuBar support) - Normal display mode that shows only face normals originating from their midpoint - More visible vertex selection (quad with outline? Two points with different sizes?) - Point sprite? - Improve visual for selected face edges (make less sensitive to nonplanarity) - Pick apart selection in inspector (list all face edges, highlight as rolled over, select single) - Some way to control pivot point for scale and rotate operations - Alternate means of rendering lines than GL_LINES (glLineWidth doesn't work everywhere) - Lighting options (directional?) - Show camera pivot point, and move manually - Inspect/copy/paste camera transform - Save camera positions and orientations for later restore - Align camera to plane of selected face - Alternating background colors to separate attributes in inspector panel --- - Tab between InspectorVertexEditView and InspectorFaceEdgeEditView fields - List of key bindings (and preferences for changing) - Adjust normalRenderable normal scale - Scroll wheel zooms in more than it zooms out, due to relativity with current camera zoom level - Pivot/anchor points: - Anchor to pivot for texture map - Pivot constraint for textureTranslate (doesn't currently have feature parity with translate) --- - Check texture reference system for leaks - Shell_setDrawThrottleRate() seems to sometimes be getting stuck at 30 FPS; why? Change to refresh rate * 2? Preference? (temporarily doubled) - Preferences: - Default attribute assignment behavior (median/overwrite) - Key bindings - Check all default key bindings on all platforms to check for system shortcut conflicts - Hit detect radius - Camera sensitivity - EQUAL_COMPONENT_THRESHOLD - Background color - Multiple views (use cases: different camera angles; different poses; different texture/color/lighting configurations) - Command line model export utility (MeshEditData -> MeshData; installed) - Try out workflow of importing models and animations into Unity, Unreal, Godot, Three.js Cutting room floor: - Lock partition, disallowing changes (how? Functions that filters out selected items inside a locked partition? What does this do to vertices shared by faces in another partition? Maybe better to just hide a partition's faces to prevent changes) Help/tutorial system: - Important concepts to introduce early: - How to move camera - How to switch select modes - How to insert geometry - Important concepts to introduce later: - Pivot and anchor - Arrow key mesh selection - Miscellaneous: - Texture map view: - How to use merge operation - How to split (alt-G) - Interactive in-application tutorial showing how to model an object Ideas: - Componentize portions of model. Example: Mark a wrist boundary, and model hand with connections to those vertices as a completely separate object, potentially in a different orientation. Interchangeable alternate versions of components. - Using an image overlay, assign a perspective and a 3D shape, and then unwrap the image or rewrap another flat image to fit in perspective - Might be able to recover perspective from image with some number of lines labeled with an axis; as few as any two parallel and any two perpendicular? - Selection queries: Search for and select all geometry with a specified property (examples: color = red; texture coordinate within specified range; face edge with specified normal type) - Nonplanar faces - Unconnected vertices - Faces with zero area - Vertices with same position - Face edges with same position - Mark a line between two vertices, choose another line or fixed axis, and transform selection to align marked edge - Could tie to guide system; insert guide at location, then align selection to guide - UV remapping: Using one set of texture coordinates and a texture, render to a new texture with a new mapping to approximately keep texels the same circle_outline.png: circlegen -w 64 -h 64 -t 8 -k 2 -s 16 -rgba circle_outline_small.png: circlegen -w 32 -h 32 -t 8 -k 2 -s 16 -rgba circle.png: circlegen -w 32 -h 32 -k 2 -s 16 -rgba