Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

fix: 노트 테두리 투명도·일괄 테두리색 표시·시간 해상도 버그 수정 (#81)#82

Open
eun-yeon wants to merge 6 commits into
master from
fix/issue-81-note-bugs
Open

fix: 노트 테두리 투명도·일괄 테두리색 표시·시간 해상도 버그 수정 (#81) #82
eun-yeon wants to merge 6 commits into
master from
fix/issue-81-note-bugs

Conversation

@eun-yeon

@eun-yeon eun-yeon commented Jun 22, 2026

Copy link
Copy Markdown
Member

개요

@wtre 님이 제보해주신 노트 관련 버그 3개 수정 (#81)

1. 노트 테두리 색 투명도가 동작 안 함

테두리 색 피커에 알파 슬라이더가 보이는데 아무리 내려도 100으로 고정되고, 게다가 테두리 투명도가 노트 배경 투명도에 딸려가서 "배경 투명 + 테두리만 보이는 직사각형"을 못 만드는 상태

noteBorderColor#RRGGBB hex 계약이라 피커가 준 rgba(...)의 알파를 저장 단계에서 버리고 있었고, 셰이더도 테두리 알파를 baseColor.a * borderMask로 계산하고 있어서 배경(노트) 투명도에 그대로 종속됐습니다. 그래서 테두리 알파를 독립적으로 줄 방법이 아예 없었던 것 같네요.

2. 다중 선택으로 테두리 색 바꿀 때 선택 색이 안 보임

여러 키 선택 후 테두리 색을 바꾸면 고른 색이 스와치/미리보기에 제대로 안 뜨는 문제. 저장 자체는 됐는데, 배치 스와치가 피커 닫혀 있을 때도 실제 공통값이 아니라 직전 로컬 상태를 표시하고 있었고, 색 바꾸는 도중 라이브 preview dispatch가 빠져 있어서 노트색/글로우색과 달리 테두리만 즉시 반영이 안 됐어요.

3. 노트 표시 위치 시간 해상도가 주사율/OBS fps에 종속

프레임 제한을 0으로 둬도 노트 시작 위치의 시간 해상도가 모니터 주사율(OBS는 OBS fps)에 묶이던 문제

키 입력은 폴링레이트로 정확하게 받는데, 정작 노트 생성을 requestAnimationFrame 안에서 처리하면서 startTime이 그 프레임의 performance.now()로 찍힌 것 같습니다. 그래서 프레임 사이 어디서 눌렀든 노트 시작이 프레임 경계로 스냅됨, OBS browser source는 CEF 오프스크린 렌더라 rAF 자체가 OBS fps(windowless_frame_rate)에 묶여서 더 눈에 띈 상태였습니다.

변경 내용

백엔드

  • KeyPositionnote_border_opacity(0~100, 기본 100) 추가 — 기존 note_opacity/note_glow_opacity와 동일하게 plain u32라 기존 저장값은 default로 그대로 호환
  • keys:state payload에 eventAgeMs(입력 수신~emit 경과 ms) 추가 — Instant로 측정

프론트엔드

1. 테두리 투명도 분리

  • noteBorderOpacity zod 스키마 + 노트 버퍼에 별도 noteBorderOpacity 속성, WebGL 셰이더에 독립 알파 채널(borderAlpha = vBorderOpacity * borderMask)로 노트 배경 알파에서 분리
  • 테두리 색 피커가 버리던 알파를 noteBorderOpacity로 캡처하도록 변경(단일/배치 동일) 색은 hex 계약 유지
  • colorUtilsparseAlphaPercent/hexWithAlphaPercent 유틸 추가

2. 배치 테두리 색 표시/미리보기

  • 노트색/글로우색과 같은 getBatchBorderColorDisplay() 헬퍼로 공통값/Mixed 표시 통일
  • 색 변경 중 라이브 preview dispatch 추가

3. 입력 시각 기반 노트 시작

  • 오버레이에서 rAF 래핑 제거하고 performance.now() - eventAgeMs로 실제 입력 시각을 복원해 노트 startTime에 반영 → 시작 위치가 프레임 경계에 양자화되지 않음
  • delayed 노트 타이머는 max(0, ...)로 clamp, eventAgeMs도 0~250ms로 clamp(백엔드 stall/클럭 이상 방어)
  • 플러그인 API 문서(onKeyState) en/ko 동기화

테스트

  • 테두리 투명도 50%로 내렸을 때 테두리만 반투명, 노트 배경 투명도 0 + 테두리 100으로 "테두리만 보이는 직사각형" 정상 렌더 확인
  • 다중 선택 테두리 색 변경 시 스와치/미리보기 즉시 반영, 공통값/Mixed 표시 확인
  • 연타 시 노트 시작 위치가 입력 간격대로 분포(프레임 경계 스냅 없음), 키 딜레이 옵션 켠 상태 회귀 없음
  • 기존 저장값 로드 시 테두리 투명도 100으로 호환 확인
  • tsc --noEmit / eslint / prettier / cargo check / cargo clippy / 프로덕션 빌드 통과

시작 위치 양자화는 없앴지만, OBS browser source는 구조상 매 프레임 위치 갱신의 해상도가 OBS fps를 넘진 못해요(CEF OSR이라 브라우저가 더 자주 그려도 OBS가 안 받음) OBS 모드에선 browser source FPS를 60으로 맞추는 걸 권장

eun-yeon added 6 commits June 21, 2026 22:18
배치 테두리 스와치가 피커가 닫혀 있을 때도 실제 공통값이 아닌 직전
로컬 상태(batchLocalColors.borderColor)를 표시하던 문제 수정. 노트색/
글로우색과 동일하게 getBatchBorderColorDisplay 헬퍼로 공통값/Mixed를
표시하도록 통일. 또한 색 변경 중 라이브 미리보기 dispatch가 누락돼 있어
선택 색이 즉시 반영되지 않던 것도 수정
테두리 색이 #RRGGBB hex만 저장돼 색 피커의 알파가 버려지고, 셰이더가
borderAlpha = baseColor.a * borderMask로 계산해 테두리 투명도가 노트 배경
투명도에 종속되던 문제 수정. 테두리만 있는 직사각형(배경 투명+테두리 불투명)을
만들 수 없었음
- noteBorderOpacity(0~100) 필드 추가: Rust 모델(기본 100), zod, 노트 버퍼의
 별도 noteBorderOpacity attribute, WebGL 셰이더에 독립 알파 채널
- 셰이더 borderAlpha를 baseColor.a 대신 vBorderOpacity 사용
- 테두리 색 피커의 알파 슬라이더 값을 버리지 않고 noteBorderOpacity로 캡처
 (단일/배치 모두). 색은 hex 계약 유지
- colorUtils에 parseAlphaPercent/hexWithAlphaPercent 헬퍼 + 테스트
키 입력이 requestAnimationFrame 안에서 처리돼 노트 생성 시각이 프레임
경계로 양자화되면서, 프레임 제한을 0으로 둬도 노트 표시 위치의 시간
해상도가 주사율(OBS는 OBS fps)에 종속되던 문제 수정
- 백엔드 keys:state payload에 eventAgeMs(입력 수신~emit 경과 ms) 추가
- 오버레이가 performance.now() - eventAgeMs로 실제 입력 시각을 복원해
 노트 startTime에 반영. RAF 래핑 제거로 프레임 양자화 제거
- 절대 시각 공유 대신 상대 age를 전달해 Rust/JS·OBS 시간축 차이 회피
- 딜레이 노트 타이머는 max(0, ...)로 clamp
- 공개 플러그인 API(onKeyState) 문서 en/ko 동기화
OBS browser source 타이밍 리서치 반영. 백엔드 stall이나 클럭 이상으로
eventAgeMs가 비정상적으로 커질 경우 노트가 화면 위로 튀는 것을 방지하기 위해
0~250ms로 clamp
코드 리뷰 반영. noteBorderOpacity가 삽입 시프트/단일 release/clear 경로에서
해당 노트에 올바르게 따라붙는지 검증하는 테스트 추가
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Reviewers

No reviews

Assignees

No one assigned

Labels

None yet

Projects

None yet

Milestone

No milestone

Development

Successfully merging this pull request may close these issues.

1 participant

AltStyle によって変換されたページ (->オリジナル) /