4.2.2 Stable (3/17/08) net.jinx.video.model.MeshElement has a new method toLineElement(float); this allows you to convert any polygonal MeshElement into a Lines instance net.jinx.video.model.LineElement is now an abstract class instead of an interface; all of the line-based MeshElements are now extensions of it instead of implementations of it; overall lines of code reduced, no reduction in capability net.jinx.video.model.Model has a new method toLineModel(float); this will convert the Model into an uncolored line-based model net.jinx.video.model.Face is now public; you won't be able to instantiate it, but you can use it by getting references from Models or MeshElements; it provides some handy data; I also cleaned up some of the comments for this class New class: net.jinx.video.CartesianOrigin displays a set of three lines starting from the origin and following the three axes; X is red, Y is green, Z is blue New class: net.jinx.video.CartesianGrid displays a cartesian grid system aligned with the three axis planes The default scene is now optionally including either a CartesianOrigin or a CartesianGrid, to give a visible reference to model designers for where their cameras are pointed and for the size of their model Tweaked the default cameras quite a bit, so the new features would be most useful; removed two of the default cameras in the configuration file and modified another for an isometric style view; changed the point of view on all of them so that the axis planes of a CartesianGrid will be visible Updated to newest stable version of JOGL; required some minor tweaks to the build file to include the glugen-rt.jar file in the classpath for compilation and runtime; everything should be backwards compatible with JSR-231 1.0.0 (the previous version I did all testing with) 4.2.1 Stable (3/15/08) Removed some old FIX ME comments that were already taken care of net.jinx.video.multipass.TranslucentPass works a little different now, but is backwards compatible; if requested to, it will collect Translucent Objects and draw them using the Painter's algorithm; look at the API docs and/or source code for more information Fixed a bug in net.jinx.video.processor.ImageSaver; it was producing upside- down images; I feel silly for not having noticed this until now Marked the classes in the net.jinx.video.multipass package Beta Performance tuned net.jinx.video.processor.ImageSaver; it's running a fair bit faster, but I fear this is as fast as it will ever get, at least without using another thread for encoding and/or saving The various primitive 3D object classes, including ColorCube, Plane and Sphere have all been given static methods to produce just the underlying Model Object instead of always operating through the wrapper class Modified the test files for the above to use this, so you can export the resulting Model if desired Renamed Sphere.java in the models directory to Animation.java, renamed SphereTest.java to Sphere.java; there, things make more sense now Fixed a typo in the name of a method in net.jinx.video.model.ModelUtil called randomColoaration; it's now randomColoration; sorry about that Fixed a bug related to calculating vertex normals for a Model composed of both line and non-line MeshElements; it was throwing a NullPointerException when trying to calculate the normals for vertices with no faces I moved one of the models from my personal collection to tge models directory; it's file name is AeroFighter.java 4.2.0 Stable (3/10/08) Typo and comment fixes in places New class: net.jinx.video.model.ImportExportUtil; this class will contain methods for importing and exporting 3rd-party model formats New method in net.jinx.video.model.Model: getMeshElements(); this provides an array of the MeshElements used to construct the Model New method in net.jinx.video.model.Model: getTextureCoordinates(); this returns the texture coordinate array for the Model New Method in net.jinx.video.model.ImportExportUtil: exportWavefrontOBJ(OutputStream,Model); for the first time ever, this allows exporting models to another program; the only MeshElement class this has been rigorously tested with is Triangles; however, I did test that the exporter isn't choking on the others; Line-based MeshElements are exported, but they will not behave the same as they do in Vertex Modeller New Method in net.jinx.video.model.ImportExportUtil: exportPOVRayMesh2(OutputStream,Model); this allows exporting a Model object to a POV-Ray Mesh2; it has only been tested with Triangles MeshElements; all the rest are coded but haven't been used Material has a filled out equals(Object) that only returns true if both Objects are Material instances and their components are all the same Material has a public clone() method as well as a new method called duplicate() with a Material as the return value; either of these makes a complete, deep copy of a Material 4.1.3 Stable (11/10/07) Modified the Modeler class to load model sources from resources when the -resource switch is supplied; this new switch is not documented via the -help switch, as it isn't meant to be used by the average user Made VertexUtil.buildPlane(int,int) method public; it builds a Quads mesh plane with the given amount of detail Added two new classes in the net.jinx.video package: Plane and InfinitePlane; their purpose should be obvious; InfinitePlane looks like crap if there isn't a light at infinte distance (w=0); the same lighting problem can affect SkySphere; now I know why it always looked so bad Changed the default light in the config file to have infinite distance Added getCameraPosition() and setCameraPosition(Vector) to Context; 3D view implementations are now required to set this when they update the view/camera position View2D and View3D are now setting the current view to themselves; changed the way SplitScreenRenderer handles this; altered the comment for Context.setView(View) accordingly Updated SkySphere to use the new camera position bit in Context; this way is far cleaner; no more direct messing with the model view matrix to do the job New class net.jinx.video.VideoUtil; I'll be adding utility methods here in the future; there's already a method called billboardSpherical(Context,Vector) Added a new method to VideoUtil: turnToFace3D(Context,Vector,Vector,Vector); this is the generalized form of billboardSpherical(Context,Vector) 4.1.2 Stable (3/26/07) Fixed a type in one of the javadoc comments of View2D Added a new constructor to Camera based on float arrays; it just type casts to doubles 4.1.1 Stable (3/19/07) Modified the constructor of Sphere; it's producing the normals itself now, instead of using Model.calcNormals(); the new version is faster Sphere has a new method: setSmooth(boolean); this determines if the Sphere should be drawn with face or vertex normals Fixed a bug in Model.setNormals(float[][]); it was throwing a NullPointerException when it shouldn't have; this only happened when setting the normals to null New method: VertexUtil.buildIcosahedron(); builds a unit sized icosahedron New method: VertexUtil.subdivideTriangles(float[][]); subdivides a vertex array for a Triangles object; each triangle becomes 4 smaller triangles; this along with the normalize method and a simple sphere approximation mesh (icosahedrons anyone?) can be used to approximate a higher-detail sphere New method: VertexUtil.normalize(float[][]); normalizes all the vertices in the vertex array New method: VertexUtil.buildOctahedron(); builds a unit sized octahedron New method: VertexUtil.buildTetrahedron(); builds a unit sized tetrahedron New file in the models directory: Icosahedron.java; it's purpose should be obvious, but aside from that, it also tests the subdivision method in VertexUtil 4.1.0 Beta (3/10/07) Updated Animation to use Context.getTimeSource() Added a new package: net.jinx.video.multipass; the classes and interfaces within are used to make multi-pass rendering possible Modified most of the Visible implementations that have children to use the MultipassVisible interface instead of Visible; they check to see if their children are MultipassVisible implementations and then call drawPass(Context,Pass) on them Modified SplitScreenRenderer for multi-pass rendering Made a small adjustment to ModelUtil.loadMeshElement(Hierarchy) to increase speed at the (very slight) expense of memory; this is related to the next entry Deprecated VertexUtil.reduce(float[][]) Rebuilt Model.calcNormals(); the old version was fast with low detail models, but so painfully slow with high detail models that it wasn't worth it; the new version is much faster with high detail models, but slower with the low detail; the old version is commented out Model has a new method: setNormals(float[][]); this allows you to directly set the normal array Model.addMeshElement(MeshElement) method is now setting the normal array to null, indicating that normals should be recalculated, due to the new MeshElement The export format has been altered to contain normal data; the old format is still supported as a fallback; this new way should load models with normals faster, but consumes more disk space Fixed a bug in TextureManager that would cause a crash if you had any textures setup in the config file; this one cropped up with the update to JOGL JSR-231 1.0.0; another of those odd changes they made, only this time related to a ByteBuffer; the old version was reading the raw values from the buffer, while the new version reads from the current buffer position Fixed the texture wrapping bug in TextureManager; my textured spheres look good now; I just had my texture parameters set funny Sphere has been rebuilt to use a Model internally; the APIs are still backwards compatible, but some of the methods are now deprecated; the wonderful news is that performance is higher and you can use Coloration objects on your Spheres, so you get the full color capabilities of Model for free Added a new class: net.jinx.video.SkySphere; this functions as a sphere centered on the camera; turn on two-sidedness for this to render right with regular colorations; you might also wish to consider emmisive or ambient materials Added a new class: net.jinx.video.ColorCube; this simply encapsulates the original code from models/ColorCube.java as a class; models/ColorCube.java now returns an instance of this class; the old code is commented out 4.0.0 Alpha (3/3/07) Massive number of API changes due to the update to JOGL JSR-231 1.0.0; I apologize for the inconvenience, but this one was out of my hands Altered the APIs of anything that was handing around GLDrawable objects (Visible, View, View3D, etc.); Context now has utility methods to get the GLContext, GLAutoDrawable, and GL objects; this change should protect you and I from dealing with as much refactoring the next time JOGL changes everything out from under us Changed the createAura(float) method in Model to extrude(float) Removed calcNormals() and vertexCount() from Visible and most of it's implementations (Model kept it); I'm not sure what I was thinking and most of the time I just implemented these with dummy methods 3.3.1 Stable (2/17/07) Added a new static method to Material called interpolate(Material,Material,Material,float); this allows you to easily interpolate between two Materials, storing the result in a third 3.3.0 Stable (2/10/07) Added the math library to the modeler's requirements in preparation for some new methods in VertexUtil Added VertexUtil.rotate(float,float,float); this allows arbitrary rotations of your vertex arrays in three dimensions; enjoy! 3.2.1 Stable (1/20/07) Added a new target to the build file called dist; this builds the jar, API docs and a zip archive for distributing the modeler Added a new pair of methods to Context; setView(View) and getView(); these should allow gathering information about the currently operating view; SplitScreenRenderer is now using these methods View2D has some new methods: getLeft(), getRight(), getBottom() and getTop(); these allow you to determine what's going on with the View after it's been constructed; they're also used internnaly, so overriding them will affect the View Made a few more changes to the build file; the version string being used to name the distribution archive is more in line with the way I've been doing things (manually speaking) Fixed a minor bug in the "--help" command line switch; the JVM wasn't exiting after displaying the help message 3.2.0 Stable (1/13/07) Added a method to VertexUtil called buildSphereMapTexCoord(BufferedImage); this returns an array that can be used as texture coordinates for the results of one of the buildSphereMapMesh methods Made a slight optimization in Model for the case of a Model with texture coordinates, but no texture; Model is no longer sending the coordinates down the OpenGL pipeline for no reason when no texture is used; I got a 28.8% speed boost in this narrow case (on my development hardware) Fixed a Javadoc comment in Model to make it more accurate Altered VertexUtil.buildHeightMapMesh to produce a Quads based mesh instead of a Triangles mesh; the old triangle code is still there in comment form, in case you badly need a triangle mesh; another option is the new quadsToTriangles method (see below) Marked VertexUtil stable Added a method to VertexUtil called buildHeightMapTexCoord(BufferedImage); this returns an array that can be used as texture coordinates for the results of one of the buildSphereMap methods Added a method to VertexUtil called quadsToTriangles(float[][]); this will convert vertex arrays meant for Quads into arrays meant for Triangles Added a method to VertexUtil called quadsToTrianglesTexCoord(float[][], float[][]) that allows the conversion of texture coordinates intended for working with Quads to be used with Triangles Updated the model designing guide with some new tips and hints; I also fixed some typos Sphere now has texturing support; it has some of the same methods as Model for this, but it doesn't allow you to specify texture coordinates; GLU is taking care of that for us Model now has a getTexture() method that returns a String Fixed another possible performance bug for obscure circumstances involving Model and texturing VertexUtil.buildSphere(int,int) has been seriously improved; it's producing almost (rotated a little different) pixel-perfect duplicates of the Sphere class with the same settings and it performs better; WTF?! Apparently, GLU on my system sucks VertexUtil.buildSphereMapMesh has been updated to use the buildSphere method internally, so the resulting height-mapped sphere is much better than it was, but the endcaps are far more sensitive to rapid variations; this is how it should have been all along; just make sure the images you use for height maps vary less towards the top and bottom Added VertexUtil.buildSphereMapMesh(BufferedImage,int,float,float); that last parameter is the new one; it controls polar rolloff; see the API docs for more info; a value of 0.5f is nice for that one; this version allows for much smoother endcaps that feel much more seamless, though if you look hard enough, you can still tell; with a little care in making the image map and a nice texture, it'll cover up real nice Clarified some javadoc comments and fixed more typos in them 3.1.0 Alpha (1/6/07) Added a few javadoc comments here and there Added a new package: net.jinx.video.multimodel; this is used to construct a variable-controlled type New class: net.jinx.video.multimodel.VariableSceneGraph; variable driven SceneGraph-like class; feeds variables to the other classes in the package to control their transformations New class: net.jinx.video.multimodel.Transform; base interface for all transformations New Class: net.jinx.video.multimodel.Translation; translates (moves) the wrapped Visible in 3 dimensions Added a new method to SceneGraph: predraw(Visible); it does nothing, but is there for subclasses to override Added a new method to SceneGraph: iterator() 3.0.0 Alpha (3/10/06) Added some clarification comments to Model's API comments Added a new public method to Model: subDraw(GLDrawable, Context, Coloration, boolean); it allows you to do customized drawing of a Model from outside the Model's methods; this will be handy for some of my future plans involving picking operations VertexUtil now has methods for duplicating vertex arrays and/or copying portions of them Improved the performance of Model.clone() Model now has a createAura(float) method that can be used to create a Model with the same shape, only slightly larger; each vertex in the aura Model will be an exact distance away from it's source vertex; read the API docs for more information Fixed some possible bugs in VertexUtil for cases that most likely would never come up; these were related to the join() methods Removed all motion blur related code; it never worked right anyway, unless you had a hardware accelerated accumulation buffer; this created some incompatibilities, so I've gone to version 3.0.0 Alpha PostProcessor now has init and deinit methods; I realized that to re-implement my motion blur code using textures and a PostProcessor, the ability to allocate a texture for a MotionBlurProcessor is required; I have seen the error of my ways ;-) PostProcessor has been renamed FrameProcessor; I'm planing to use the same interface for both pre and post processors ImageSaver and ScreenShotProcessor have been moved to the package net.jinx.video.processor; they're now both marked Stable, as well Fixed a bug in View2D; it wasn't loading an identity matrix when it should have been Fixed a bug involved in the generation of height mapped spheres Context now carries a net.jinx.timer.TimeSource that functions as the simulation clock; there is a method to get it and one to set it Context now carries a change in time (delta time) value to assist in using the interpolation value that's already there DemoRotator is now using the new time-related attributes in Context; it's also working very smoothly, since this enhancement handed it nanosecond-precision timing as a bonus (it was using the System.currentTimeMillis() method directly, so it was only updating 20 times per second on my system); It is also now using the interpolation attribute; if you want an example of how to do timing correctly under both a stepping clock or a real-time clock, look at DemoRotator's code 2.6.0 Stable (3/3/06) Fixed a Javadoc comment in the Model class Model.storeToHierarchy(Hierarchy) is now setting an attribute called "Normalize" based on whether or not normals have been calculated ModelUtil.loadModel(Hierarchy) will now call calcNormals for the Model if the attribute "Normalize" is true Fixed a Javadoc comment in the TextureManager class Models now carry a name, which can be obtained using the getName() method; it can be set with the setName(String) method; this is stored when a Model is stored in a Hierarchy Added two new methods to ModelUtil; loadModelPack(JarFile, TextureManager) and loadModelPack(File, TextureManager); this should be used after the textures from the main configuration file are loaded Fixed TextureManager to use the new getAttribute(String, URL) method in net.jinx.db.Hierarchy; this reduced the amount of code involved there and should accelerate it Marked PostProcessor stable ModelUtil.loadMeshElement(Hierarchy) now calls VertexUtil.reduce(float[][]) on the vertex array before wrapping it in a MeshElement New method: ModelUtil.loadMeshElement(Hierarchy, boolean); this can be used to control whether or not to reduce the vertex array, if you're concerned about speed rather than memory Fixed a huge bug in the Face class related to the generation of face normals (which indirectly affects vertex normals); it's now possible to build a shape that has two vertices that are identical; this is occasionally desirable for instances of Quads, QuadStrip, TriangleStrip, etc.; doing this will no longer produce totally messed up normals New method: VertexUtil.buildCylinder(int, int) that builds a unit-sized cylinder with however many slices and stacks you input New method: VertexUtil.buildSphere(int, int) that builds a unit-sized sphere with however many slices and stacks you input; it's about half the speed of a GLU or GLUT sphere New method: VertexUtil.buildSphereMapMesh(BufferedImage, int) that you can use to build a height-mapped sphere from an image; it uses the PORTION_* constants to control which portion of the image to use for height values The VertexUtil.buildHeightMapMesh() method is now considered beta; I thought there were performance issues with it, but now realize that I was using a plain Material object with it; see the next comment for more info Modified all MeshElement implementations to function much faster if they have a plain Material coloration; I was completely amazed at the difference this made for models\CylonFighter.java; it went from about 65 FPS to over 300 (with the standard 6 views)! Added Javadoc comments to several methods in Model that were missing them 2.5.0 Stable (11/29/05) Added a new method to VertexUtil; it's used to convert an image height map into a vertex array of triangles; sadly, it produces HUGE numbers of vertices; rendering the results of a 32x32 converted image ran at about eight frames per second, because there were over 5000 vertices; rendering with only a single view, it did 42 frames per second; it just isn't fast enough for my tastes 2.4.0 Stable (11/9/05) Optimized ImageSaver a little; it's now producing image files faster than before; I made the BufferedImage and int array for pixel data persistent; I also optimized the process of turning RGBA pixels into ARGB pixels; I just wish I could get JOGL to produce ARGB directly ImageSaver now defaults to saving images as RGB, not RGBA; there are now constructors to allow setting the output image type (different from format) ImageSaver has some new methods that control whether or not frames are saved There's a new ImageSaver extension called ScreenShotProcessor in the video package that saves screenshots when a configurable key is pressed; Modeler now configures one of these (using the default 'S' key) in lieu of an ImageSaver when one isn't enabled; the configuration data from the "capture" node is used to configure it ImageSaver's constructors now throw a new type of exception called ImageFormatException (in the same package) if the format String doesn't match any of the ones the JVM can write to; it's a subclass of java.lang.IllegalArgumentException; the Modeler class now picks up on this and only displays a list of formats if this exception is thrown ImageSaver will now accept a null format argument; this will cause it to use "png" in place of null ImageSaver now calls glFlush() before it does anything else in the process method; this seems to fix the bug where the first frame saved is always missing one view (on my system) Increased the shine in ModelUtil.colorToMaterial() methods from 32 to 45 in order to give objects slightly more apparent (and hopefully more realistic) specular highlights; I also decreased the amount of white in the specular portion slightly 2.3.0 Stable (11/2/05) Added a couple of methods related to an interpolation value to Context; this will be used by the Action library to pass interpolation values from idle events to the renderer; SplitScreenRenderer now has a method for setting this value Added a method to ModelerGUI called getVersion() that returns a String array; you can use this when implementing a ModelerGUI to provide your own version data I marked everything in the video and model packages stable; I think I'm finally pretty much done with Vertex Modeler; the only thing I see being adding is third-party model import and export; there will likely be some very minor changes and/or bug fixes, too; I've still got lots of work to do on the video package, however Added a new interface called PostProcessor; this interface is used by SplitScreenRenderer to process frames after they have been rendered; this can be used to filter them or to save the rendered frames; the post processing phase takes place after all views have been rendered, but before the frame counter does it's part SplitScreenRenderer has a new method: setPostProcessors(PostProcessor[]) Added a new Class to the video package called ImageSaver; it's a PostProcessor that saves each rendered frame to disk; this significantly slows rendering, since encoding the image takes alot of time Added a new set of options to the configuration file; there's a new node called capture; inside it are options related to saving rendered frames to files Added a new option to the configuration file to control whether or not the window is decorated 2.2.0 Beta (10/31/05) Added a package private class to the video package; DisplayListManager is part of Context and makes it possible to queue a DisplayList for later refreshing, all from a place where refreshing the DisplayList is impossible; the Refresh method will cause the DisplayList to be relisted the next time the renderer's display(GLDrawable) method is called Model now has some circumstances where it will automatically call refresh(); this will happen when the alpha value changes, when you add a MeshElement, or when you activate a Coloration Added a bit to the optimize() methods of Camera; you must now supply a field of view (FOV) angle with it; it now also uses the lookat data for the camera to correctly optimize for looking at that point Modified SegmentColoration to allow Coloration objects other than Material to function properly Altered the MeshElement implementations; they can now use a null Coloration; Model's no-argument constructor now uses a null Coloration and a null Coloration name; in this case, the Model will be colored with the default OpenGL settings; this could be handy for a Model that's meant to be textured but not colored Model.activateColoration will now accept null, which will cause it to use the default OpenGL coloration Added a method called reverseTriangles(float[][]) to VertexUtil; it builds a new vertex array for a Triangles MeshElement from the source array with everything switched from counter-clockwise to clockwise or vice-versa; this can be handy if you build a MeshElement backwards and need to fix it; if this is combined with a scale transformation, you can use it to duplicate portions of a model for other parts of it (before this, it was difficult to transform the bottom of a model on one side to form the top on the same side and I was doing this operation by hand) 2.1.0 Alpha (10/20/05) Fixed the clone() method of Model; it wasn't copying segment names Added the ability to store multiple Coloration objects in a Model; use the addColoration(String, Coloration) and activateColoration(String) methods to manipulate these; setColoration has been re-implemented to add a Coloration called "Default" and then activate it; this allows you to implement as many Colorations for your models as you like Added a new commandline switch: "-select"; it's used to activate a Model's Coloration based on it's name; this is applied just before export, so it will have an effect on the exported model 2.0.0 Alpha (10/17/05) Once again, sorry for the long wait between versions; life has been uncooperative and I've had quite a few changes to make before I felt ready to make another release SplitScreenRenderer has a new method to set the views for rendering called setViews(View[]); this allows changing the views without building a new SplitScreenRenderer object SplitScreenRenderer will now work with an empty View array; it will just display nothing in this case The Drawable and View interfaces now have a new method; deinit(GLDrawable, Context) that is used to free resources that have been assigned to the Drawable/View; this change was important to get the action library to not waste resources when using a VideoRenderer Removed a piece of debug code from DrawableDisplayList that I hadn't noticed was still there; sorry I missed it before now SplitScreenRenderer.recalculateViews() now produces rectangles based on the x and y coordinates provided by the reshape() method; JOGL always seems to provide zeros for these, it didn't seem to be a big problem; it just wasn't quite correct until now The change to the Drawable and View interfaces required a move to version 2.0.0; I promised that incompatible API changes would go along with a major version switch and I'm keeping my word Removed several "FIX ME" comments from the modeler's sources; I fixed a few bugs and in some cases decided nothing needed fixing, after all Split the net.jinx.model package up into the net.jinx.video and net.jinx.video.model packages; some modification to the Context class was required; it now extends a new class called ModelContext in the model package; ModelContext takes care of storing the current Model object for Context Made the constructor of Options in the video package is now protected The API documentation is now being generated with useage data Renamed the Drawable interface to Visible; I also renamed quite a few classes and methods to reflect this change; this brings it more in line with my plans for the Action library Added a couple of new methods to Camera that will optimise the Camera's distance from the origin to encompass an entire object in the view; these new methods assume a fairly realistic field of view; if the window is highly skewed, it won't work right; there's a new attribute in the configuration file: "cameras/optimize" that controls this behavior; now model designers won't have to worry about setting up an extra configuration file just because they're working with a big model Made a small change to Model's clone() method to optimise it a slight bit 1.1.0 Stable (09/22/05) Sorry for the long wait between versions; I've been testing out several ideas for the Deimos Project's other libraries that will be needed for the game itself; I've also been studying JOAL and OpenAL, so I'll know how to use them Added a new interface to the net.jinx.model package called ModelerGUI; Modeler now implements it and has a public no-argument constructor There is also a new method in the Modeler class that uses the new interface, allowing you to provide your own GUI for the modeler, while still using the default data loading abilities of Modeler's main method The net.jinx.colorizer.Colorizer class has changed quite a bit, but it still isn't done Added a new constructor to SplitScreenRenderer; it's a utility constructor that allows you to use a single View object without putting it into an array Made several private methods of Modeler public: getVersionString(), getApplicationName() and getApplicationTitle(); these are utility methods that might be useful for someone building their own ModelerGUI implementation Modeler has some new methods that ModelerGUI implementors might find handy (should they choose to extend Modeler instead of doing everything themself); these new methods use the Hierarchy version of the configuration file to configure various objects needed to instantiate SplitScreenRenderer There are two new options in the configuration file: "renderer/doublebuffer" and "renderer/accelerated" which control the rendering hints passed via the GLCapabilities object; they control whether or not double buffering and hardware acceleration are used 1.0.1 Stable (08/15/05) Added a method called getAWTClearColor to Options that returns the current clear color as a java.awt.Color; Modeler now sets the background color for the Frame to the clear color; no more ugly white background on startup 1.0.0 Stable (08/11/05) Moved the FrameCounter class to the new examples source tree Vertex Modeler in now officially out of Beta; keep an eye on the stability comments; they'll tell you whether or not you can rely on the APIs; anything new will almost undoubtedly spend some time as an alpha or beta; alpha and beta APIs can change without notice; stable APIs will be deprecated instead 0.7.0 Beta (08/10/05) Fixed a bug related to a GLDrawable switch with debug/tracing turned on; the SplitScreenRenderer would only enable bebug/tracing for the first GLDrawable Added a global ambient light attribute to Options; SplitScreenRenderer now uses it in it's init method Added a clear color attribute to Options; SplitScreenRenderer now uses it in it's init method Added a texture mode attribute to Options; View3D now uses it to determine texture mode Removed the display list based multiview accelerator from SplitScreenRenderer; it was problematic with textures; I realize now that it was probably working incorrectly Added an init method to the Drawable interface; DisplayList now uses this method to build it's OpenGL display list if the "uselists" attribute is true; the "model/uselist" attribute in the config file is no more Added an AbstractDrawable class with simple implementations of every method except draw() Removed the DisplayListManager class; adding init to Drawable made it obsolete Fixed a bug in Options related to the "uselists" attribute; it was returning the value of the twosidedness attribute The removal of DisplayListManager is an incompatible change in the API, so I bumped the version to 0.7.x 0.6.1 Beta (08/09/05) Fixed the clone method of Model; it wasn't copying references to the texture data Added more attributes to the Light class; fixed the loadLight method of ModelUtil to load the new attributes Set the background ambient light level to zero in the init method of SplitScreenRenderer The Options class is back; Context now extends it; this finally makes it clear which attributes are context attributes and which are rendering attributes 0.6.0 Beta (08/08/05) Added a new method to TextureManager to allow setting the base URL based on a java.io.File object; it can be either a directory or a jar file; there is now a new attribute used in the load method of TextureManager called "baseFile" that uses the new method; the "baseFile" attribute is more important than "baseURL" Renamed the Options class to Context; this is more in-line with it's current role Added a few more colorToMaterial methods and changed the resulting values to brighten things up just a little bit and darken the ambient bits a little; I wanted a little higher contrast; the specular highlights have had a little white averaged in; I did all of this because using textures always seems to dull the colors; adding contrast sharpened them back up Altered the default light in vmodeler-config.xml to brighten it a little Made some minor updates to the example models Made some major modifications to the lighting system; lights now adaptively enable and disable themselves as needed; this does mean that you can no longer wrap Light objects in DrawableDisplayList objects, however; you also don't have to number your lights yourself anymore There are now a few new attributes in the Context class related to lighting; you shouldn't ever modify their states, unless you're implementing your own version of the Light class from scratch The Modeler now renders much more quickly; I discovered while working on the lighting system that I had all eight lights turned on; whoops! Removed some un-needed arguments from SplitScreenRenderer's constructor DisplayListManager, SplitScreenRenderer and TextureManager are now able to withstand a GLDrawable switch; for example, when using a GLJPanel; It all ran just fine when I hacked it to use a GLJPanel, just extremely slow (about 1.5 FPS) Due to the API changes in the Context (was called Options) and Light classes, I decided to bump the version to 0.6.x I finally added stability comments to the Javadocs; after doing this I realized that the APIs are mostly in a stable state, so I decided this version is a beta, rather than an alpha version 0.5.0 Alpha (08/05/05) Implemented a clone() method for Model; this allows you to build nearly identical Model objects with different Colorations and/or extra MeshElements Implemented texturing in two parts; the TextureManager class handles loading and pushing around image data; Model now contains data for the texture name and texture coordinates; there are some problems with textured models and display lists; this is next on my list to fix I think I've finally fixed the normal bug that produces strange looking highlights; this required modifiying the Face class as well as those MeshElement classes that produce polygons; I've noticed very slight differences in some models; some of the specular highlights look less bright; the normals are now being calculated more precisely (smaller margin of error) models\Satellite.java has been fixed; I noticed that I accidentally built it inside out, which produced normals pointing the wrong direction; here's a bit of advice for model builders: build models with twosidedness turned off and pay attention to where the light source is Separated some of the functionality of DisplayList into DrawableDisplayList; DisplayList is now abstract and DrawableDisplayList functions like the old version of DisplayList Model now extends DisplayList, since models are supposed to be static; this is also a work around for the display list texturing bug; I don't know if it's a good solution or not; time will tell There's a new class called DisplayListManager that has the DisplayList management functions that used to be in SplitScreenRenderer There's a multitude of incompatible changes in the APIs, so I bumped the version number to 0.5.x; model designers aren't likely to notice, except where there are new methods 0.4.1 Alpha (07/29/05) Made Model final to avoid difficulties with subclassing Options now holds a reference to the Model currently being rendered; this was needed for the changes to SegmentColoration Modified Model and SegmentColoration; Model now holds segment names, as well as SegmentColoration; if any segments are named in SegmentColoration Model's segment names are ignored 0.4.0 Alpha (07/28/05) Made several incompatible changes to the API of some important classes and the internals of SplitScreenRenderer; I thought it was important enough to go to verstion 0.4.0 Added a new class: net.jinx.model.View3D; I took as much of the the 3D and lighting code from SplitScreenRenderer as I could and placed it into this class; Camera now extends View3D; moved the drawable get/set methods in Camera to View3D SplitScreenRenderer.init() is now only reponsible for actual initialization stuff; it was doing quite a bit more before View.view() does not have a return value anymore; all views are now required to set themselvs up the way they need before the Drawable is called Options now keeps track of the current drawing area's aspect ratio; use the getAspectRatio() method to get this value; there is no way to set it publicly; it's only there to provide the information needed to setup gluPerspective() Options now keeps track of the current drawing area's position and size; use the getDrawingArea() method to get a java.awt.Rectangle for it; this also cannot be modified through any public method Added some more utility methods to SplitScreenRenderer for display lists and modified the API for some of the methods that were already there; DisplayLists can now be removed from the renderer when they're no longer needed I worked a little magic into the ant build script, the jar manifest file and the Modeler class to make version and title stamping the application a little easier; all the jar files produced by the build process are now version stamped in the manifest files and vmodeler.jar has the application title stamped in as well 0.3.1 Alpha (07/26/05) Fixed a bug in the handling of line drawaing; line-based MeshElement classes now specify a zero vector for normals, which should keep them from using the last specified normal Added another colorToMaterial method to ModelUtil; I keep trying to use three parameters in my models, so I added a method with three to use a default alpha value of one Altered SegmentColoration to accept general Coloration objects for colors, instead of just Material objects; this is a slightly incompatible change, but model sources that don't rely on the getColoration() methods of SegmentColoration should function just fine SegmentColoration.load() does not throw IllegalArgumentException for missing Hierarchy nodes anymore; in this case, it assumes that there is no data to load from the missing node Modified how DisplayList works; the way it was working was not quite correct; you couldn't put one display list inside of another; DisplayList objects must now be added to SplitScreenRenderer via it's addDisplayList(DisplayList) method, or the display list will simply call the encapsulated Drawable SplitScreenRenderer now has a method to refresh all DisplayList objects; this should be called if the Options object containing rendering attributes is modified SplitScreenRenderer now accelerates multiple views by using a temporary display list for the scene for each frame, so that all views have the exact the same gl calls made for the scene; this list is deleted at the end of each frame; this gave a 5 to 25 percent increase in frame rate on my system, depending on the particular model that is displayed; this is only used if the uselists attribute is set in the Options object Added a variable resolution timer library (net.jinx.time package; the build process now requires Java 1.5 or greater, but the results should still run on Java 1.4.2; on 1.5+, the nanosecond timer is used; on 1.4.2, it uses the millisecond timer; on a Java 1.4.2 system, you can still compile and jar everything except the net.jinx.time package using the compile1.4 and jar1.4 tasks in the meta-build file, instead of the compile and jar tasks; you will still need the timer.jar file, so don't erase it; Vertex Modeler requires the StopWatch class to operate now SplitScreenRenderer now uses the new StopWatch class for it's frame counter instead of System.currentTimeMillis(); this should produce more accurate results Vertex Modeler has now been tested on Java 1.4.2; no problems showed up during testing Modeler now wraps the Drawable in a display list based on the value of the "model/uselist" boolean attribute in the configuration file, instead of the "renderer/uselists" attribute Options now carries an alpha transparency value; this allows you to specify transparency at the vertex, model or scene level; this required modifying Material to get it to function; all Coloration implementations should use Material for the actual drawing of colors or they'll have to implement this alpha technique themselves Fixed Options so that on loading attributes from a Hierarchy, all of the setting of values goes through method calls instead of directly setting the values; this should allow more seamless subclassing of Options Options now carries perspective settings for SplitScreenRenderer; field of view, near clipping plane and far clipping plane Options now carries an OpenGL debugging flag; SplitScreenRenderer will wrap the GL in a DebugGL if this flag is enabled Options now carries an OpenGL tracing flag; SplitScreenRenderer will wrap the GL in a TraceGL if this flag is enabled The net.jinx.model package now has a package comment file 0.3 Alpha (07/5/05) Added some error checking to the constructor of net.jinx.model.SplitScreenRenderer Fixed a bug in net.jinx.model.ModelUtil.colorToMaterial(java.awt.Color); was using an index of 4 for the alpha component, instead of 3 Fixed a bug related to multiple views and the restoration of the projection matrix after a view requests it be restored Added two new classes in the net.jinx.model package; View2D allows drawing two dimensional views; MessageView provides a console-like viewport that allows displaying textual data to the user Added a frame counter class; it functions as a View; Also built a frame counter into SplitScreenRenderer; two choices are always better than one Added a Drawable implementation that places another Drawable in an OpenGL display list; Modeler will now optionally place your Drawables in a display list; this nearly doubles the frame rate on my system when enabled DemoRotator now uses an interpolation technique instead of a per-frame rotation; the totalRotation() method has been removed, as the total rotation is no longer being tracked, because this is not necessary; it now rotates by the given vector for every second that passes I felt that all of the above changes were important enough to go to version 0.3 Added another example model to the models directory: Drone.java; it's supposed to be a very small remote-controlled drone fighter 0.2.2 Alpha (06/27/05) Added net.jinx.model.DualColoration class; this allows using two different Coloration objects based on a divider line; if a vertex is above the divider, the first Coloration is used; if it's equal to or less than the divider, the second Coloration is used The loadColoration method of net.jinx.model.ModelUtil now defaults the Coloration class to net.jinx.model.Material when the type attribute is unset Corrected a bug related to storing Coloration objects embedded in other Coloration objects by adding a new method to ModelUtil: store(Hierarchy, Coloration); more store methods are likely to be added in the future for other object types The example models Fighter.java, and AlienBroadWing.java now use a DualColoration that closely matches their original segment coloration, based on a pair of gradient colorations The example model AlienGun.java now uses a gradient coloration that makes it look kind of sinister Added a method to ModelUtil to construct a semi-random VertexColoration object; it's experimental; I'm trying to produce a random camoflage-like effect Added a pair of methods to ModelUtil to construct net.jinx.model.Material objects from java.awt.Color objects, based on my personal preferences for converting the average color to a Material (not too much ambient, specular is the same as the color, diffuse is just a little darker than specular, no emission and a shininess of 32); the two methods are both called colorToMaterial() Updated the JavaDocs for most things that had stale documentation; this included adding documentation for classes that hadn't been documented yet Fixed a few random bugs I encountered along the way. 0.2.1 Alpha (06/24/05) Added net.jinx.model.GradientColoration class; this allows smoothly shaded coloration blending from one color to another The example Model Fighter.java now uses GradientColoration, but the old coloration code is only commented out 0.2 Alpha (06/23/05) net.jinx.model.Options takes care of rendering flags instead of passing them around directly in the Drawable interface Classes no longer implement Serializeable; Hierarchy is supposed to be the persistent storage method Added a few methods to net.jinx.db.Hierarchy to handle easier loading of vertices Fixed the configuration file and net.jinx.model.ModelUtil class to read vertex arrays whenever possible, instead of subnodes; makes more compact configuration and model formats This version's config and export files are incompatible with older versions, so I decided to go to version 0.2 Another reason for the above is a somewhat large change in the API of net.jinx.model.Drawable; Option objects are being passed around instead of boolean flags now Options now determines which parts of Material properties are used; this allows the disabling of unused properties to accelerate rendering; this required another big change in the API of many classes, yet another reason for the move to 0.2 0.1.2 Alpha (06/22/05) Fixed some possible hangups related to Hierarchy objects in net.jinx.model.Modeler; Modeler will no longer create new nodes in the Hierarchy, and is instead checking for non-existant nodes and handling them as appropriate Changed the names of the getXXXAttribute(String, XXX) methods in net.jinx.db.Hierarchy to getAttribute(String, XXX); I just didn't see any reason for them to be named the way they were (I also don't know what I was thinking at the time); the type of the getAttribute methods is now determined by the type of the default value Added setAttribute(String, XXX) methods to net.jinx.db.Hierarchy for each primitive type Added setAttribute() and getAttribute() methods to net.jinx.db.Hierarchy for handling primitive arrays More than one light is now allowed in the configuration file Added push() and pop() methods to net.jinx.model.Options; allows the pushing and popping of rendering attributes 0.1.1 Alpha (06/20/05) Implemented import/export command-line switches Updated/organized the -help command-line switch 0.1 Alpha (06/18/05) Initial release