• Stars
    star
    312
  • Rank 134,133 (Top 3 %)
  • Language Vue
  • License
    Other
  • Created over 7 years ago
  • Updated 5 months ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Create animoji easily

http://zk-phi.github.io/MEGAMOJI

開発者向け

新しいアイデアや新しいクソアニメを実装したらぜひ PR ください!

開発環境

dev server

npm install
npm run start

するとサーバーが立ち上がります。 https://localhost:8080 で確認できます。

ソースをいじるとすぐに反映されます。

M1 Mac で npm install にコケる場合

node-canvas パッケージが arm64 に対応していないのが原因の可能性があります。

x86_64 な node を入れてみてください。

asdf でインストールする例:

arch -x86_64 asdf install nodejs <version>

ビルド

npm run build

ビルドすると ./dist ができます。そのまま静的サイトとしてデプロイできます。

lint

npm run lint

コーディングスタイルの揺れなどを自動検出します。

npm run fix

で大部分は自動修正できます。

プルリクを送る前に走らせておくのがおすすめです。

Workflows

GitHub Actions を使って自動でビルドしたり、 lint をかけたりするようにしてあります。

  • lint … master を push したときに npm run lint
  • lint-pr … プルリクを作ったときに reviewdog 経由で eslint, stylelint を回す
  • build … master を push したときに npm run lint して gh-pages に push

ビルド時、 GitHub Secrets に ROLLBAR_TOKEN をセットしておくと、エラーを rollbar から確認できます。

ディレクトリ構成

  • src/
    • animations/ … 個別のアニメーションの実装が入っています
    • components/ … UI 部品が入っています
    • constants/ … 定数類が入っています
    • effects/ … エフェクトの実装が入っています
    • filters/ … フィルタの実装が入っています
    • fonts/ … web font が入っています
    • parts/ … 「パーツから選ぶ」で使用するパーツ画像が入っています
    • samples/ … チュートリアルで使っているサンプルが入っています
    • shaders/ … WebGL エフェクトで使うフラグメントシェーダーが入っています
    • utils/ … 便利関数たちが入っています
    • webgleffects/ … WebGL エフェクトの実装が入っています
    • megamoji.js … エントリポイントです
    • types.js … エフェクトなどの型定義が入っています
  • static/ … html など特にビルドせずにそのまま配信できるものが入っています
  • resources/ … ドキュメントで使う画像などアプリと関係ないものが雑に入っています

フィルタの追加

src/constants/filters.js に一覧があります。

フィルタの実体は1引数の関数です。

HTMLImageElement が渡ってくるので、適宜画像処理をして、できあがった画像を BlobURL で返します。

エフェクトの追加

src/constants/effects.js に一覧があります。

エフェクトの実体は5引数の関数です:

keyframe
アニメーションの進行具合 (0.0 ~ 1.0 の浮動小数)
ctx
CanvasRenderingContext2D のオブジェクト
cellWidth
canvas の横幅
cellHeight
canvas の高さ

背景が塗りつぶされたあと、 drawImage される直前の ctx が渡ってくる ので、 transform, filter, clip など好みの変形をセットしてくださ い。 エフェクトは複数併用することを想定しているので、 setTransform など他のエフェクトが加えた効果をアンドゥしてしまうようなメソッドを呼ぶ ことは避けてください。

渡ってくる canvas は、最終的に絵文字としてレンダーされるものの4倍 (縦横それぞれ2倍)の大きさになっていることに注意してください。

+--------+
|        | <- cellHeight / 4 の余白
| +----+ |
| |    | | <- cellHeight / 2
| |    | |    最終的に絵文字に使われる部分
| +----+ |
|        | <- cellHeight / 4 の余白
+--------+

たとえば絵文字を上にスライドアウトさせたい場合、 cellHeight / 2 だけ (cellHeight ではなく) 上に translate してあげれば十分です

余白をトリミングする前の canvas の様子が見たい場合は、「効果をつける」 の「詳細オプション>開発者モード」にある「余白を切らない」を有効に してください。

===

仕様の背景:

