You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
149 lines
4.5 KiB
149 lines
4.5 KiB
package pavelsobolev.kotogl.Spiral2D
|
|
|
|
import android.opengl.GLES10.GL_LINE_SMOOTH
|
|
import android.opengl.GLES20
|
|
import java.nio.ByteBuffer
|
|
import java.nio.ByteOrder
|
|
import java.nio.FloatBuffer
|
|
|
|
class Spiral
|
|
{
|
|
internal val COORDS_IN_VERTEX = 7
|
|
|
|
private val mVrtxBffr: FloatBuffer
|
|
private val mFloatSize = 4
|
|
private val mCntPoint = 360 * 6
|
|
|
|
val mSpiralVirtices = FloatArray(mCntPoint * COORDS_IN_VERTEX)
|
|
|
|
private var mIncrementalRadius = 0.0f
|
|
private var mSpiralSpan = 0.003f
|
|
|
|
private var mUp = true
|
|
|
|
private val mClrOffset = 3
|
|
|
|
/** Size of the position data in elements. */
|
|
private val mPstnDataSize = 3
|
|
|
|
/** Size of the color data in elements. */
|
|
private val mClrDataSize = 4
|
|
|
|
private val mVrtxShaderCode = "uniform mat4 uMVPMatrix;" +
|
|
"attribute vec4 a_Position;" +
|
|
"attribute vec4 a_Color;" +
|
|
"varying vec4 v_Color;" +
|
|
"void main() {" +
|
|
" v_Color = a_Color;" +
|
|
" gl_Position = uMVPMatrix * a_Position;" +
|
|
"}"
|
|
private val mFrgmntShaderCode = "precision mediump float;" +
|
|
"varying vec4 v_Color;" +
|
|
"void main() {" +
|
|
" gl_FragColor = v_Color;" +
|
|
"}"
|
|
|
|
private val mSdrProgram: Int
|
|
|
|
private var mPstnHandle: Int = 0
|
|
private var mClrHandle: Int = 0
|
|
private var mMVPMtrxHandle: Int = 0
|
|
|
|
private val mVrtxCount = mSpiralVirtices.size / COORDS_IN_VERTEX
|
|
private val mVrtxStride = COORDS_IN_VERTEX * 4 // 4 bytes per vertex
|
|
|
|
init // constructor
|
|
{
|
|
GLES20.glLineWidth(15f)
|
|
|
|
|
|
mIncrementalRadius = 0.0f
|
|
mSpiralSpan = 0.00042f
|
|
|
|
var angl = 0.0f //helper vars
|
|
var color = 0.0f
|
|
var i = 0
|
|
|
|
|
|
// circle for constructing of spiral
|
|
while (i < mCntPoint * COORDS_IN_VERTEX)
|
|
{
|
|
// position
|
|
mSpiralVirtices[i] = mIncrementalRadius * Math.sin(angl.toDouble()).toFloat()
|
|
mSpiralVirtices[i + 1] = mIncrementalRadius * Math.cos(angl.toDouble()).toFloat()
|
|
mSpiralVirtices[i + 2] = 0.0f
|
|
// color
|
|
mSpiralVirtices[i + 3] = color
|
|
mSpiralVirtices[i + 4] = Math.cos(color.toDouble()).toFloat()
|
|
mSpiralVirtices[i + 5] = Math.sin(color.toDouble()).toFloat()
|
|
mSpiralVirtices[i + 6] = 1.0f
|
|
angl += (Math.PI / 180.0).toFloat()
|
|
mIncrementalRadius += mSpiralSpan
|
|
|
|
if (mUp)
|
|
color += 0.1f
|
|
else
|
|
color -= 0.1f
|
|
|
|
if (color == 1f)
|
|
mUp = false
|
|
if (color == 0f)
|
|
mUp = true
|
|
i += COORDS_IN_VERTEX
|
|
|
|
}
|
|
|
|
// construction of buffer
|
|
val bb = ByteBuffer.allocateDirect(mSpiralVirtices.size * mFloatSize)
|
|
bb.order(ByteOrder.nativeOrder())
|
|
mVrtxBffr = bb.asFloatBuffer()
|
|
mVrtxBffr.put(mSpiralVirtices)
|
|
mVrtxBffr.position(0)
|
|
|
|
val vertexShader = MyGLRenderer.loadShader(GLES20.GL_VERTEX_SHADER,
|
|
mVrtxShaderCode)
|
|
val fragmentShader = MyGLRenderer.loadShader(GLES20.GL_FRAGMENT_SHADER,
|
|
mFrgmntShaderCode)
|
|
|
|
mSdrProgram = GLES20.glCreateProgram()
|
|
GLES20.glAttachShader(mSdrProgram, vertexShader)
|
|
GLES20.glAttachShader(mSdrProgram, fragmentShader)
|
|
GLES20.glBindAttribLocation(mSdrProgram, 0, "a_Position")
|
|
GLES20.glBindAttribLocation(mSdrProgram, 1, "a_Color")
|
|
GLES20.glLinkProgram(mSdrProgram)
|
|
}
|
|
|
|
fun getSpiralVirtices(): FloatArray {
|
|
return mSpiralVirtices
|
|
}
|
|
|
|
fun draw(mvpMatrix: FloatArray)
|
|
{
|
|
GLES20.glUseProgram(mSdrProgram)
|
|
|
|
mPstnHandle = GLES20.glGetAttribLocation(mSdrProgram, "a_Position")
|
|
|
|
mVrtxBffr.position(0)
|
|
GLES20.glVertexAttribPointer(mPstnHandle, mPstnDataSize,
|
|
GLES20.GL_FLOAT, false,
|
|
mVrtxStride, mVrtxBffr)
|
|
GLES20.glEnableVertexAttribArray(mPstnHandle)
|
|
|
|
|
|
mClrHandle = GLES20.glGetAttribLocation(mSdrProgram, "a_Color")
|
|
mVrtxBffr.position(mClrOffset)
|
|
GLES20.glVertexAttribPointer(mClrHandle, mClrDataSize, GLES20.GL_FLOAT, false,
|
|
mVrtxStride, mVrtxBffr)
|
|
GLES20.glEnableVertexAttribArray(mClrHandle)
|
|
|
|
mMVPMtrxHandle = GLES20.glGetUniformLocation(mSdrProgram, "uMVPMatrix")
|
|
GLES20.glUniformMatrix4fv(mMVPMtrxHandle, 1, false, mvpMatrix, 0)
|
|
GLES20.glEnable(GL_LINE_SMOOTH)
|
|
|
|
GLES20.glDrawArrays(GLES20.GL_LINE_LOOP, 0, mVrtxCount)
|
|
|
|
GLES20.glDisableVertexAttribArray(mPstnHandle)
|
|
|
|
}
|
|
}
|