try fix the slidercones inbetween
This commit is contained in:
parent
580f11a3d3
commit
8f9f16de98
|
@ -20,6 +20,7 @@ package itdelatrisu.opsu.render;
|
||||||
import itdelatrisu.opsu.GameImage;
|
import itdelatrisu.opsu.GameImage;
|
||||||
import itdelatrisu.opsu.Utils;
|
import itdelatrisu.opsu.Utils;
|
||||||
import itdelatrisu.opsu.beatmap.HitObject;
|
import itdelatrisu.opsu.beatmap.HitObject;
|
||||||
|
import itdelatrisu.opsu.objects.Circle;
|
||||||
import itdelatrisu.opsu.objects.curves.Vec2f;
|
import itdelatrisu.opsu.objects.curves.Vec2f;
|
||||||
|
|
||||||
import java.nio.ByteBuffer;
|
import java.nio.ByteBuffer;
|
||||||
|
@ -59,7 +60,6 @@ public class CurveRenderState {
|
||||||
/** The HitObject associated with the curve to be drawn. */
|
/** The HitObject associated with the curve to be drawn. */
|
||||||
protected HitObject hitObject;
|
protected HitObject hitObject;
|
||||||
|
|
||||||
/** The points along the curve to be drawn. */
|
|
||||||
protected Vec2f[] curve;
|
protected Vec2f[] curve;
|
||||||
|
|
||||||
/** The point to which the curve has last been rendered into the texture (as an index into {@code curve}). */
|
/** The point to which the curve has last been rendered into the texture (as an index into {@code curve}). */
|
||||||
|
@ -100,9 +100,16 @@ public class CurveRenderState {
|
||||||
* @param curve the points along the curve to be drawn
|
* @param curve the points along the curve to be drawn
|
||||||
*/
|
*/
|
||||||
public CurveRenderState(HitObject hitObject, Vec2f[] curve) {
|
public CurveRenderState(HitObject hitObject, Vec2f[] curve) {
|
||||||
fbo = null;
|
|
||||||
this.hitObject = hitObject;
|
this.hitObject = hitObject;
|
||||||
this.curve = curve;
|
this.curve = curve;
|
||||||
|
FrameBufferCache cache = FrameBufferCache.getInstance();
|
||||||
|
Rendertarget mapping = cache.get(hitObject);
|
||||||
|
if (mapping == null)
|
||||||
|
mapping = cache.insert(hitObject);
|
||||||
|
fbo = mapping;
|
||||||
|
createVertexBuffer(fbo.getVbo());
|
||||||
|
//write impossible value to make sure the fbo is cleared
|
||||||
|
lastPointDrawn = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -118,18 +125,6 @@ public class CurveRenderState {
|
||||||
t2 = Utils.clamp(t2, 0.0f, 1.0f);
|
t2 = Utils.clamp(t2, 0.0f, 1.0f);
|
||||||
float alpha = color.a;
|
float alpha = color.a;
|
||||||
|
|
||||||
// if this curve hasn't been drawn, draw it and cache the result
|
|
||||||
if (fbo == null) {
|
|
||||||
FrameBufferCache cache = FrameBufferCache.getInstance();
|
|
||||||
Rendertarget mapping = cache.get(hitObject);
|
|
||||||
if (mapping == null)
|
|
||||||
mapping = cache.insert(hitObject);
|
|
||||||
fbo = mapping;
|
|
||||||
createVertexBuffer(fbo.getVbo());
|
|
||||||
//write impossible value to make sure the fbo is cleared
|
|
||||||
lastPointDrawn = -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
int drawFrom = (int) (t1 * curve.length);
|
int drawFrom = (int) (t1 * curve.length);
|
||||||
int drawUpTo = (int) (t2 * curve.length);
|
int drawUpTo = (int) (t2 * curve.length);
|
||||||
|
|
||||||
|
@ -148,6 +143,7 @@ public class CurveRenderState {
|
||||||
GL11.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT);
|
GL11.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT);
|
||||||
}
|
}
|
||||||
if (firstPointDrawn != drawFrom) {
|
if (firstPointDrawn != drawFrom) {
|
||||||
|
firstPointDrawn = drawFrom;
|
||||||
this.renderCurve(color, borderColor, drawFrom, drawUpTo, true);
|
this.renderCurve(color, borderColor, drawFrom, drawUpTo, true);
|
||||||
} else {
|
} else {
|
||||||
this.renderCurve(color, borderColor, lastPointDrawn, drawUpTo, false);
|
this.renderCurve(color, borderColor, lastPointDrawn, drawUpTo, false);
|
||||||
|
@ -273,19 +269,26 @@ public class CurveRenderState {
|
||||||
private void createVertexBuffer(int bufferID) {
|
private void createVertexBuffer(int bufferID) {
|
||||||
int arrayBufferBinding = GL11.glGetInteger(GL15.GL_ARRAY_BUFFER_BINDING);
|
int arrayBufferBinding = GL11.glGetInteger(GL15.GL_ARRAY_BUFFER_BINDING);
|
||||||
FloatBuffer buff = BufferUtils.createByteBuffer(4 * (4 + 2) * (2 * curve.length - 1) * (NewCurveStyleState.DIVIDES + 2)).asFloatBuffer();
|
FloatBuffer buff = BufferUtils.createByteBuffer(4 * (4 + 2) * (2 * curve.length - 1) * (NewCurveStyleState.DIVIDES + 2)).asFloatBuffer();
|
||||||
for (int i = 0; i < curve.length; ++i) {
|
if (curve.length > 0) {
|
||||||
|
fillCone(buff, curve[0].x, curve[0].y);
|
||||||
|
}
|
||||||
|
for (int i = 1; i < curve.length; ++i) {
|
||||||
float x = curve[i].x;
|
float x = curve[i].x;
|
||||||
float y = curve[i].y;
|
float y = curve[i].y;
|
||||||
fillCone(buff, x, y);
|
fillCone(buff, x, y);
|
||||||
if (i != 0) {
|
|
||||||
float last_x = curve[i - 1].x;
|
float last_x = curve[i - 1].x;
|
||||||
float last_y = curve[i - 1].y;
|
float last_y = curve[i - 1].y;
|
||||||
double diff_x = x - last_x;
|
double diff_x = x - last_x;
|
||||||
double diff_y = y - last_y;
|
double diff_y = y - last_y;
|
||||||
|
if (diff_x < Circle.diameter / 8 && diff_y < Circle.diameter / 8) {
|
||||||
x = (float) (x - diff_x / 2);
|
x = (float) (x - diff_x / 2);
|
||||||
y = (float) (y - diff_y / 2);
|
y = (float) (y - diff_y / 2);
|
||||||
fillCone(buff, x, y);
|
} else {
|
||||||
|
x = curve[i+1].x;
|
||||||
|
y = curve[i+1].y;
|
||||||
|
System.out.println("next");
|
||||||
}
|
}
|
||||||
|
fillCone(buff, x, y);
|
||||||
}
|
}
|
||||||
buff.flip();
|
buff.flip();
|
||||||
GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, bufferID);
|
GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, bufferID);
|
||||||
|
|
Loading…
Reference in New Issue
Block a user