commit 35268ac94c3311255360cfe7c020559c6bea1a0a
Author: leszek <leszek@koltunski.pl>
Date:   Thu Dec 4 11:20:56 2025 +0100

    remove the last instances of 'import java' from the library. Now only a single package - 'platform' - imports anything 'android' or 'java'

diff --git a/src/main/java/org/distorted/library/effect/PostprocessEffect.kt b/src/main/java/org/distorted/library/effect/PostprocessEffect.kt
index 232d76a..39006f9 100644
--- a/src/main/java/org/distorted/library/effect/PostprocessEffect.kt
+++ b/src/main/java/org/distorted/library/effect/PostprocessEffect.kt
@@ -25,12 +25,9 @@ import org.distorted.library.main.DistortedFramebuffer
 import org.distorted.library.main.DistortedLibrary
 import org.distorted.library.main.InternalMaster
 import org.distorted.library.main.InternalMaster.Slave
+import org.distorted.library.platform.NativeBuffer
 import org.distorted.library.program.DistortedProgram
 
-import java.nio.ByteBuffer
-import java.nio.ByteOrder
-import java.nio.FloatBuffer
-
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 /**
  * Abstract class that represents an Effect that works by running a certain Shader Program(s) on a Framebuffer.
@@ -70,20 +67,16 @@ abstract class PostprocessEffect internal constructor(name: EffectName) : Effect
         const val POS_DATA_SIZE: Int = 2
         const val TEX_DATA_SIZE: Int = 2
 
-        val mQuadPositions: FloatBuffer
-        val mQuadTexture: FloatBuffer
+        val mQuadPositions: NativeBuffer
+        val mQuadTexture  : NativeBuffer
 
         init
         {
-            val dataLength = 4*4
-
             val position   = floatArrayOf(-0.5f,-0.5f,-0.5f, 0.5f, 0.5f,-0.5f, 0.5f, 0.5f)
             val textureNor = floatArrayOf( 0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f, 1.0f)
 
-            mQuadPositions = ByteBuffer.allocateDirect(POS_DATA_SIZE*dataLength).order(ByteOrder.nativeOrder()).asFloatBuffer()
-            mQuadPositions.put(position).position(0)
-            mQuadTexture = ByteBuffer.allocateDirect(TEX_DATA_SIZE*dataLength).order(ByteOrder.nativeOrder()).asFloatBuffer()
-            mQuadTexture.put(textureNor).position(0)
+            mQuadPositions = NativeBuffer(position)
+            mQuadTexture   = NativeBuffer(textureNor)
         }
 
         var mPrograms: ArrayList<DistortedProgram> = ArrayList()
diff --git a/src/main/java/org/distorted/library/main/DistortedLibrary.kt b/src/main/java/org/distorted/library/main/DistortedLibrary.kt
index 90c8ba0..f9e5fe7 100644
--- a/src/main/java/org/distorted/library/main/DistortedLibrary.kt
+++ b/src/main/java/org/distorted/library/main/DistortedLibrary.kt
@@ -42,15 +42,12 @@ import org.distorted.library.mesh.MeshBase
 import org.distorted.library.mesh.MeshBase.Companion.maxEffComponents
 import org.distorted.library.mesh.MeshBase.Companion.useCenters
 import org.distorted.library.message.EffectMessageSender
+import org.distorted.library.platform.NativeBuffer
 import org.distorted.library.program.DistortedProgram
 import org.distorted.library.program.VertexCompilationException
 import org.distorted.library.type.Dynamic
 import org.distorted.library.shaders.*
 
-import java.nio.ByteBuffer
-import java.nio.ByteOrder
-import java.nio.FloatBuffer
-
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 /**
  * A singleton class used to control various global settings.
@@ -195,7 +192,7 @@ object DistortedLibrary
     private var mBlitProgram: DistortedProgram? = null
     private var mBlitTextureH = 0
     private var mBlitDepthH = 0
-    private var mQuadPositions: FloatBuffer
+    private var mQuadPositions: NativeBuffer
 
     /** FULL PROGRAM /// */
     private var mFullProgram: DistortedProgram? = null
