@@ 154,6 154,7 @@ public class Menu extends ScreenAdapter
names.add("DragAndDropTutorial");
names.add("Box2DControllerTest");
names.add("MinimumTranslationVectorTest");
names.add("SutherlandHodgmanTest");
names.sort();
final List<String> tests = new List<>(skin);
@@ 0,0 1,102 @@
+package net.dermetfan.someLibgdxTests.screens;
+
+import com.badlogic.gdx.Gdx;
+import com.badlogic.gdx.InputAdapter;
+import com.badlogic.gdx.ScreenAdapter;
+import com.badlogic.gdx.graphics.Color;
+import com.badlogic.gdx.graphics.GL20;
+import com.badlogic.gdx.graphics.OrthographicCamera;
+import com.badlogic.gdx.graphics.glutils.ShapeRenderer;
+import com.badlogic.gdx.graphics.glutils.ShapeRenderer.ShapeType;
+import com.badlogic.gdx.math.Polygon;
+import com.badlogic.gdx.math.Vector2;
+import com.badlogic.gdx.scenes.scene2d.utils.UIUtils;
+import com.badlogic.gdx.utils.viewport.ScreenViewport;
+import com.badlogic.gdx.utils.viewport.Viewport;
+import net.dermetfan.gdx.math.GeometryUtils;
+
+public class SutherlandHodgmanTest extends ScreenAdapter {
+
+ Viewport viewport = new ScreenViewport();
+ ShapeRenderer sr = new ShapeRenderer();
+
+ Polygon polygon = new Polygon(new float[] {0, 0, 250, 0, 250, 250, 0, 500} /* ccw */), clipPolygon = new Polygon(new float[] {0, 0, 0, 250, 250, 250, 250, 0} /* cw */);
+
+ public SutherlandHodgmanTest() {
+ Vector2 centroid = new Vector2();
+ com.badlogic.gdx.math.GeometryUtils.polygonCentroid(polygon.getVertices(), 0, polygon.getVertices().length, centroid);
+ polygon.setOrigin(centroid.x, centroid.y);
+ com.badlogic.gdx.math.GeometryUtils.polygonCentroid(clipPolygon.getVertices(), 0, clipPolygon.getVertices().length, centroid);
+ clipPolygon.setOrigin(centroid.x, centroid.y);
+ }
+
+ @Override
+ public void show() {
+ Gdx.input.setInputProcessor(new InputAdapter() {
+ @Override
+ public boolean keyTyped(char character) {
+ if(character == 'c') {
+ float[] clipped = GeometryUtils.clip(polygon.getTransformedVertices(), clipPolygon.getTransformedVertices());
+ GeometryUtils.reset(polygon);
+ polygon.setVertices(clipped);
+ Vector2 centroid = new Vector2();
+ com.badlogic.gdx.math.GeometryUtils.polygonCentroid(clipped, 0, clipped.length, centroid);
+ polygon.setOrigin(centroid.x, centroid.y);
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public boolean scrolled(int amount) {
+ if(UIUtils.ctrl())
+ polygon.setRotation(polygon.getRotation() + amount * 5);
+ else if(UIUtils.shift())
+ clipPolygon.setRotation(clipPolygon.getRotation() + amount * 5);
+ else {
+ ((OrthographicCamera) viewport.getCamera()).zoom += amount / 25f;
+ viewport.apply();
+ }
+ return true;
+ }
+
+ @Override
+ public boolean touchDragged(int screenX, int screenY, int pointer) {
+ if(UIUtils.right()) {
+ OrthographicCamera cam = (OrthographicCamera) viewport.getCamera();
+ cam.position.add(-Gdx.input.getDeltaX(pointer) * cam.zoom, Gdx.input.getDeltaY(pointer) * cam.zoom, 0);
+ viewport.apply();
+ } else {
+ Vector2 tmp = new Vector2();
+ viewport.unproject(tmp.set(screenX, screenY));
+ polygon.setPosition(tmp.x - polygon.getOriginX() * polygon.getScaleX(), tmp.y - polygon.getOriginY() * polygon.getScaleY());
+ }
+ return true;
+ }
+ });
+ }
+
+ @Override
+ public void resize(int width, int height) {
+ viewport.update(width, height);
+ }
+
+ @Override
+ public void render(float delta) {
+ Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
+
+ sr.setProjectionMatrix(viewport.getCamera().combined);
+ sr.begin(ShapeType.Line);
+ sr.setColor(Color.WHITE);
+ sr.polygon(polygon.getTransformedVertices(), 0, polygon.getTransformedVertices().length);
+ sr.setColor(Color.CYAN);
+ sr.polygon(clipPolygon.getTransformedVertices(), 0, clipPolygon.getTransformedVertices().length);
+ sr.end();
+ }
+
+ @Override
+ public void dispose() {
+ sr.dispose();
+ }
+
+}