Google Summer of Code 2007
This year Inkscape is going to participate, yet again, in Google's Summer of Code (SoC) 2007. Help us come up with some solid places to innovate and push forward.
- Google program information
- Summer of Code Application form
- Inkscape-specific information
Inkscape is a 2D drawing tool. However, very often it is used to draw 3D objects. It would be very cool to have more support from the program for doing that, instead of just drawing everything manually. Nothing too fancy - we're not going to compete with Blender; but even simple things can go a long way. What's listed below is just basic ideas; feel free to develop upon them or offer something entirely different in your proposal.
A 3D box tool would be able to:
- draw a 3D box;
- adjust any of its 3 dimensions by handles and numerically;
- freely move the perspective vanishing point for each dimension;
- switch any dimension from a vanishing point to direction (point in infinity, lines are parallel) and back;
- subdivide or multiply the box to create perspective grids;
- when more than one 3D box is selected and their perspective is compatible, drag their common vanishing points/directions updating all selected boxes;
- 3D-rotate the entire selected 3D box (or several selected 3D boxes if they have a compatible perspective), thus moving all 3 directions/vanishing points in a natural way;
- remember the last-set directions/vanishing points and create new objects in the same perspective, so you can quickly and easily draw an entire 3D scene with many boxes;
In SVG, a 3D box will be represented as a group (svg:g) with a special extension attribute (in inkscape namespace); the group would normally contain the 6 quadrilateral paths representing the sides of the box. Only the 3D box tool would treat this object as a whole; for all other tools it will be just a group, so you can select any of the paths, apply any style to it, delete it, etc. You can of course transform the group or any face in it using Selector or Node tools. At the same time, the 3D tool would still be able to 3D-rotate and 3D-tweak the box while preserving any changed style (but not necessarily preserving transforms or node edits of individual sides) and not restoring deleted sides (e.g. if you don't want to see the hidden sides, simply delete them as objects from the group). The tool must also be able to create "degenerate" boxes - planes and lines represented as boxes with one or two dimensions equal to zero.
In the UI, drawing with this tool creates a box with 4 handles on the box (3 for changing its dimensions and one in the center for dragging it in 3D) and 3 more perspective handles. If some dimension has a vanishing point, its perspective handle is (for example) diamond; if that dimension has infinity vanishing point, the corresponding handle is round (and can adjust only direction from the center). Dragging box handles without Shift moves them in X/Y plane, with Shift in Z. If multiple boxes selected and their perspectives are compatible, the corresponding handles snap together and dragging them affects everything selected.
3D guides can be a helpful addition to the 3D box tool. You would be able to create a new set of 3D guides from any 3D box and then use these guides for drawing with any tool that can snap to guides (e.g. the Pen tool). The guides would use different colors for the three dimensions. Ideally the guides should remember which object they were created from and update when that object's perspective (the set of 3 vanishing points or directions) is edited in the 3D tool.
- Why not improve integration with Blender instead? Because even if Inkscape/Blender integration were much more seamless than now, and even if Blender's UI were much more like Inkscape's, (neither of which is true), it would still suck to have a separate program for such a basic aspect of your drawing as (essentially) objects' shapes.
- Besides, Blender has a different approach to 3D than what I want for Inkscape. In Blender, you shape your objects, position them in a 3D space, and position your point of view in the same space to get some picture. That's fine if what you are interested in is the 3D world. But traditional artists do not work like that. They don't need a 3D world; they need a 2D drawing that gives an impression of 3D. From the times of Leonardo, this means starting with placing your perspective vanishing points/directions and then drawing objects to conform to these. That's the most natural approach for a 2D artist. I don't know if Blender allows you to freely drag the vanishing points at all (and even if it does, it's hardly the default editing mode in it). In Inkscape, that will be the main mode of interaction, very similar to the way all other shapes are edited by dragging their control handles.
- Isn't it the same as Extrude or Perspective tools (e.g. in Corel Draw)? Not quite. Perspective distortion of an arbitrary path is something we very definitely need; extrude is also nice, especially for text headings. But they are both effects that, most often, just add a 3D eyecandy to existing objects. What I envision is a tool for a draftsman, a technical illustrator; something that lets you draw entire scenes in one common perspective easily. The main point of my proposal is, let's do the fundamentals right, before we do any eyecandy. And in the world of 3D, a basic 3D box is as fundamental as you can get. Everything else stems from it or can be defined by it; this tool can be used as a generic "definer" of the perspective. For example, you can:
- take one 3D box, copy its perspective, and paste on other boxes;
- project a path onto a side of the box ("perspective envelope");
- apply the box's perspective and bounds to any object to extrude it;
- tell it to inscribe other 3D primitives (cylinder, cone, pyramid) into a box;
- do "perspective clone tiling": cloning an object to each cell of a 3D grid defined by a box;
- even enable ellipse and other drawing tools to draw in one plane of the currently selected box's perspective.
This is a big and infinitely expandable area. We do not expect any single student to cover all of this in a single summer. You can propose a reasonably useful subset of this functionality as your 2007 GSoC project.
Mentor: Bulia Byak
Live Path Effects
As explained on this wiki page, Live Path Effects allow arbitrary path-changing effects to be applied to any path object. Inkscape will remember the original path before the transformation was applied, so you will be able to remove the effect, chain several effects on the same path, adjust their parameters, etc. All the effects metadata will be stored in Inkscape-only attributes. At the same time, the resulting visible path (with the effects applied) is saved using pure SVG elements and attributes and thus visible to all SVG renderers, thus upholding Inkscape's basic principle of operation: drawings must look exactly the same in Inkscape as in any SVG-compliant renderer.
This approach will allow us to make many of the effects currently implemeted as extensions (in the Effects menu) live and interactive. Path randomization, putting pattern along path, blends, envelopes, various distortions - all these can and should be live path effects, not the clunky, slow, and inconvenient Python scripts. Fortunately, Inkscape architecture makes creating live path effects relatively easy.
To complete this project, a student must implement at least several simple effects, propose and create a basic user interface for applying them to paths (Path Effects tool?). Some of the effects that you could start with are:
- Patterned or "skeletal" strokes: Similar to the "Pattern along path" extension in 0.45, but fully interactive and auto-updating. You can edit the "skeleton" path and the pattern applied to it at any time.
- Filleting (corner rounding) is common in technical drawing. While this is a fairly basic drafting task, it's currently not particularly easy to do in Inkscape except for certain cases such as round cornered rectangles. This effect would apply rounding with a given radius to all or some sharp corners of a path. It should also permit creation of chamfers which are flattened edges at suitable angles.
- Fractalize is currently a Python effect but would make a great live path effect. It can be useful in mapmaking; maps involve lots of irregular shapes - coastlines, forest boundaries, rivers, etc. that could use fractalization with adjustable level. (As an added bonus, this could be implemented so that the level of fractalization depends on zoom, but preserving this behavior outside of Inkscape would require some smart scripting as explained in this paper: Adaptive Level of Detail in SVG.)
Mentor: Aaron Spike
Last year we had a successful project to integrate the SVG online whiteboard capability, called Inkboard, into Inkscape. Unfortunately, it does not work on Windows, so many users are missing out on this capability.
This work may involve formalizing and extending the Inkboard communication protocol and working on the INKBOARD_PEDRO branch)
Inkscape currently has square grids that can be snapped to. Extend this to allow other kinds of grids: Perspective, hex, iso, etc.
This will involve modifying the grid code to support the ability to have multiple kinds of grids, implementing at least 3 new grids, and adding the UI elements to allow users to make use of them.
Requests in tracker: