-
-
Notifications
You must be signed in to change notification settings - Fork 110
Open
Conversation
배치 테두리 스와치가 피커가 닫혀 있을 때도 실제 공통값이 아닌 직전 로컬 상태(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 경로에서 해당 노트에 올바르게 따라붙는지 검증하는 테스트 추가
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
개요
@wtre 님이 제보해주신 노트 관련 버그 3개 수정 (#81)
1. 노트 테두리 색 투명도가 동작 안 함
테두리 색 피커에 알파 슬라이더가 보이는데 아무리 내려도 100으로 고정되고, 게다가 테두리 투명도가 노트 배경 투명도에 딸려가서 "배경 투명 + 테두리만 보이는 직사각형"을 못 만드는 상태
noteBorderColor가#RRGGBBhex 계약이라 피커가 준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)에 묶여서 더 눈에 띈 상태였습니다.변경 내용
백엔드
KeyPosition에note_border_opacity(0~100, 기본 100) 추가 — 기존note_opacity/note_glow_opacity와 동일하게 plainu32라 기존 저장값은 default로 그대로 호환keys:statepayload에eventAgeMs(입력 수신~emit 경과 ms) 추가 —Instant로 측정프론트엔드
1. 테두리 투명도 분리
noteBorderOpacityzod 스키마 + 노트 버퍼에 별도noteBorderOpacity속성, WebGL 셰이더에 독립 알파 채널(borderAlpha = vBorderOpacity * borderMask)로 노트 배경 알파에서 분리noteBorderOpacity로 캡처하도록 변경(단일/배치 동일) 색은 hex 계약 유지colorUtils에parseAlphaPercent/hexWithAlphaPercent유틸 추가2. 배치 테두리 색 표시/미리보기
getBatchBorderColorDisplay()헬퍼로 공통값/Mixed 표시 통일3. 입력 시각 기반 노트 시작
performance.now() - eventAgeMs로 실제 입력 시각을 복원해 노트startTime에 반영 → 시작 위치가 프레임 경계에 양자화되지 않음max(0, ...)로 clamp,eventAgeMs도 0~250ms로 clamp(백엔드 stall/클럭 이상 방어)onKeyState) en/ko 동기화테스트
tsc --noEmit/ eslint / prettier /cargo check/cargo clippy/ 프로덕션 빌드 통과