Java tutorial
/** * Eclipse Public License - v 1.0 * * THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION * OF THE * PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT. * * 1. DEFINITIONS * * "Contribution" means: * * a) in the case of the initial Contributor, the initial code and documentation distributed under this Agreement, and * b) in the case of each subsequent Contributor: * i) changes to the Program, and * ii) additions to the Program; * where such changes and/or additions to the Program originate from and are distributed by that particular Contributor. A Contribution * 'originates' from a Contributor if it was added to the Program by such Contributor itself or anyone acting on such Contributor's behalf. * Contributions do not include additions to the Program which: (i) are separate modules of software distributed in conjunction with the Program * under their own license agreement, and (ii) are not derivative works of the Program. * "Contributor" means any person or entity that distributes the Program. * * "Licensed Patents" mean patent claims licensable by a Contributor which are necessarily infringed by the use or sale of its Contribution alone * or when combined with the Program. * * "Program" means the Contributions distributed in accordance with this Agreement. * * "Recipient" means anyone who receives the Program under this Agreement, including all Contributors. * * 2. GRANT OF RIGHTS * * a) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free copyright license * to reproduce, prepare derivative works of, publicly display, publicly perform, distribute and sublicense the Contribution of such Contributor, * if any, and such derivative works, in source code and object code form. * b) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free patent license * under Licensed Patents to make, use, sell, offer to sell, import and otherwise transfer the Contribution of such Contributor, if any, in source * code and object code form. This patent license shall apply to the combination of the Contribution and the Program if, at the time the * Contribution is added by the Contributor, such addition of the Contribution causes such combination to be covered by the Licensed Patents. The * patent license shall not apply to any other combinations which include the Contribution. No hardware per se is licensed hereunder. * c) Recipient understands that although each Contributor grants the licenses to its Contributions set forth herein, no assurances are provided * by any Contributor that the Program does not infringe the patent or other intellectual property rights of any other entity. Each Contributor * disclaims any liability to Recipient for claims brought by any other entity based on infringement of intellectual property rights or otherwise. * As a condition to exercising the rights and licenses granted hereunder, each Recipient hereby assumes sole responsibility to secure any other * intellectual property rights needed, if any. For example, if a third party patent license is required to allow Recipient to distribute the * Program, it is Recipient's responsibility to acquire that license before distributing the Program. * d) Each Contributor represents that to its knowledge it has sufficient copyright rights in its Contribution, if any, to grant the copyright * license set forth in this Agreement. * 3. REQUIREMENTS * * A Contributor may choose to distribute the Program in object code form under its own license agreement, provided that: * * a) it complies with the terms and conditions of this Agreement; and * b) its license agreement: * i) effectively disclaims on behalf of all Contributors all warranties and conditions, express and implied, including warranties or conditions * of title and non-infringement, and implied warranties or conditions of merchantability and fitness for a particular purpose; * ii) effectively excludes on behalf of all Contributors all liability for damages, including direct, indirect, special, incidental and * consequential damages, such as lost profits; * iii) states that any provisions which differ from this Agreement are offered by that Contributor alone and not by any other party; and * iv) states that source code for the Program is available from such Contributor, and informs licensees how to obtain it in a reasonable manner * on or through a medium customarily used for software exchange. * When the Program is made available in source code form: * * a) it must be made available under this Agreement; and * b) a copy of this Agreement must be included with each copy of the Program. * Contributors may not remove or alter any copyright notices contained within the Program. * * Each Contributor must identify itself as the originator of its Contribution, if any, in a manner that reasonably allows subsequent Recipients * to identify the originator of the Contribution. * * 4. COMMERCIAL DISTRIBUTION * * Commercial distributors of software may accept certain responsibilities with respect to end users, business partners and the like. While this * license is intended to facilitate the commercial use of the Program, the Contributor who includes the Program in a commercial product offering * should do so in a manner which does not create potential liability for other Contributors. Therefore, if a Contributor includes the Program in * a commercial product offering, such Contributor ("Commercial Contributor") hereby agrees to defend and indemnify every other Contributor * ("Indemnified Contributor") against any losses, damages and costs (collectively "Losses") arising from claims, lawsuits and other legal actions * brought by a third party against the Indemnified Contributor to the extent caused by the acts or omissions of such Commercial Contributor in * connection with its distribution of the Program in a commercial product offering. The obligations in this section do not apply to any claims or * Losses relating to any actual or alleged intellectual property infringement. In order to qualify, an Indemnified Contributor must: a) promptly * notify the Commercial Contributor in writing of such claim, and b) allow the Commercial Contributor to control, and cooperate with the * Commercial Contributor in, the defense and any related settlement negotiations. The Indemnified Contributor may participate in any such claim * at its own expense. * * For example, a Contributor might include the Program in a commercial product offering, Product X. That Contributor is then a Commercial * Contributor. If that Commercial Contributor then makes performance claims, or offers warranties related to Product X, those performance claims * and warranties are such Commercial Contributor's responsibility alone. Under this section, the Commercial Contributor would have to defend * claims against the other Contributors related to those performance claims and warranties, and if a court requires any other Contributor to pay * any damages as a result, the Commercial Contributor must pay those damages. * * 5. NO WARRANTY * * EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, * EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS * FOR A PARTICULAR PURPOSE. Each Recipient is solely responsible for determining the appropriateness of using and distributing the Program and * assumes all risks associated with its exercise of rights under this Agreement , including but not limited to the risks and costs of program * errors, compliance with applicable laws, damage to or loss of data, programs or equipment, and unavailability or interruption of operations. * * 6. DISCLAIMER OF LIABILITY * * EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION * OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. * * 7. GENERAL * * If any provision of this Agreement is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the * remainder of the terms of this Agreement, and without further action by the parties hereto, such provision shall be reformed to the minimum * extent necessary to make such provision valid and enforceable. * * If Recipient institutes patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Program * itself (excluding combinations of the Program with other software or hardware) infringes such Recipient's patent(s), then such Recipient's * rights granted under Section 2(b) shall terminate as of the date such litigation is filed. * * All Recipient's rights under this Agreement shall terminate if it fails to comply with any of the material terms or conditions of this * Agreement and does not cure such failure in a reasonable period of time after becoming aware of such noncompliance. If all Recipient's rights * under this Agreement terminate, Recipient agrees to cease use and distribution of the Program as soon as reasonably practicable. However, * Recipient's obligations under this Agreement and any licenses granted by Recipient relating to the Program shall continue and survive. * * Everyone is permitted to copy and distribute copies of this Agreement, but in order to avoid inconsistency the Agreement is copyrighted and may * only be modified in the following manner. The Agreement Steward reserves the right to publish new versions (including revisions) of this * Agreement from time to time. No one other than the Agreement Steward has the right to modify this Agreement. The Eclipse Foundation is the * initial Agreement Steward. The Eclipse Foundation may assign the responsibility to serve as the Agreement Steward to a suitable separate * entity. Each new version of the Agreement will be given a distinguishing version number. The Program (including Contributions) may always be * distributed subject to the version of the Agreement under which it was received. In addition, after a new version of the Agreement is * published, Contributor may elect to distribute the Program (including its Contributions) under the new version. Except as expressly stated in * Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to the intellectual property of any Contributor under this Agreement, * whether expressly, by implication, estoppel or otherwise. All rights in the Program not expressly granted under this Agreement are reserved. * * This Agreement is governed by the laws of the State of New York and the intellectual property laws of the United States of America. No party to * this Agreement will bring a legal action under this Agreement more than one year after the cause of action arose. Each party waives its rights * to a jury trial in any resulting litigation. */ package com.runescape.client.revised.editor.modelviewer; import java.awt.Canvas; import java.awt.Dimension; import java.io.BufferedReader; import java.io.FileInputStream; import java.io.InputStreamReader; import java.nio.FloatBuffer; import java.util.ArrayList; import java.util.List; import org.lwjgl.BufferUtils; import org.lwjgl.LWJGLException; import org.lwjgl.input.Mouse; import org.lwjgl.opengl.ARBFragmentShader; import org.lwjgl.opengl.ARBShaderObjects; import org.lwjgl.opengl.ARBVertexShader; import org.lwjgl.opengl.Display; import org.lwjgl.opengl.GL11; public class Viewport { private final String[] DRAGON_WARRIOR = { "dragon_full_helm_male", "dragon_platebody_male", "dragon_platelegs_male", "dragon_gauntlets_male", "steadfast_boots_male", "dragon_scimitar", "dragonfire_shield", "completionist_cape_male" }; private final String[] TORVA_WARRIOR = { "torva_helm", "torva_plate", "torva_legs", "dragon_gauntlets_male", "steadfast_boots_male", "dragon_scimitar", "dragonfire_shield", "completionist_cape_male" }; private final String[] TROLL = { "troll" }; private final String[] JAD = { "jad" }; private List<Model3D> dragonList; private List<Model3D> torvaList; private List<Model3D> trollList; private List<Model3D> jadList; private final Canvas canvas; private int width, height; private float pitch, yaw; private final float roll; private float offset_z; private float scale; public Viewport(final Canvas canvas) throws LWJGLException { this.canvas = canvas; this.loadModels(); this.scale = 1.0F; this.pitch = 180.0F; this.yaw = 0.0F; this.roll = 0.0F; } private void loadModels() { final String[] dragonNames = this.DRAGON_WARRIOR; final String[] torvaNames = this.TORVA_WARRIOR; final String[] trollName = this.TROLL; final String[] jadName = this.JAD; this.setDragonList(new ArrayList<Model3D>(dragonNames.length)); this.setTorvaList(new ArrayList<Model3D>(torvaNames.length)); this.setTrollList(new ArrayList<Model3D>(trollName.length)); this.setJadList(new ArrayList<Model3D>(jadName.length)); final String[] ext = { ".rsm", ".dat", ".mdl" }; final String dir = "./models/"; for (int index = 0; index < dragonNames.length; index++) { this.getDragonList().add(new Model3D(DataUtilities.getData(dir + dragonNames[index] + ext[0]))); } for (int index = 0; index < torvaNames.length; index++) { this.getTorvaList().add(new Model3D(DataUtilities.getData(dir + torvaNames[index] + ext[0]))); } for (int index = 0; index < trollName.length; index++) { this.getTrollList().add(new Model3D(DataUtilities.getData(dir + trollName[index] + ext[0]))); } for (int index = 0; index < jadName.length; index++) { this.getJadList().add(new Model3D(DataUtilities.getData(dir + jadName[index] + ext[0]))); } } public void render() { final Dimension size = this.canvas.getSize(); if ((size.width > 0) && (size.height > 0)) { if ((this.width != size.width) || (this.height != size.height)) { this.width = size.width; this.height = size.height; GL11.glViewport(0, 0, this.width, this.height); GL11.glMatrixMode(GL11.GL_PROJECTION); GL11.glLoadIdentity(); final float c = (float) Math .sqrt((double) (this.width * this.width) + (double) (this.height * this.height)); GL11.glOrtho(0.0F, this.width, 0.0F, this.height, -c, c); GL11.glMatrixMode(GL11.GL_MODELVIEW); final boolean useShader = this.initShader(); if (ModelConstants.ENABLE_VERTEX_SHADER && useShader) { ARBShaderObjects.glUseProgramObjectARB(this.program); } if (ModelConstants.ENABLE_LIGHTING) { GL11.glEnable(GL11.GL_LIGHTING); GL11.glEnable(GL11.GL_LIGHT0); final FloatBuffer diffuse = BufferUtils.createFloatBuffer(4) .put(new float[] { 1F, 1F, 1F, 1F }); final FloatBuffer position = BufferUtils.createFloatBuffer(4) .put(new float[] { 3F, 0F, 1F, 0F }); final FloatBuffer ambient = BufferUtils.createFloatBuffer(4) .put(new float[] { .1F, .1F, .2F, .3F }); final FloatBuffer specular = BufferUtils.createFloatBuffer(4) .put(new float[] { 1F, 1F, 1F, 1F }); GL11.glMaterial(GL11.GL_FRONT, GL11.GL_SPECULAR, (FloatBuffer) specular.flip()); GL11.glLight(GL11.GL_LIGHT0, GL11.GL_AMBIENT, (FloatBuffer) ambient.flip()); GL11.glLight(GL11.GL_LIGHT0, GL11.GL_DIFFUSE, (FloatBuffer) diffuse.flip()); GL11.glLight(GL11.GL_LIGHT0, GL11.GL_POSITION, (FloatBuffer) position.flip()); GL11.glMaterialf(GL11.GL_FRONT, GL11.GL_SHININESS, 50.0f); } } if (Mouse.isButtonDown(0) && !Mouse.isButtonDown(1)) { this.yaw -= Mouse.getDX(); this.pitch -= Mouse.getDY(); } if (Mouse.isButtonDown(0) && Mouse.isButtonDown(1)) { this.offset_z += Mouse.getDY(); } float wheel = Mouse.getDWheel() / 960.0F; if (wheel > 1.0F) { wheel = 1.0F; } else if (wheel < -1.0F) { wheel = -1.0F; } this.scale -= this.scale * wheel; if (this.scale < 0.01F) { this.scale = 0.01F; } for (final Model3D dragonModel : this.getDragonList()) { final float x = this.width / 1.2F; final float y = (-((100.0F * (this.scale))) + (this.offset_z + 0.1F)) + ((this.height - dragonModel.height()) / 2.0F); final float z = 0.0F; dragonModel.calcDimms(false); dragonModel.render(x, y, z, this.pitch, this.yaw, this.roll, this.scale, this.scale, this.scale); } for (final Model3D torvaModel : this.getTorvaList()) { final float x = this.width / 1.7F; final float y = (-((100.0F * (this.scale))) + this.offset_z) + ((this.height - torvaModel.height()) / 2.0F); final float z = 0.0F; torvaModel.calcDimms(false); torvaModel.render(x, y, z, this.pitch, this.yaw, this.roll, this.scale, this.scale, this.scale); } for (final Model3D jadModel : this.getJadList()) { final float x = this.width / 3.2F; final float y = (-((100.0F * (this.scale))) + this.offset_z) + ((this.height - jadModel.height()) / 2.0F); final float z = 0.0F; jadModel.calcDimms(false); jadModel.render(x, y, z, this.pitch, this.yaw, this.roll, this.scale, this.scale, this.scale); } for (final Model3D trollModel : this.getTrollList()) { final float x = this.width / 3.8F; final float y = (-((100.0F * (this.scale))) + this.offset_z) + ((this.height - trollModel.height()) / 2.0F); final float z = 0.0F; trollModel.calcDimms(false); trollModel.render(x, y, z, this.pitch, this.yaw, this.roll, this.scale, this.scale, this.scale); } if (ModelConstants.ENABLE_VERTEX_SHADER && this.initShader()) { ARBShaderObjects.glUseProgramObjectARB(0); } Display.update(); } } private int createShader(final String filename, final int shaderType) throws Exception { int shader = 0; try { shader = ARBShaderObjects.glCreateShaderObjectARB(shaderType); if (shader == 0) { return 0; } ARBShaderObjects.glShaderSourceARB(shader, this.readFileAsString(filename)); ARBShaderObjects.glCompileShaderARB(shader); if (ARBShaderObjects.glGetObjectParameteriARB(shader, ARBShaderObjects.GL_OBJECT_COMPILE_STATUS_ARB) == GL11.GL_FALSE) { throw new RuntimeException("Error creating shader: " + this.getLogInfo(shader)); } return shader; } catch (final Exception exc) { ARBShaderObjects.glDeleteObjectARB(shader); throw exc; } } private String getLogInfo(final int obj) { return ARBShaderObjects.glGetInfoLogARB(obj, ARBShaderObjects.glGetObjectParameteriARB(obj, ARBShaderObjects.GL_OBJECT_INFO_LOG_LENGTH_ARB)); } private int program; public boolean initShader() { int vertShader = 0, fragShader = 0; try { vertShader = this.createShader("./shaders/screen.vert", ARBVertexShader.GL_VERTEX_SHADER_ARB); fragShader = this.createShader("./shaders/screen.frag", ARBFragmentShader.GL_FRAGMENT_SHADER_ARB); } catch (final Exception exc) { exc.printStackTrace(); return false; } finally { if ((vertShader == 0) || (fragShader == 0)) { return false; } } this.program = ARBShaderObjects.glCreateProgramObjectARB(); if (this.program == 0) { return false; } ARBShaderObjects.glAttachObjectARB(this.program, vertShader); ARBShaderObjects.glAttachObjectARB(this.program, fragShader); ARBShaderObjects.glLinkProgramARB(this.program); if (ARBShaderObjects.glGetObjectParameteriARB(this.program, ARBShaderObjects.GL_OBJECT_LINK_STATUS_ARB) == GL11.GL_FALSE) { System.err.println(this.getLogInfo(this.program)); return false; } ARBShaderObjects.glValidateProgramARB(this.program); if (ARBShaderObjects.glGetObjectParameteriARB(this.program, ARBShaderObjects.GL_OBJECT_VALIDATE_STATUS_ARB) == GL11.GL_FALSE) { System.err.println(this.getLogInfo(this.program)); return false; } return true; } private String readFileAsString(final String filename) throws Exception { final StringBuilder source = new StringBuilder(); final FileInputStream in = new FileInputStream(filename); Exception exception = null; BufferedReader reader; try { reader = new BufferedReader(new InputStreamReader(in, "UTF-8")); Exception innerExc = null; try { String line; while ((line = reader.readLine()) != null) { source.append(line).append('\n'); } } catch (final Exception exc) { exception = exc; } finally { try { reader.close(); } catch (final Exception exc) { if (innerExc == null) { innerExc = exc; } else { exc.printStackTrace(); } } } if (innerExc != null) { throw innerExc; } } catch (final Exception exc) { exception = exc; } finally { try { in.close(); } catch (final Exception exc) { if (exception == null) { exception = exc; } else { exc.printStackTrace(); } } if (exception != null) { throw exception; } } return source.toString(); } public int getWidth() { return this.width; } public int getHeight() { return this.height; } public String[] getDragonWarrior() { return this.DRAGON_WARRIOR; } public String[] getTorvaWarrior() { return this.TORVA_WARRIOR; } public String[] getTroll() { return this.TROLL; } public String[] getJad() { return this.JAD; } public void setDragonList(final List<Model3D> dragonList) { this.dragonList = dragonList; } public List<Model3D> getDragonList() { return this.dragonList; } public void setTorvaList(final List<Model3D> torvaList) { this.torvaList = torvaList; } public List<Model3D> getTorvaList() { return this.torvaList; } public void setTrollList(final List<Model3D> trollList) { this.trollList = trollList; } public List<Model3D> getTrollList() { return this.trollList; } public void setJadList(final List<Model3D> jadList) { this.jadList = jadList; } public List<Model3D> getJadList() { return this.jadList; } }