びよんびよん などの拡大縮小 (特に縮小) や回転を伴うエフェクトを組み 合わせると、本来絵文字として使われる範囲外の、余白部分までチラ見えして しまうことがあります。このような場合でもアニメーションを綺麗に見せるた め、内部ではいったん、最終的に絵文字に使われる範囲より外まではみ出して レンダリングしてから、あとで余白をカットしています。

わかりづらい仕様なのでなんとかしたい気持ちはありますが、上手い方法が思 いついていないです。

アニメーションの追加

src/constants/animations.js に一覧があります。

アニメーションの実体は5引数の関数です:

keyframe
(effect_ と同様)
ctx
(effect_ と同様)
image
アニメーションさせたい元画像
offsetH
元画像の描画したい範囲(左端)
offsetV
元画像の描画したい範囲(上端)
width
元画像の描画したい範囲 (幅)
height
元画像の描画したい範囲 (高さ)
cellWidth
(effect_ と同様)
cellHeight
(effect_ と同様)

アニメーションは、渡ってきた canvas に対して、 ctx.drawImage などを 使って実際に画像 image をレンダリングするします。ユーザーの設定した トリミング範囲が offsetH, offsetV, width, height として渡ってくるので、 通常、 canvas に対するレンダリングは以下の形になります (効果の一環 として、あえてそうしないことは可能です):

ctx.drawImage(image, offsetH, offsetV, width, height, ...);

アニメーションに渡される canvas もエフェクトと同様、実際に絵文字として 出力されるものの4倍の大きさを持っています。

+--------+
|        | <- cellHeight / 4 の余白
| +----+ |
| |    | | <- cellHeight / 2
| |    | |    最終的に絵文字に使われる部分
| +----+ |
|        | <- cellHeight / 4 の余白
+--------+

たとえば、ただ画面の中央に通常のサイズで絵文字を描画したいだけの場合 (なにもしないアニメーション)、実装は次のようになります:

ctx.drawImage(..., cellWidth / 4, cellHeight / 4, cellWidth / 2, cellHeight / 2);

エフェクトと比べると、レンダリング方法を自由に実装できる点で自由度が高 いです (2つ重ねてレンダリングするなど、単純な変形だけでは実現できない 効果を実装できる)。ただし、他のアニメーションと組み合わせることはでき なくなってしまうので、エフェクトとして同じ効果を実装することができない か、一度は検討してみてください。

WebGL エフェクトの追加

src/constants/webgleffects.js に一覧があります。

Canvas の基本的な変形機能だけでは実装できないエフェクトを WebGL で実装できます。

WebGL エフェクトの実体は4引数の関数です:

  • keyframe
  • cellWidth
  • cellHeight

シェーダをロードして、適切なパラメータをセットして返してください。

// 例
import { webglLoadEffectShader, webglSetVec2 } from '../utils/webgl';
import fooShader from '../shaders/foo';
function webglZoom (keyframe, _w, _h, args) {
  const program = webglLoadEffectShader(fooShader);
  webglSetVec2(program, 'center', keyframe, 0.5);
  return program;
}

シェーダーは src/shaders にあります (追加しても OK です)。

追加する場合は webglEffectShader というラッパー関数があるので、これに 生の GLSL コードを投げつけてください。

const myShader = webglEffectShader(`
  <GLSL code>
`);

よく使う関数 (疑似乱数など) は src/shaders/utils にあります。

画像は例によって4倍サイズでレンダーされます。

フォントの追加

読み込みが遅くなるので慎重に。

以下のフォントは入れないことにしています:

  • アイコンサイズに縮小すると読めない
  • 収録漢字が少ない
  • 他のフォントと使いたい場面が被る

フォントのライセンスをよく確認 (再配布可?改変 (woff 化) 可?) した上で、 woff 化したフォントを src/fonts に入れてください。

SIL Open Font License でライセンスされたフォントのうち、ライセンスに 「with Reserved Font Name …」が含まれているものは原則使用しません (woff 化にあたってフォント名を変える必要があり、面倒なため)。

woff 化にはこれ https://github.com/zk-phi/woff2sfnt-sfnt2woff を使っています。

node sfnt2woff.js hoge.ttf hoge.woff

フォントを入れたら2つのファイルを更新してください。

  • src/constants/fonts.ts
  • LICENSE.markdown

