Example #1
0
 private List<FingerTrace> GetTraces(CurrentNoteRendering r)
 {
     List<FingerTrace> traces = new List<FingerTrace>();
     foreach (var trace in r.missed) {
         FingerTrace ft = new FingerTrace();
         foreach (var p in trace.points) {
             CorePoint cp = new CorePoint(new Vector3(p.x, fallingSpeed * chart.bpm * (float)(p.time), 0), Vector3.UnitY, Vector3.UnitZ, p.force, new Color(0.5f, 0.5f, 0.5f, 0.7f));
             ft.points.Add(cp);
         }
         traces.Add(ft);
     }
     foreach (var trace in r.inProgress)
     {
         FingerTrace ft = new FingerTrace();
         foreach (var p in trace.points)
         {
             CorePoint cp = new CorePoint(new Vector3(p.x, fallingSpeed * chart.bpm * (float)(p.time), 0), Vector3.UnitY, Vector3.UnitZ, p.force, Color.Yellow);
             ft.points.Add(cp);
         }
         traces.Add(ft);
     }
     foreach (var trace in r.future)
     {
         FingerTrace ft = new FingerTrace();
         foreach (var p in trace.points)
         {
             CorePoint cp = new CorePoint(new Vector3(p.x, fallingSpeed * chart.bpm * (float)(p.time), 0), Vector3.UnitY, Vector3.UnitZ, p.force, Color.LightBlue);
             ft.points.Add(cp);
         }
         traces.Add(ft);
     }
     return traces;
 }
Example #2
0
        public CurrentNoteRendering FeedInstant(float[] fingers, double time, double futureTime, TimeSpan passed)
        {
            var assignments = new int[fingers.Length];

            var inProgressIntersect = new List<RawNotePoint>();
            foreach (RawNoteTrace trace in inProgress) {
                inProgressIntersect.Add(NoteChart.Interpolate(trace, time));
            }

            for (int i = 0; i < fingers.Length; i++) {
                float finger = fingers[i];
                int bestTrace = -1;
                for (int index = 0; index < inProgressIntersect.Count; index++) {
                    RawNotePoint point = inProgressIntersect[index];
                    if (Math.Abs(point.x - finger) < DISTANCE_THRESHOLD) {
                        bestTrace = index;
                    }
                }
                assignments[i] = bestTrace;
            }
            var inProgressHit = new bool[inProgress.Count];
            foreach (int assignment in assignments) {
                if (assignment != -1)
                    inProgressHit[assignment] = true;
            }
            for (int i = 0; i < inProgress.Count; i++) {
                RawNoteTrace trace = inProgress[i];
                if (!inProgressHit[i] && trace.LastTime - time > FAIL_TIME_THRESHOLD / bpm) {
                    inProgress.Remove(trace);
                    missed.Add(trace);
                }
                else {
                    score += passed.TotalMinutes*bpm * 1000;
                    if (trace.LastTime < time) {
                        inProgress.Remove(trace);
                        completed.Add(trace);
                    }
                }
            }
            var toRemove = new List<RawNoteTrace>();
            foreach (RawNoteTrace trace in future) {
                if (trace.FirstTime < time - FAIL_TIME_THRESHOLD/bpm) {
                    toRemove.Add(trace);
                    missed.Add(trace);
                }
                else if (trace.FirstTime < time) {
                    foreach (float finger in fingers) {
                        if (Math.Abs(finger - trace.points[0].x) < DISTANCE_THRESHOLD) {
                            // hit!
                            score += 1000;
                            inProgress.Add(trace);
                            toRemove.Add(trace);
                            break;
                        }
                    }
                }
            }
            foreach (RawNoteTrace trace in toRemove) {
                future.Remove(trace);
            }

            var result = new CurrentNoteRendering();
            result.missed = new List<RawNoteTrace>();
            result.inProgress = new List<RawNoteTrace>();
            result.future = new List<RawNoteTrace>();
            foreach (RawNoteTrace trace in missed) {
                if (trace.LastTime > time - 10/bpm) {
                    result.missed.Add(trace);
                }
            }
            foreach (RawNoteTrace trace in inProgress) {
                result.inProgress.Add(trace.CutOff(time));
            }
            foreach (RawNoteTrace trace in future) {
                if (trace.FirstTime < time + 10/bpm) {
                    result.future.Add(trace);
                }
            }
            return result;
        }