@@ -203,8 +200,7 @@ object DistortedLibrary
     init
     {
         val positionData = floatArrayOf(-0.5f, -0.5f, -0.5f, 0.5f, 0.5f, -0.5f, 0.5f, 0.5f)
-        mQuadPositions = ByteBuffer.allocateDirect(32).order(ByteOrder.nativeOrder()).asFloatBuffer()
-        mQuadPositions.put(positionData).position(0)
+        mQuadPositions = NativeBuffer(positionData)
     }
 
     /** BLIT DEPTH PROGRAM /// */
@@ -708,29 +704,6 @@ object DistortedLibrary
         }
     }
 
-    ///////////////////////////////////////////////////////////////////////////////////////////////////
-    // yes it is safe to be mixing 3.0 and 3.1 like that, senior members of the OpenGL discussions forum assert
-    private fun printPreviousBuffer(): Int
-    {
-        val atomicBuf = GLES.glMapBufferRange(GLES.GL_ATOMIC_COUNTER_BUFFER, 0, 4, GLES.GL_MAP_READ_BIT)
-        val atomicIntBuf = atomicBuf.order(ByteOrder.nativeOrder()).asIntBuffer()
-        val counter = atomicIntBuf[0]
-
-        GLES.glUnmapBuffer(GLES.GL_ATOMIC_COUNTER_BUFFER)
-
-        return counter
-    }
-
-    ///////////////////////////////////////////////////////////////////////////////////////////////////
-    private fun zeroBuffer()
-    {
-        val atomicBuf = GLES.glMapBufferRange(GLES.GL_ATOMIC_COUNTER_BUFFER, 0, 4, GLES.GL_MAP_WRITE_BIT or GLES.GL_MAP_INVALIDATE_BUFFER_BIT)
-        val atomicIntBuf = atomicBuf.order(ByteOrder.nativeOrder()).asIntBuffer()
-        atomicIntBuf.put(0, 0)
-
-        GLES.glUnmapBuffer(GLES.GL_ATOMIC_COUNTER_BUFFER)
-    }
-
     ///////////////////////////////////////////////////////////////////////////////////////////////////
     // reset atomic counter to 0
     fun zeroOutAtomic(): Int
@@ -747,7 +720,7 @@ object DistortedLibrary
             {
                 GLES.glBindBuffer(GLES.GL_ATOMIC_COUNTER_BUFFER, mAtomicCounter!![i])
                 GLES.glBufferData(GLES.GL_ATOMIC_COUNTER_BUFFER, 4, null, GLES.GL_DYNAMIC_DRAW)
-                zeroBuffer()
+                GLES.zeroBuffer()
             }
         }
 
@@ -756,13 +729,13 @@ object DistortedLibrary
         if (mCurrBuffer==0)
         {
             GLES.glBindBufferBase(GLES.GL_ATOMIC_COUNTER_BUFFER, 0, mAtomicCounter!![mCurrBuffer])
-            counter = printPreviousBuffer()
+            counter = GLES.printPreviousBuffer()
         }
 
         if (++mCurrBuffer>=queueSize) mCurrBuffer = 0
 
         GLES.glBindBufferBase(GLES.GL_ATOMIC_COUNTER_BUFFER, 0, mAtomicCounter!![mCurrBuffer])
-        zeroBuffer()
+        GLES.zeroBuffer()
 
         return counter
     }
diff --git a/src/main/java/org/distorted/library/main/InternalBuffer.kt b/src/main/java/org/distorted/library/main/InternalBuffer.kt
index 4af4532..1d2814f 100644
--- a/src/main/java/org/distorted/library/main/InternalBuffer.kt
+++ b/src/main/java/org/distorted/library/main/InternalBuffer.kt
@@ -20,12 +20,7 @@
 package org.distorted.library.main
 
 import org.distorted.library.platform.GLES