ライセンス表記時の作者名は、アカウント名などから適当に持ってくるのではなく、 なるべく正式な表記を探してコピーしてください。

More Repositories

1

sublimity

Smooth-scrolling and minimap like sublime editor
Emacs Lisp
483
star
2

indent-guide

Show vertical lines to guide indentation
Emacs Lisp
348
star
3

symon

Tiny graphical system monitor
Emacs Lisp
292
star
4

magic-latex-buffer

Magical syntax highlighting for LaTeX-mode buffers
Emacs Lisp
152
star
5

togetherly

Allow multiple clients to edit a single file on-line
Emacs Lisp
143
star
6

phi-search

Another incremental search command, compatible with “multiple-cursors”
Emacs Lisp
119
star
7

sky-color-clock

A clock widget for modelines with real-time sky color and moonphase/weather icon
Emacs Lisp
108
star
8

git-complete

Yet another completion engine powered by "git grep"
Emacs Lisp
66
star
9

ewow

Use Emacs command (almost) everywhere
AutoHotkey
60
star
10

electric-align

Insert a certain amout of spaces at once to easily align columns
Emacs Lisp
52
star
11

scad-preview

Preview SCAD models in real-time in Emacs
Emacs Lisp
43
star
12

setup

Helper macros to write faster, portable and robust init script
Emacs Lisp
40
star
13

bfbuilder

A brainfuck development environment with interactive debugger
Emacs Lisp
39
star
14

lenlen-theme

A solarized-based kawaii light theme
Emacs Lisp
31
star
15

phi-grep

Interactively-editable recursive grep implementation in elisp
Emacs Lisp
30
star
16

electric-case

Insert camelCase, snake_case words without "Shift"ing
Emacs Lisp
26
star
17

ac-c-headers

auto-complete source for C headers and symbols in headers
Emacs Lisp
25
star
18

spray

[Emacs] An elisp implementation of OpenSpritz
Emacs Lisp
24
star
19

jaword

Minor-mode for handling Japanese words better
Emacs Lisp
23
star
20

cedit

paredit-like commands for C-like languages
Emacs Lisp
22
star
21

highlight-stages

Highlight staged (quasi-quoted) expressions
Emacs Lisp
21
star
22

elemental-theme

WIP An elemental theme
Emacs Lisp
20
star
23

download-region

Simple in-buffer download manager for Emacs
Emacs Lisp
15
star
24

rpn-calc

Handy RPN calculator for hackers
Emacs Lisp
12
star
25

1x2x3-keyboard

DIY keyboard for everyone
OpenSCAD
12
star
26

company-anywhere

enable company in middle of symbols
Emacs Lisp
11
star
27

CHUNITHMRateAnalyzer

[Game]
JavaScript
11
star
28

dotfiles

Emacs Lisp
11
star
29

phi-rectangle

Another rectangle-mark command
Emacs Lisp
11
star
30

scratch-pop

Popup scratch buffer
Emacs Lisp
9
star
31

switch42-keyboard

My first DIY keyboard / 3x6+3 split ortho
OpenSCAD
9
star
32

automargin

[Emacs] Automatically add margins to windows
Emacs Lisp
8
star
33

gemini-keyboard

My endgame split ergo of this month
Shell
7
star
34

key-chord

zk-phi's fork of key-chord with `safety-interval'
Emacs Lisp
6
star
35

company-dwim

company port of ac-dwim
Emacs Lisp
6
star
36

scratch-palette

Add notes on each files
Emacs Lisp
6
star
37

electric-spacing

Insert spaces automatically between user-defined patterns
Emacs Lisp
5
star
38

composition-keyboard

A ChocV2 ortho
Shell
5
star
39

pollux-keyboard

A row staggered narrow-pitched 3 x 6 + 2 split
OpenSCAD
5
star
40

CHUNITHMRateAnalyzerSTAR

[Game] I am a star
JavaScript
5
star
41

phi-kbd-library

zk-phi's keyboard library for KiCAD
OpenSCAD
4
star
42

philisp

WIP zk_phi's experiment towards a simple, happy-hacking language
C
4
star
43

git-context-switch

context switch for git
Emacs Lisp
4
star
44

company-same-mode-buffers

