225 lines
4.9 KiB
Plaintext
225 lines
4.9 KiB
Plaintext
// Copyright (c) 2017-2018 Xiamen Yaji Software Co., Ltd.
|
||
|
||
CCEffect %{
|
||
techniques:
|
||
- passes:
|
||
- vert: vs
|
||
frag: fs
|
||
blendState:
|
||
targets:
|
||
- blend: true
|
||
rasterizerState:
|
||
cullMode: none
|
||
properties:
|
||
texture: { value: white }
|
||
u_arc_color: {
|
||
value: [1.0, 1.0, 1.0, 1.0],
|
||
editor: {
|
||
type: color,
|
||
tooltip: "圆弧线颜色"
|
||
}
|
||
}
|
||
u_arc_radius: {
|
||
value: 0.3,
|
||
editor: {
|
||
tooltip: "圆弧半径"
|
||
}
|
||
}
|
||
u_arc_line_width: {
|
||
value: 0.1,
|
||
editor: {
|
||
tooltip: "圆弧线宽"
|
||
}
|
||
}
|
||
u_ball_color: {
|
||
value: [1.0, 1.0, 0.0, 1.0],
|
||
editor: {
|
||
type: color,
|
||
tooltip: "小球颜色"
|
||
}
|
||
}
|
||
u_ball_angle: {
|
||
value: 30.0,
|
||
editor: {
|
||
tooltip: "小球所在角度"
|
||
}
|
||
}
|
||
u_ball_angle_range: {
|
||
value: 30.0,
|
||
editor: {
|
||
tooltip: "小球所在角度的夹角范围"
|
||
}
|
||
}
|
||
u_ball_radius: {
|
||
value: 0.05,
|
||
editor: {
|
||
tooltip: "小球半径"
|
||
}
|
||
}
|
||
}%
|
||
|
||
|
||
CCProgram vs %{
|
||
precision highp float;
|
||
|
||
#include <cc-global>
|
||
#include <cc-local>
|
||
|
||
in vec3 a_position;
|
||
in vec4 a_color;
|
||
out vec4 v_color;
|
||
|
||
#if USE_TEXTURE
|
||
in vec2 a_uv0;
|
||
out vec2 v_uv0;
|
||
#endif
|
||
|
||
void main () {
|
||
vec4 pos = vec4(a_position, 1);
|
||
|
||
#if CC_USE_MODEL
|
||
pos = cc_matViewProj * cc_matWorld * pos;
|
||
#else
|
||
pos = cc_matViewProj * pos;
|
||
#endif
|
||
|
||
#if USE_TEXTURE
|
||
v_uv0 = a_uv0;
|
||
#endif
|
||
|
||
v_color = a_color;
|
||
|
||
gl_Position = pos;
|
||
}
|
||
}%
|
||
|
||
|
||
CCProgram fs %{
|
||
precision highp float;
|
||
|
||
#include <cc-global>
|
||
|
||
in vec4 v_color;
|
||
|
||
#if USE_TEXTURE
|
||
in vec2 v_uv0;
|
||
uniform sampler2D texture;
|
||
#endif
|
||
|
||
#if USE_ANTI_ALIAS
|
||
#endif
|
||
|
||
#if USE_LOADING_STYLE
|
||
uniform style{
|
||
|
||
// 圆弧线颜色
|
||
vec4 u_arc_color;
|
||
|
||
// 小球颜色
|
||
vec4 u_ball_color;
|
||
|
||
// 圆弧线宽
|
||
float u_arc_line_width;
|
||
|
||
// 圆弧半径
|
||
float u_arc_radius;
|
||
|
||
// 小球所在角度
|
||
float u_ball_angle;
|
||
|
||
// 小球所在角度的夹角范围
|
||
float u_ball_angle_range;
|
||
|
||
// 小球半径
|
||
float u_ball_radius;
|
||
};
|
||
|
||
|
||
/**
|
||
* 获取 v_uv0 映射后的坐标
|
||
*/
|
||
vec2 getUv0Shadow() {
|
||
// 1. 将 v_uv0 映射到 以 (0.5, 0.5) 为圆心,Y轴向下,X轴向右的坐标系的坐标 uv0
|
||
vec2 uv0 = v_uv0 - vec2(0.5, 0.5);
|
||
|
||
// 2. 将映射后的 uv0 的坐标逆时针旋转一定角度(实际等同于旋转画布)
|
||
|
||
// 这里应用 cc-global.chunk 的 cc_time 参数,实现根据时间不断旋转的功能
|
||
float rotation_angle = u_ball_angle + cc_time.x * 200.0; // * 200 是加快旋转速度
|
||
float rotation_radians = radians(rotation_angle); // 角度转弧度
|
||
vec2 uv0_after_rotation = vec2( // 矩阵旋转
|
||
uv0.x * cos(rotation_radians) - uv0.y * sin(rotation_radians),
|
||
uv0.x * sin(rotation_radians) + uv0.y * cos(rotation_radians)
|
||
);
|
||
|
||
return uv0_after_rotation;
|
||
}
|
||
|
||
/**
|
||
* 画圆弧
|
||
*
|
||
* 原理基于纹理中心,并且0角度先画圆弧,然后在旋转画布
|
||
*/
|
||
vec4 getArcColor() {
|
||
vec2 uv0 = getUv0Shadow();
|
||
|
||
// 求圆边范围
|
||
float len = length(uv0);
|
||
float min_radius = u_arc_radius - u_arc_line_width * 0.5;
|
||
float max_radius = u_arc_radius + u_arc_line_width * 0.5;
|
||
if (len >= min_radius && len <= max_radius) {
|
||
|
||
// 求(圆)缺口范围
|
||
float radian = acos(uv0.x / len);
|
||
float radian_range = radians(u_ball_angle_range * 0.5);
|
||
if (radian >= radian_range) {
|
||
float alpha = 1.0;
|
||
// 抗锯齿
|
||
#if USE_ANTI_ALIAS
|
||
alpha = smoothstep(0.0, 0.05, 1.0 - abs(len - u_arc_radius) / (u_arc_line_width * 0.5));
|
||
#endif
|
||
|
||
// 非缺口范围内画圆弧
|
||
return u_arc_color * alpha;
|
||
}
|
||
}
|
||
return vec4(0.0, 0.0, 0.0, 0.0);
|
||
}
|
||
|
||
/**
|
||
* 画小球
|
||
*/
|
||
vec4 getBallColor() {
|
||
vec2 uv0 = getUv0Shadow();
|
||
vec2 ball_center_point = vec2(u_arc_radius, 0);
|
||
|
||
// cos 控制小球半径不断缩放
|
||
float ball_radius = u_ball_radius + u_ball_radius * 0.3 * cos(radians(cc_time.x * 200.0));
|
||
float dis = distance(uv0, ball_center_point);
|
||
if (dis <= ball_radius) {
|
||
|
||
float alpha = 1.0;
|
||
// 抗锯齿
|
||
#if USE_ANTI_ALIAS
|
||
alpha = smoothstep(0.0, 0.01, ball_radius - dis);
|
||
#endif
|
||
|
||
return u_ball_color * alpha;
|
||
} else{
|
||
return vec4(0.0, 0.0, 0.0, 0.0);
|
||
}
|
||
}
|
||
|
||
#endif
|
||
|
||
void main () {
|
||
vec4 o = vec4(1, 1, 1, 1);
|
||
gl_FragColor = o;
|
||
#if USE_LOADING_STYLE
|
||
vec4 arc_color = getArcColor();
|
||
vec4 ball_color = getBallColor();
|
||
gl_FragColor = ball_color * ball_color.a + arc_color;
|
||
#endif
|
||
}
|
||
}%
|