1 /* libs/graphics/animator/SkDraw3D.cpp 2 ** 3 ** Copyright 2006, The Android Open Source Project 4 ** 5 ** Licensed under the Apache License, Version 2.0 (the "License"); 6 ** you may not use this file except in compliance with the License. 7 ** You may obtain a copy of the License at 8 ** 9 ** http://www.apache.org/licenses/LICENSE-2.0 10 ** 11 ** Unless required by applicable law or agreed to in writing, software 12 ** distributed under the License is distributed on an "AS IS" BASIS, 13 ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 ** See the License for the specific language governing permissions and 15 ** limitations under the License. 16 */ 17 18 #include "SkDraw3D.h" 19 #include "SkAnimateMaker.h" 20 #include "SkCanvas.h" 21 #include "SkTypedArray.h" 22 23 #if SK_USE_CONDENSED_INFO == 0 24 25 const SkMemberInfo Sk3D_Point::fInfo[] = { 26 SK_MEMBER_ALIAS(x, fPoint.fX, Float), 27 SK_MEMBER_ALIAS(y, fPoint.fY, Float), 28 SK_MEMBER_ALIAS(z, fPoint.fZ, Float) 29 }; 30 31 #endif 32 33 DEFINE_NO_VIRTUALS_GET_MEMBER(Sk3D_Point); 34 35 Sk3D_Point::Sk3D_Point() { 36 fPoint.set(0, 0, 0); 37 } 38 39 #if SK_USE_CONDENSED_INFO == 0 40 41 const SkMemberInfo Sk3D_Camera::fInfo[] = { 42 SK_MEMBER_ALIAS(axis, fCamera.fAxis, 3D_Point), 43 SK_MEMBER(hackHeight, Float), 44 SK_MEMBER(hackWidth, Float), 45 SK_MEMBER_ALIAS(location, fCamera.fLocation, 3D_Point), 46 SK_MEMBER_ALIAS(observer, fCamera.fObserver, 3D_Point), 47 SK_MEMBER(patch, 3D_Patch), 48 SK_MEMBER_ALIAS(zenith, fCamera.fZenith, 3D_Point), 49 }; 50 51 #endif 52 53 DEFINE_GET_MEMBER(Sk3D_Camera); 54 55 Sk3D_Camera::Sk3D_Camera() : hackWidth(0), hackHeight(0), patch(NULL) { 56 } 57 58 Sk3D_Camera::~Sk3D_Camera() { 59 } 60 61 bool Sk3D_Camera::draw(SkAnimateMaker& maker) { 62 fCamera.update(); 63 SkMatrix matrix; 64 fCamera.patchToMatrix(patch->fPatch, &matrix); 65 matrix.preTranslate(hackWidth / 2, -hackHeight / 2); 66 matrix.postTranslate(hackWidth / 2, hackHeight / 2); 67 maker.fCanvas->concat(matrix); 68 return false; 69 } 70 71 72 enum Sk3D_Patch_Functions { 73 SK_FUNCTION(rotateDegrees) 74 }; 75 76 const SkFunctionParamType Sk3D_Patch::fFunctionParameters[] = { 77 (SkFunctionParamType) SkType_Float, 78 (SkFunctionParamType) SkType_Float, 79 (SkFunctionParamType) SkType_Float, 80 (SkFunctionParamType) 0 // terminator for parameter list (there may be multiple parameter lists) 81 }; 82 83 #if SK_USE_CONDENSED_INFO == 0 84 85 const SkMemberInfo Sk3D_Patch::fInfo[] = { 86 SK_MEMBER_ALIAS(origin, fPatch.fOrigin, 3D_Point), 87 SK_MEMBER_FUNCTION(rotateDegrees, Float), 88 SK_MEMBER_ALIAS(u, fPatch.fU, 3D_Point), 89 SK_MEMBER_ALIAS(v, fPatch.fV, 3D_Point) 90 }; 91 92 #endif 93 94 DEFINE_GET_MEMBER(Sk3D_Patch); 95 96 void Sk3D_Patch::executeFunction(SkDisplayable* target, int index, 97 SkTDArray<SkScriptValue>& parameters, SkDisplayTypes type, 98 SkScriptValue* ) { 99 SkASSERT(target == this); 100 switch (index) { 101 case SK_FUNCTION(rotateDegrees): 102 SkASSERT(parameters.count() == 3); 103 SkASSERT(type == SkType_Float); 104 fPatch.rotateDegrees(parameters[0].fOperand.fScalar, 105 parameters[1].fOperand.fScalar, parameters[2].fOperand.fScalar); 106 break; 107 default: 108 SkASSERT(0); 109 } 110 } 111 112 const SkFunctionParamType* Sk3D_Patch::getFunctionsParameters() { 113 return fFunctionParameters; 114 } 115 116 117 118