-
-import java.nio.Buffer
-import java.nio.ByteBuffer
-import java.nio.ByteOrder
-import java.nio.FloatBuffer
-import java.nio.IntBuffer
+import org.distorted.library.platform.NativeBuffer
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 /**
@@ -43,7 +38,7 @@ class InternalBuffer : InternalObject
     private val mIndex : IntArray
     private val mTarget: Int
     private val mUsage : Int
-    private var mBuffer: Buffer?
+    private var mBuffer: NativeBuffer?
 
     companion object
     {
@@ -80,17 +75,7 @@ class InternalBuffer : InternalObject
         if( (mStatus and RECREATE)!=0 )
         {
             mSize = size
-
-            if (buffer!=null)
-            {
-                val buf = ByteBuffer.allocateDirect(size).order(ByteOrder.nativeOrder()).asFloatBuffer()
-                buf.put(buffer).position(0)
-                mBuffer = buf
-            }
-            else
-            {
-                mBuffer = null
-            }
+            mBuffer = buffer?.let { NativeBuffer(it) }
 
             GLES.glGenBuffers(1, mIndex, 0)
             GLES.glBindBuffer(mTarget, mIndex[0])
@@ -116,17 +101,7 @@ class InternalBuffer : InternalObject
         if ((mStatus and RECREATE)!=0)
         {
             mSize = size
-
-            if (buffer!=null)
-            {
-                val buf = ByteBuffer.allocateDirect(size).order(ByteOrder.nativeOrder()).asIntBuffer()
-                buf.put(buffer).position(0)
-                mBuffer = buf
-            }
-            else
-            {
-                mBuffer = null
-            }
+            mBuffer = buffer?.let { NativeBuffer(it) }
 
             GLES.glGenBuffers(1, mIndex, 0)
             GLES.glBindBuffer(mTarget, mIndex[0])
@@ -149,7 +124,7 @@ class InternalBuffer : InternalObject
     // buffer non-null!!
     fun updateFloat(buffer: FloatArray?)
     {
-        (mBuffer as FloatBuffer).put(buffer).position(0)
+        mBuffer?.update(buffer)
 
         GLES.glBindBuffer(mTarget, mIndex[0])
         GLES.glBufferData(mTarget, mSize, mBuffer, mUsage)
@@ -162,7 +137,7 @@ class InternalBuffer : InternalObject
     // buffer non-null!!
     fun updateInt(buffer: IntArray?)
     {
-        (mBuffer as IntBuffer).put(buffer).position(0)
+        mBuffer?.update(buffer)
 
         GLES.glBindBuffer(mTarget, mIndex[0])
         GLES.glBufferData(mTarget, mSize, mBuffer, mUsage)
diff --git a/src/main/java/org/distorted/library/mesh/MeshBase.kt b/src/main/java/org/distorted/library/mesh/MeshBase.kt
index d4a0949..b2b3082 100644
--- a/src/main/java/org/distorted/library/mesh/MeshBase.kt
+++ b/src/main/java/org/distorted/library/mesh/MeshBase.kt
@@ -33,8 +33,6 @@ import org.distorted.library.type.Static4D
 import org.distorted.library.uniformblock.UniformBlockAssociation
 import org.distorted.library.uniformblock.UniformBlockCenter
 
-import java.nio.ByteOrder
-
 import kotlin.math.min
 import kotlin.math.sqrt
 
@@ -79,7 +77,7 @@ abstract class MeshBase
 
         const val VERT1_ATTRIBS: Int = POS_DATA_SIZE+NOR_DATA_SIZE // number of attributes of a vertex (the part changed by preapply)
         const val VERT2_ATTRIBS: Int = TEX_DATA_SIZE+COM_DATA_SIZE // number of attributes of a vertex (the 'preapply invariant' part)
-        const val TRAN_ATTRIBS: Int = POS_DATA_SIZE+NOR_DATA_SIZE // number of attributes of a transform feedback vertex
+        const val TRAN_ATTRIBS : Int = POS_DATA_SIZE+NOR_DATA_SIZE // number of attributes of a transform feedback vertex
 
         private const val BYTES_PER_FLOAT = 4
 
@@ -639,14 +637,8 @@ abstract class MeshBase
      */
     fun copyTransformToVertex()
     {
-        val buffer = GLES.glMapBufferRange(GLES.GL_TRANSFORM_FEEDBACK_BUFFER, 0,
-                                             TRAN_SIZE*numVertices, GLES.GL_MAP_READ_BIT)
-
-        val feedback = buffer.order(ByteOrder.nativeOrder()).asFloatBuffer()
-        feedback[mVertAttribs1, 0, VERT1_ATTRIBS*numVertices]
+        GLES.copyTransformToVertex(mVertAttribs1!!, VERT1_ATTRIBS*numVertices)
         mVBO1.updateFloat(mVertAttribs1)
-
-        GLES.glUnmapBuffer(GLES.GL_TRANSFORM_FEEDBACK_BUFFER)
     }
 
     ///////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/main/java/org/distorted/library/platform/GLES.kt b/src/main/java/org/distorted/library/platform/GLES.kt