Company backend like `ac-source-words-in-same-mode-buffers'
Emacs Lisp
4
star
45

phi-autopair

Anohter simple-minded autopiar
Emacs Lisp
3
star
46

phi-search-migemo

migemo extension for phi-search
Emacs Lisp
3
star
47

outlined-elisp-mode

outline-minor-mode settings for emacs lisp
Emacs Lisp
3
star
48

kastor-keyboard

3 rows keyboard with thumb keys
OpenSCAD
3
star
49

equilibrium-keyboard

A compact transparent keyboard
Shell
3
star
50

gitmole

WIP Interactive recursive blame tool for digging into git repos
Emacs Lisp
3
star
51

ewow-evil

A vim's normal-mode implementation for EWOW
AutoHotkey
3
star
52

code8903

A coding font based on JISZ8903
Makefile
2
star
53

zombie

Major mode for editing ZOMBIE programs
Emacs Lisp
2
star
54

KP-19

A 'meishi'-sized experimental 4-keypad with audio-sync lightshow
Shell
2
star
55

ewow-autopair

An autopair extension for EWOW
AutoHotkey
2
star
56

keyboard-acrylic-case-tutorial

Materials for tutorial
OpenSCAD
2
star
57

symon-lingr

A notification-based Lingr client powered by symon.el
Emacs Lisp
2
star
58

cssdebug

Simple css layout debugger in pure js
JavaScript
2
star
59

smallworld-visualizer

[Web] Visualizer for building a deck with the card smallworld
TypeScript
2
star
60

kusocolla-republic

背景抜き太郎
JavaScript
1
star
61

negaposi-slicer

Slice images with pixel value
JavaScript
1
star
62

dired-explore

MS Explorer-like incremental search for dired
Emacs Lisp
1
star
63

parametric-key-layout-model

A parametric OpenSCAD model for previewing keyboard layouts
OpenSCAD
1
star
64

git-submodule-update-checker

[Git] Command-line tool for checking submodule updates in batch mode
Emacs Lisp
1
star
65

lambda_to_lazyk

A Lambda Calculus to Lazy K translator
1
star
66

phi-search-dired

Interactive filtering for dired powered by phi-search
Emacs Lisp
1
star
67

slack-to-gcal

Slack slash command to manage Google Calendar events and tasks
JavaScript
1
star
68

affinity-keyboard

A 4x4 macro-pad with a spectrum analyzer IC
Shell
1
star
69

ewow-stickyshift

A stickyshift-key for EWOW
AutoHotkey
1
star
70

glcdfont-tracer

[Keyboard/WIP] glcdfont editor
JavaScript
1
star
71

shingengo-font

[Font] Shingengo font daisuki!!
1
star
72

keyboard-buildguide-common

tips for building diy keyboards
1
star
73

ewow-keychord

A keychord extension for EWOW
AutoHotkey
1
star
74

git-complete-company

git-complete backend for company
Emacs Lisp
1
star
75

ewow-mouse

A mouse control extension based on binary-search, for EWOW.
AutoHotkey
1
star
76

trance-vibrator-resuscitator

Drive ASCII trance vibrator in sync with audio
JavaScript
1
star
77

include-anywhere

Include from anywhere
Emacs Lisp
1
star
78

MJ-4PP-9-breakout

MJ-4PP-9 breakout for breadboards
Shell
1
star
79

morpho-keyboard

An experimental keyboard for tasting multiple layouts with hot-swapping sockets
Shell
1
star
80

commentize-conflict

Minor mode to treat git conflict markers and their changes as comment
Emacs Lisp
1
star
81

acrylic-block-hikaruino

Hikaruino!
Shell
1
star
82

git-multiple-stashes

[Git] Multiple stashes for git
1
star
83

key-combo-web

Per-language key(-combo) bindings for web-mode
Emacs Lisp
1
star
84

shuffle-simulator

WIP Deck shuffle simulator
HTML
1
star
85

alc-tracker

Track drinking activity from within a slack channel
JavaScript
1
star
86

auto-pr

GitHub Action which automatically creates PR to keep a branch in sync with another
JavaScript
1
star
87

show-eof-mode

[Emacs] Minor mode to show [EOF] indicator
Emacs Lisp
1
star