diff --git a/src/java/org/lwjgl/test/mapped/MappedFloat.java b/src/java/org/lwjgl/test/mapped/MappedFloat.java index a94aaacb..592719e8 100644 --- a/src/java/org/lwjgl/test/mapped/MappedFloat.java +++ b/src/java/org/lwjgl/test/mapped/MappedFloat.java @@ -32,10 +32,8 @@ package org.lwjgl.test.mapped; import org.lwjgl.util.mapped.MappedObject; -import org.lwjgl.util.mapped.MappedType; /** @author Riven */ -@MappedType public class MappedFloat extends MappedObject { public MappedFloat() { diff --git a/src/java/org/lwjgl/test/mapped/MappedObjectTests3.java b/src/java/org/lwjgl/test/mapped/MappedObjectTests3.java index fa35e03b..52427e64 100644 --- a/src/java/org/lwjgl/test/mapped/MappedObjectTests3.java +++ b/src/java/org/lwjgl/test/mapped/MappedObjectTests3.java @@ -35,7 +35,6 @@ import org.lwjgl.MemoryUtil; import org.lwjgl.util.mapped.MappedObject; import org.lwjgl.util.mapped.MappedSet; import org.lwjgl.util.mapped.MappedSet2; -import org.lwjgl.util.mapped.MappedType; import java.nio.ByteBuffer; import java.nio.ByteOrder; @@ -82,7 +81,6 @@ public class MappedObjectTests3 { System.out.println("current.view=" + some.view + ", not " + elementCount + ", as you might expect"); } - @MappedType public static class Xyz extends MappedObject { int x, y, z; diff --git a/src/java/org/lwjgl/test/mapped/MappedObjectTests4.java b/src/java/org/lwjgl/test/mapped/MappedObjectTests4.java index 762e84d1..6beceede 100644 --- a/src/java/org/lwjgl/test/mapped/MappedObjectTests4.java +++ b/src/java/org/lwjgl/test/mapped/MappedObjectTests4.java @@ -35,7 +35,6 @@ import org.lwjgl.MemoryUtil; import org.lwjgl.PointerBuffer; import org.lwjgl.opengl.Display; import org.lwjgl.util.mapped.MappedObject; -import org.lwjgl.util.mapped.MappedType; import org.lwjgl.util.mapped.Pointer; import java.io.File; @@ -116,7 +115,6 @@ public class MappedObjectTests4 { } } - @MappedType public static class MappedPointer extends MappedObject { int foo; diff --git a/src/java/org/lwjgl/test/mapped/MappedSomething.java b/src/java/org/lwjgl/test/mapped/MappedSomething.java index bc271493..bf3a0624 100644 --- a/src/java/org/lwjgl/test/mapped/MappedSomething.java +++ b/src/java/org/lwjgl/test/mapped/MappedSomething.java @@ -33,12 +33,10 @@ package org.lwjgl.test.mapped; import org.lwjgl.util.mapped.MappedField; import org.lwjgl.util.mapped.MappedObject; -import org.lwjgl.util.mapped.MappedType; import java.nio.ByteBuffer; /** @author Riven */ -@MappedType public class MappedSomething extends MappedObject { @MappedField(byteOffset = 0) diff --git a/src/java/org/lwjgl/test/mapped/MappedVec2.java b/src/java/org/lwjgl/test/mapped/MappedVec2.java index 8c6ffbc6..74512f38 100644 --- a/src/java/org/lwjgl/test/mapped/MappedVec2.java +++ b/src/java/org/lwjgl/test/mapped/MappedVec2.java @@ -32,10 +32,8 @@ package org.lwjgl.test.mapped; import org.lwjgl.util.mapped.MappedObject; -import org.lwjgl.util.mapped.MappedType; /** @author Riven */ -@MappedType public class MappedVec2 extends MappedObject { public float x; diff --git a/src/java/org/lwjgl/test/mapped/MappedVec3.java b/src/java/org/lwjgl/test/mapped/MappedVec3.java index 98b4c1f3..d0536be2 100644 --- a/src/java/org/lwjgl/test/mapped/MappedVec3.java +++ b/src/java/org/lwjgl/test/mapped/MappedVec3.java @@ -32,10 +32,8 @@ package org.lwjgl.test.mapped; import org.lwjgl.util.mapped.MappedObject; -import org.lwjgl.util.mapped.MappedType; /** @author Riven */ -@MappedType public class MappedVec3 extends MappedObject { public float x; diff --git a/src/java/org/lwjgl/test/opengl/sprites/SpriteShootoutMapped.java b/src/java/org/lwjgl/test/opengl/sprites/SpriteShootoutMapped.java index 967ba205..7a839cf8 100644 --- a/src/java/org/lwjgl/test/opengl/sprites/SpriteShootoutMapped.java +++ b/src/java/org/lwjgl/test/opengl/sprites/SpriteShootoutMapped.java @@ -204,7 +204,6 @@ public final class SpriteShootoutMapped { return texID; } - @MappedType public static class Pixel4b extends MappedObject { public byte r, g, b, a; @@ -413,7 +412,6 @@ public final class SpriteShootoutMapped { Display.destroy(); } - @MappedType public static class Sprite extends MappedObject { public float x, dx; @@ -421,7 +419,6 @@ public final class SpriteShootoutMapped { } - @MappedType public static class SpriteRender extends MappedObject { public float x, y; diff --git a/src/java/org/lwjgl/util/mapped/MappedField.java b/src/java/org/lwjgl/util/mapped/MappedField.java index 474cf9f4..a39d63a6 100644 --- a/src/java/org/lwjgl/util/mapped/MappedField.java +++ b/src/java/org/lwjgl/util/mapped/MappedField.java @@ -37,7 +37,7 @@ import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** - * This annotation can be used on fields of {@link MappedType} classes, + * This annotation can be used on fields of {@link MappedObject} subclasses, * to manually specify byte offsets and lengths. This is useful when the * mapped fields require custom alignment. {@link java.nio.ByteBuffer} * fields are required to have this annotation with a hardcoded byte length. diff --git a/src/java/org/lwjgl/util/mapped/MappedObject.java b/src/java/org/lwjgl/util/mapped/MappedObject.java index a77bcd8d..a4f66ec6 100644 --- a/src/java/org/lwjgl/util/mapped/MappedObject.java +++ b/src/java/org/lwjgl/util/mapped/MappedObject.java @@ -39,8 +39,8 @@ import java.nio.ByteBuffer; /** * Base superclass of all mapped objects. Classes that require - * data mapping should extend this class and also be annotated - * with {@link MappedType}. + * data mapping should extend this class and registered with + * {@link MappedObjectTransformer#register(Class)}. *

* Subclasses may only specify the default constructor. Any code * inside that constructor is optional, but will not run when the @@ -215,7 +215,7 @@ public abstract class MappedObject { } /** - * Copies and amount of SIZEOF bytes, from the current + * Copies and amount of SIZEOF - padding bytes, from the current * mapped object, to the specified mapped object. */ @SuppressWarnings("unused") @@ -225,8 +225,9 @@ public abstract class MappedObject { } /** - * Copies and amount of SIZEOF*instances bytes, from the - * current mapped object, to the specified mapped object. + * Copies and amount of SIZEOF * instances bytes, from the + * current mapped object, to the specified mapped object. Note that + * this includes any padding bytes that are part of SIZEOF. */ @SuppressWarnings("unused") public final void copyRange(T target, int instances) { diff --git a/src/java/org/lwjgl/util/mapped/MappedObjectTransformer.java b/src/java/org/lwjgl/util/mapped/MappedObjectTransformer.java index 9bd7780c..b0403d68 100644 --- a/src/java/org/lwjgl/util/mapped/MappedObjectTransformer.java +++ b/src/java/org/lwjgl/util/mapped/MappedObjectTransformer.java @@ -113,7 +113,7 @@ public class MappedObjectTransformer { // => IADD // => PUTFIELD MyMappedType.view // - className_to_subtype.put(MAPPED_OBJECT_JVM, new MappedSubtypeInfo(MAPPED_OBJECT_JVM, null, -1, -1)); + className_to_subtype.put(MAPPED_OBJECT_JVM, new MappedSubtypeInfo(MAPPED_OBJECT_JVM, null, -1, -1, -1)); } final String vmName = System.getProperty("java.vm.name"); @@ -128,15 +128,13 @@ public class MappedObjectTransformer { * * @param type the mapped object class. */ - public static void register(Class type) { + public static void register(Class type) { if ( MappedObjectClassLoader.FORKED ) return; final MappedType mapped = type.getAnnotation(MappedType.class); - if ( mapped == null ) - throw new ClassFormatError("missing " + MappedType.class.getName() + " annotation"); - if ( mapped.padding() < 0 ) + if ( mapped != null && mapped.padding() < 0 ) throw new ClassFormatError("Invalid mapped type padding: " + mapped.padding()); if ( type.getEnclosingClass() != null && !Modifier.isStatic(type.getModifiers()) ) @@ -148,7 +146,7 @@ public class MappedObjectTransformer { int advancingOffset = 0; long sizeof = 0; for ( Field field : type.getDeclaredFields() ) { - FieldInfo fieldInfo = registerField(mapped, className, advancingOffset, field); + FieldInfo fieldInfo = registerField(mapped == null || mapped.autoGenerateOffsets(), className, advancingOffset, field); if ( fieldInfo == null ) continue; @@ -158,14 +156,17 @@ public class MappedObjectTransformer { sizeof = Math.max(sizeof, fieldInfo.offset + fieldInfo.length); } - sizeof += mapped.padding(); + final int align = mapped == null ? 4 : mapped.align(); + final int padding = mapped == null ? 0 : mapped.padding(); - final MappedSubtypeInfo mappedType = new MappedSubtypeInfo(className, fields, (int)sizeof, mapped.align()); + sizeof += padding; + + final MappedSubtypeInfo mappedType = new MappedSubtypeInfo(className, fields, (int)sizeof, align, padding); if ( className_to_subtype.put(className, mappedType) != null ) throw new InternalError("duplicate mapped type: " + mappedType.className); } - private static FieldInfo registerField(final MappedType mapped, final String className, int advancingOffset, final Field field) { + private static FieldInfo registerField(final boolean autoGenerateOffsets, final String className, int advancingOffset, final Field field) { if ( Modifier.isStatic(field.getModifiers()) ) // static fields are never mapped return null; @@ -174,7 +175,7 @@ public class MappedObjectTransformer { throw new ClassFormatError("field '" + className + "." + field.getName() + "' not supported: " + field.getType()); MappedField meta = field.getAnnotation(MappedField.class); - if ( meta == null && !mapped.autoGenerateOffsets() ) + if ( meta == null && !autoGenerateOffsets ) throw new ClassFormatError("field '" + className + "." + field.getName() + "' missing annotation " + MappedField.class.getName() + ": " + className); Pointer pointer = field.getAnnotation(Pointer.class); @@ -688,7 +689,7 @@ public class MappedObjectTransformer { final InsnList list = new InsnList(); // stack: target, this - list.add(getIntNode(mappedType.sizeof)); + list.add(getIntNode(mappedType.sizeof - mappedType.padding)); // stack: sizeof, target, this list.add(new MethodInsnNode(INVOKESTATIC, MAPPED_HELPER_JVM, "copy", "(L" + MAPPED_OBJECT_JVM + ";L" + MAPPED_OBJECT_JVM + ";I)V")); // stack: - @@ -1073,10 +1074,11 @@ public class MappedObjectTransformer { final int sizeof; final int sizeof_shift; final int align; + final int padding; final Map fields; - MappedSubtypeInfo(String className, Map fields, int sizeof, int align) { + MappedSubtypeInfo(String className, Map fields, int sizeof, int align, int padding) { this.className = className; this.sizeof = sizeof; @@ -1085,6 +1087,7 @@ public class MappedObjectTransformer { else this.sizeof_shift = 0; this.align = align; + this.padding = padding; this.fields = fields; } diff --git a/src/java/org/lwjgl/util/mapped/Pointer.java b/src/java/org/lwjgl/util/mapped/Pointer.java index b1434543..305712d4 100644 --- a/src/java/org/lwjgl/util/mapped/Pointer.java +++ b/src/java/org/lwjgl/util/mapped/Pointer.java @@ -37,7 +37,7 @@ import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** - * This annotation can be used on long fields of {@link MappedType} classes, + * This annotation can be used on long fields of {@link MappedObject} subclasses, * to specify that the long value should be interpreted as a pointer. This * will determine the actual byte size of the field at runtime (4 or 8 bytes). *