index d2a782a..03889fb 100644
--- a/src/main/java/org/distorted/library/platform/GLES.kt
+++ b/src/main/java/org/distorted/library/platform/GLES.kt
@@ -25,7 +25,7 @@ import android.opengl.GLUtils
 
 import java.nio.Buffer
 import java.nio.ByteBuffer
-import java.nio.FloatBuffer
+import java.nio.ByteOrder
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
@@ -133,14 +133,6 @@ object GLES
    {
         GLES31.glGetActiveUniformsiv(programH,uniformCount,uniformIndices,uIndex,pname,params,pIndex)
    }
-   fun glMapBufferRange(target: Int, offset: Int, length: Int, access: Int) : ByteBuffer
-   {
-        return GLES31.glMapBufferRange(target,offset,length,access) as ByteBuffer
-   }
-   fun glUnmapBuffer(target: Int)
-   {
-        GLES31.glUnmapBuffer(target)
-   }
    fun glBindBufferBase(target: Int, index: Int, buffer: Int)
    {
         GLES31.glBindBufferBase(target, index, buffer)
@@ -153,9 +145,9 @@ object GLES
    {
         GLES31.glBindBuffer(target, buffer)
    }
-   fun glVertexAttribPointer(indx: Int, size: Int, type: Int, normalized: Boolean, stride: Int, ptr: FloatBuffer)
+   fun glVertexAttribPointer(indx: Int, size: Int, type: Int, normalized: Boolean, stride: Int, ptr: NativeBuffer)
    {
-        GLES31.glVertexAttribPointer(indx, size, type, normalized, stride, ptr)
+        GLES31.glVertexAttribPointer(indx, size, type, normalized, stride, ptr.fb )
    }
    fun glVertexAttribPointer(indx: Int, size: Int, type: Int, normalized: Boolean, stride: Int, offset: Int)
    {
@@ -241,9 +233,17 @@ object GLES
    {
         GLES31.glGenBuffers(n, buffers, offset)
    }
-   fun glBufferData(target: Int, size: Int, data: Buffer?, usage: Int)
+   fun glBufferData(target: Int, size: Int, data: NativeBuffer?, usage: Int)
    {
-        GLES31.glBufferData(target, size, data, usage)
+        var buf: Buffer? = null
+
+        if( data!=null )
+        {
+                 if( data.ib!=null ) buf = data.ib
+            else if( data.fb!=null ) buf = data.fb
+        }
+
+        GLES31.glBufferData(target, size, buf, usage)
    }
    fun glDeleteBuffers(n: Int, buffers: IntArray, offset: Int)
    {
@@ -293,9 +293,9 @@ object GLES
    {
         GLES31.glTexParameterf(target, pname, param)
    }
-   fun glTexImage2D(target: Int, level: Int, internalformat: Int, width: Int, height: Int, border: Int, format: Int, type: Int, pixels: ByteBuffer?)
+   fun glTexImage2D(target: Int, level: Int, internalformat: Int, width: Int, height: Int, border: Int, format: Int, type: Int, pixels: NativeBuffer?)
    {
-        GLES31.glTexImage2D(target, level, internalformat, width, height, border, format, type, pixels)
+        GLES31.glTexImage2D(target, level, internalformat, width, height, border, format, type, pixels?.bb)
    }
    fun glDisable(cap: Int)
    {
@@ -353,6 +353,40 @@ object GLES
    fun glGetAttribLocation(program: Int, name: String): Int             = GLES31.glGetAttribLocation(program,name)
    fun glCreateProgram(): Int                                           = GLES31.glCreateProgram()
 
+   ///////////////////////////////////////////////////////////////////////////////////////////////////
+   fun printPreviousBuffer(): Int
+   {
+        val atomicBuf = GLES31.glMapBufferRange(GLES31.GL_ATOMIC_COUNTER_BUFFER, 0, 4, GLES31.GL_MAP_READ_BIT)
+        val atomicIntBuf = (atomicBuf as ByteBuffer).order(ByteOrder.nativeOrder()).asIntBuffer()
+        val counter = atomicIntBuf[0]
+
+        GLES31.glUnmapBuffer(GLES31.GL_ATOMIC_COUNTER_BUFFER)
+
+        return counter
+   }
+
+   ///////////////////////////////////////////////////////////////////////////////////////////////////
+   fun zeroBuffer()
+   {
+        val atomicBuf = GLES31.glMapBufferRange(GLES31.GL_ATOMIC_COUNTER_BUFFER, 0, 4, GLES31.GL_MAP_WRITE_BIT or GLES31.GL_MAP_INVALIDATE_BUFFER_BIT)
+        val atomicIntBuf = (atomicBuf as ByteBuffer).order(ByteOrder.nativeOrder()).asIntBuffer()
+        atomicIntBuf.put(0, 0)
+
+        GLES31.glUnmapBuffer(GLES31.GL_ATOMIC_COUNTER_BUFFER)
+   }
+
+   ///////////////////////////////////////////////////////////////////////////////////////////////////
+   fun copyTransformToVertex(buf: FloatArray, size: Int)
+   {
+        val buffer = GLES31.glMapBufferRange(GLES31.GL_TRANSFORM_FEEDBACK_BUFFER, 0,
+                                             4*size, GLES31.GL_MAP_READ_BIT)
+
+        val feedback = (buffer as ByteBuffer).order(ByteOrder.nativeOrder()).asFloatBuffer()
+        feedback[buf, 0, size]
+
+        GLES31.glUnmapBuffer(GLES31.GL_TRANSFORM_FEEDBACK_BUFFER)
+   }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 // GLUtils
 
diff --git a/src/main/java/org/distorted/library/platform/NativeBuffer.kt b/src/main/java/org/distorted/library/platform/NativeBuffer.kt
new file mode 100644
index 0000000..3871248
--- /dev/null
+++ b/src/main/java/org/distorted/library/platform/NativeBuffer.kt
@@ -0,0 +1,57 @@
+///////////////////////////////////////////////////////////////////////////////////////////////////
+// Copyright 2025 Leszek Koltunski  leszek@koltunski.pl                                          //
+//                                                                                               //
+// This file is part of Distorted.                                                               //
+//                                                                                               //
+// This library is free software; you can redistribute it and/or                                 //
+// modify it under the terms of the GNU Lesser General Public                                    //
+// License as published by the Free Software Foundation; either                                  //
+// version 2.1 of the License, or (at your option) any later version.                            //
+//                                                                                               //
+// This library is distributed in the hope that it will be useful,                               //
+// but WITHOUT ANY WARRANTY; without even the implied warranty of                                //
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU                             //
+// Lesser General Public License for more details.                                               //
+//                                                                                               //
+// You should have received a copy of the GNU Lesser General Public                              //
+// License along with this library; if not, write to the Free Software                           //
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA                //
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+package org.distorted.library.platform
+
+import java.nio.ByteBuffer
+import java.nio.IntBuffer
+import java.nio.FloatBuffer
+import java.nio.ByteOrder
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+class NativeBuffer()
+{
+    var bb: ByteBuffer?  = null
+    var ib: IntBuffer?   = null
+    var fb: FloatBuffer? = null
+
+    constructor(b: IntArray): this()
+    {
+        ib = ByteBuffer.allocateDirect(4*b.size).order(ByteOrder.nativeOrder()).asIntBuffer()
+        ib!!.put(b).position(0)
+    }
+
+    constructor(b: FloatArray) : this()
+    {
+        fb = ByteBuffer.allocateDirect(4*b.size).order(ByteOrder.nativeOrder()).asFloatBuffer()
+        fb!!.put(b).position(0)
+    }
+
+    fun update(b: FloatArray?)
+    {
+        fb?.put(b)?.position(0)
+    }
+
+    fun update(b: IntArray?)
+    {
+        ib?.put(b)?.position(0)
+    }
+}
\ No newline at end of file
