diff options
author | Mike Reed <reed@google.com> | 2018-05-30 16:02:48 -0400 |
---|---|---|
committer | Skia Commit-Bot <skia-commit-bot@chromium.org> | 2018-05-30 20:36:08 +0000 |
commit | 27714a026d9178ff7834b87677cbd10bf5150dc7 (patch) | |
tree | 424afe8d98ea19b18d6a3833950bcae9c80fa34c /gm/3dgm.cpp | |
parent | a15cedbc26fee1ba23465aaa0dc46dd0e69996cc (diff) |
3d
Bug: skia:
Change-Id: I10e56f08a2463fcac2b7813d43d0aae35268ac27
Reviewed-on: https://skia-review.googlesource.com/130842
Commit-Queue: Brian Salomon <bsalomon@google.com>
Auto-Submit: Mike Reed <reed@google.com>
Reviewed-by: Brian Salomon <bsalomon@google.com>
Diffstat (limited to 'gm/3dgm.cpp')
-rw-r--r-- | gm/3dgm.cpp | 147 |
1 files changed, 147 insertions, 0 deletions
diff --git a/gm/3dgm.cpp b/gm/3dgm.cpp new file mode 100644 index 0000000000..37830ae878 --- /dev/null +++ b/gm/3dgm.cpp @@ -0,0 +1,147 @@ +/* + * Copyright 2018 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +#include "gm.h" +#include "Sk3D.h" +#include "SkPath.h" +#include "SkPoint3.h" + +class GM3d : public skiagm::GM { + float fNear = 0.5; + float fFar = 4; + float fAngle = SK_ScalarPI / 4; + + SkPoint3 fEye { 0, 0, 4 }; + SkPoint3 fCOA {0,0,0};//{ 0.5f, 0.5f, 0.5f }; + SkPoint3 fUp { 0, 1, 0 }; + + SkMatrix44 fMV; + + SkPoint3 fP3[8]; +public: + GM3d() : fMV(SkMatrix44::kIdentity_Constructor) {} + ~GM3d() override {} + +protected: + void onOnceBeforeDraw() override { + int index = 0; + for (float x = 0; x <= 1; ++x) { + for (float y = 0; y <= 1; ++y) { + for (float z = 0; z <= 1; ++z) { + fP3[index++] = { x, y, z }; + } + } + } + fMV.setIdentity(); + } + + static void draw_viewport(SkCanvas* canvas, const SkMatrix& viewport) { + SkPaint p; + p.setColor(0x10FF0000); + + canvas->save(); + canvas->concat(viewport); + canvas->drawRect({-1, -1, 1, 1}, p); + + p.setColor(0x80FF0000); + canvas->drawLine({-1, -1}, {1, 1}, p); + canvas->drawLine({1, -1}, {-1, 1}, p); + canvas->restore(); + } + + void onDraw(SkCanvas* canvas) override { + SkMatrix44 camera(SkMatrix44::kIdentity_Constructor), + perspective(SkMatrix44::kIdentity_Constructor), + mv = fMV; + SkMatrix viewport; + + { + float w = this->width(); + float h = this->height(); + float s = std::min(w, h); + viewport.setTranslate(1, -1); + viewport.postScale(s/2, -s/2); + + draw_viewport(canvas, viewport); + } + + Sk3Perspective(&perspective, fNear, fFar, fAngle); + Sk3LookAt(&camera, fEye, fCOA, fUp); + mv.postConcat(camera); + mv.postConcat(perspective); + SkPoint pts[8]; + Sk3MapPts(pts, mv, fP3, 8); + viewport.mapPoints(pts, 8); + + SkPaint paint; + paint.setStyle(SkPaint::kStroke_Style); + + SkPath cube; + + cube.moveTo(pts[0]); + cube.lineTo(pts[2]); + cube.lineTo(pts[6]); + cube.lineTo(pts[4]); + cube.close(); + + cube.moveTo(pts[1]); + cube.lineTo(pts[3]); + cube.lineTo(pts[7]); + cube.lineTo(pts[5]); + cube.close(); + + cube.moveTo(pts[0]); cube.lineTo(pts[1]); + cube.moveTo(pts[2]); cube.lineTo(pts[3]); + cube.moveTo(pts[4]); cube.lineTo(pts[5]); + cube.moveTo(pts[6]); cube.lineTo(pts[7]); + + canvas->drawPath(cube, paint); + + { + SkPoint3 src[4] = { + { 0, 0, 0 }, { 2, 0, 0 }, { 0, 2, 0 }, { 0, 0, 2 }, + }; + SkPoint dst[4]; + mv.setConcat(perspective, camera); + Sk3MapPts(dst, mv, src, 4); + viewport.mapPoints(dst, 4); + const char str[] = "XYZ"; + for (int i = 1; i <= 3; ++i) { + canvas->drawLine(dst[0], dst[i], paint); + } + + for (int i = 1; i <= 3; ++i) { + canvas->drawText(&str[i-1], 1, dst[i].fX, dst[i].fY, paint); + } + } + } + + SkISize onISize() override { return { 1024, 768 }; } + + SkString onShortName() override { return SkString("3dgm"); } + + bool onAnimate(const SkAnimTimer&) override { return false; } + bool onHandleKey(SkUnichar uni) override { + switch (uni) { + case 'a': fEye.fX += 0.125f; return true; + case 'd': fEye.fX -= 0.125f; return true; + case 'w': fEye.fY += 0.125f; return true; + case 's': fEye.fY -= 0.125f; return true; + case 'q': fEye.fZ += 0.125f; return true; + case 'z': fEye.fZ -= 0.125f; return true; + default: break; + } + return false; + } + + bool onGetControls(SkMetaData*) override { return false; } + void onSetControls(const SkMetaData&) override { + + } +}; + +DEF_GM(return new GM3d;) |